Vb6 如何从VB-6遗留应用程序中启动屏幕键盘程序

Vb6 如何从VB-6遗留应用程序中启动屏幕键盘程序,vb6,windows-10,exe,Vb6,Windows 10,Exe,我正在尝试在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 Le

我正在尝试在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
我们还使用了更简单的“shell”命令;两者都不起作用

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

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

是否有一些Windows设置对我的程序隐藏了真正的osk.exe


谢谢您的建议。

在我的64位Windows 10上,您的代码的行为与您所说的一样。看起来在64位windows上,您必须禁用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

这段代码在64位Windows 10上工作得很好。也在Windows 10上测试了32位…在那里也可以使用。

您可以双击资源管理器中的OSK.exe文件并以这种方式启动它吗?标记,是的,工作正常。我甚至可以从CMD窗口启动它。这非常有效。我不得不在WOW64调用之前加上“On error resume next”,因为该程序仍然必须在XP和Windows 7下运行。(我知道我不需要做两次,但如果有人剪切了n-paste,他们希望在下一行中也能发现错误。)