如何从VB-6旧版应用程序中启动屏幕键盘程序

Rya*_*ton 4 vb6 exe windows-10

我正在尝试从Windows 10-32或Windows 10-64位计算机上的VB-6应用程序中'shell osk.exe'。

在过去,我们仅使用:

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
Run Code Online (Sandbox Code Playgroud)

我们还使用了更简单的“ shell”命令。都不行。

在过去,这种方法效果很好。我们还可以从程序中打开NotePad,msPaint和其他实用程序。我们使用工业触摸屏PC,为方便起见,我们在“设置”页面上放置了一些按钮,以快速访问此类帮助程序。我不想等待该程序,我们的代码具有它自己的“触摸屏键盘”。用户仅在想要在我们的主应用程序之外执行某些工作时才使用Windows OSK。

对于Windows XP,所有这些程序都可以正常打开。现在,对于Windows 10,仅OSK.exe程序将无法启动。查看返回代码,返回的错误是“ 2”-找不到文件(我认为)。但是在c:\ windows \ system32文件夹中查找文件“ osk.exe”以及mspaint.exe和notepad.exe。

是否有一些Windows设置从我的程序中隐藏了真实的osk.exe?

感谢您的任何建议。

C-P*_*uru 5

在我的64位Windows 10上,您的代码会像您所说的那样运行。看起来在64位窗口上,您必须禁用WOW 64重定向:

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
Run Code Online (Sandbox Code Playgroud)

这段代码在Windows 10 64位上像超级按钮一样工作。同样在Windows 10 32位上进行了测试...在这里也可以工作。