Ryan Buton
Ryan Buton

Reputation: 351

How to start the On-screen keyboard program from within a VB-6 legacy application

I am trying to 'shell osk.exe' from within my VB-6 application on a Windows 10-32 or Windows 10-64 bit machine.

In the past we have simply used :

Private Sub Command1_Click()
Dim strTemp As String
Dim fso1 As New FileSystemObject
strTemp = fso1.GetSpecialFolder(SystemFolder) & "\osk.exe"

Dim lngReturn As Long
Let lngReturn = ShellExecute(Me.hwnd, "Open", strTemp, vbNullString, "C:\", SW_SHOWNORMAL)

lblReturn.Caption = CStr(lngReturn)

end sub

We have also used the simpler 'shell' command as well; neither work.

And in the past this worked fine. We could also open NotePad, msPaint and some other utilities from within our program. We use an industrial touchscreen PC and for convenience we placed some buttons on our 'settings' page to quickly access these type of helper programs. I do not want to wait on the program, our code has it's own 'touchscreen keyboard'. The users will only use the Windows OSK when they want to perform some work outside of our main application.

For Windows XP all of these programs would open fine. Now for Windows 10, only the OSK.exe program will not start. Looking at the return code, the error returned is a '2'- File Not Found (I assume). But looking in the c:\windows\system32 folder the file 'osk.exe' is there along with mspaint.exe and notepad.exe .

Is there some Windows setting that is hiding the real osk.exe from my program?

Thanks for any suggestions.

Upvotes: 6

Views: 2610

Answers (1)

C-Pound Guru
C-Pound Guru

Reputation: 16368

On my 64-bit Windows 10, your code behaves as you said. It looks like on 64-bit windows you have to disable WOW 64 redirection:

Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
    ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Const SW_SHOWNORMAL = 1

Private Declare Function Wow64EnableWow64FsRedirection Lib "kernel32.dll" (ByVal Enable As Boolean) As Boolean '// ****Add this****

Private Sub Command1_Click()
    Dim fso1 As New FileSystemObject
    Dim strTemp As String

    strTemp = fso1.GetSpecialFolder(SystemFolder) & "\osk.exe"

    Dim lngReturn As Long
    Wow64EnableWow64FsRedirection False '// ****Add this****
    Let lngReturn = ShellExecute(Me.hwnd, "open", strTemp, vbNullString, "C:\", SW_SHOWNORMAL)
    Wow64EnableWow64FsRedirection True '// ****Add this****
    lblReturn.Caption = CStr(lngReturn)
End Sub

This code works like a charm on Windows 10 64-bit. Also tested on Windows 10 32-bit...works there as well.

Upvotes: 5

Related Questions