从Excel VBA调用屏幕键盘

时间:2018-04-14 01:22:52

标签: excel vba excel-vba

我正在尝试编写一些Excel VBA来启动屏幕键盘。我尝试了各种方法无济于事。以下是我到目前为止的尝试:

' Only needed for Test3
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

Sub Test1()

    ' Run-time error'53':
    ' File Not found
    Dim RetVal As Variant
    RetVal = Shell("C:\WINDOWS\system32\osk.exe", 1)

End Sub

Sub Test2()

    ' Run-time error '432':
    ' File name or class name not found during Automation operation
    ActiveWorkbook.FollowHyperlink Address:="C:\Windows\System32\osk.exe"

End Sub

Sub Test3()

    ' No error. Nothing happens at all
    ShellExecute 0, vbNullString, "osk.exe", vbNullString, "C:\", 1

End Sub

Test2我来自this forum。 Test3我来自this forum

我已经检查过以确保osk.exe的路径是正确的,所以我知道它不是那样的。我有Surface笔记本电脑/平板电脑,所以它有一个触摸屏和一个“触摸”键盘(不同于osk),所以我想知道这可能是导致问题的原因吗?或者可能是Windows 10的东西?

1 个答案:

答案 0 :(得分:2)

在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 Declare Function Wow64EnableWow64FsRedirection Lib "kernel32.dll" (ByVal Enable As Boolean) As Boolean

Private Sub RunOsk_on64Bit()
Const SW_SHOWNORMAL = 1
    On Error Resume Next
    Wow64EnableWow64FsRedirection False
    ShellExecute 0, "open", "osk.exe", "", "C:\windows\system32\osk.exe", SW_SHOWNORMAL 
    Wow64EnableWow64FsRedirection True
End Sub

找到here,这可能是解释,引自链接

  
    

这是64位操作系统的问题,它会影响任何64位版本的Windows。

  
     

基本上你是在调用osk.exe,但是你正在调用它的程序   来自一个32位的应用程序。 Windows不允许您调用64位OSK.exe   来自你的程序。任何人,这些评论似乎都错过了你的观点   可以从Run启动osk.exe,但可以从32位内调用它   应用程序无法在64位Windows中运行。

     

我正在开发使用屏幕键盘的软件   解决方法是Wow64DisableWow64FsRedirection。

更新:“更好”的版本可能看起来像

Option Explicit

Type SHELLEXECUTEINFO
    cbSize As Long
    fMask As Long
    hwnd As Long
    lpVerb As String
    lpFile As String
    lpParameters As String
    lpDirectory As String
    nShow As Long
    hInstApp As Long
    lpIDList As Long
    lpClass As String
    hkeyClass As Long
    dwHotKey As Long
    hIcon As Long
    hProcess As Long
End Type

Public Declare Function ShellExecuteEx Lib "shell32.dll" _
                                       (lpExecInfo As SHELLEXECUTEINFO) As Long


Declare Function Wow64DisableWow64FsRedirection Lib "kernel32.dll" (ByRef ptr As Long) As Boolean
Declare Function Wow64RevertWow64FsRedirection Lib "kernel32.dll" (ByRef ptr As Long) As Boolean


Public Function KeyboardOpen()
  Dim shInfo As SHELLEXECUTEINFO
  Dim lngPtr As Long

   With shInfo
      .cbSize = Len(shInfo)
      .lpFile = "C:\Windows\Sysnative\cmd.exe" 'best to use Known folders here
      .lpParameters = "/c start osk.exe"
      .lpDirectory = "C:\windows\system32" 'best to use Known folders here
      .lpVerb = "open"
      .nShow = 0
   End With
   Call Wow64DisableWow64FsRedirection(lngPtr)
   Call ShellExecuteEx(shInfo)
   Call Wow64RevertWow64FsRedirection(lngPtr)
End Function

根据MSDN中的信息,使用Wow64DisableWow64FsRedirection和Wow64RevertWow64FsRedirection函数可能更可靠。