如何通过Excel VBA调用屏幕键盘?现有尝试遇运行时错误
解决VBA调用屏幕键盘(osk.exe)的文件未找到问题
看起来你用Shell调用屏幕键盘时遇到了运行时错误53,大概率是因为32位Office在64位系统下的文件重定向问题——系统会把C:\WINDOWS\system32重定向到C:\WINDOWS\SysWOW64,但osk.exe只存在于真正的system32目录里,所以找不到文件。
下面给你几个可行的解决方案:
方案1:用ShellExecute绕过重定向(推荐)
你已经声明了ShellExecute,可以补全代码,同时用环境变量拼接路径避免硬编码,还能处理权限相关的问题:
' 适配32位和64位Office的API声明 #If VBA7 Then Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _ ByVal hWnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _ ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr #Else 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 #End If Sub Test3() Dim result As Variant ' 使用系统环境变量获取正确的系统目录路径 Dim oskPath As String oskPath = Environ("windir") & "\system32\osk.exe" ' 调用屏幕键盘,参数1表示正常显示窗口 result = ShellExecute(0, "open", oskPath, vbNullString, vbNullString, 1) ' 检查调用是否成功(返回值大于32即为成功) If result <= 32 Then MsgBox "调用屏幕键盘失败,错误代码:" & result End If End Sub
方案2:修正Shell方法的路径写法
如果不想用API,可以用环境变量拼接路径,或者通过cmd绕过重定向:
Sub Test1_Fixed() Dim RetVal As Variant ' 方法A:用环境变量获取系统目录,避免硬编码 RetVal = Shell(Environ("windir") & "\system32\osk.exe", 1) ' 方法B:如果还是报错,用cmd的/c参数调用(适配32位Office在64位系统) ' RetVal = Shell("cmd /c start osk.exe", 1) End Sub
方案3:用WScript.Shell对象调用
这是一种更简洁的方式,不需要额外声明API:
Sub Test_WScript() Dim wsh As Object Set wsh = CreateObject("WScript.Shell") ' 调用屏幕键盘,参数1表示正常显示,False表示不等待程序结束 wsh.Run Environ("windir") & "\system32\osk.exe", 1, False Set wsh = Nothing End Sub
额外提示
- 问题主要出在32位Office运行在64位系统的场景,64位Office直接用硬编码路径
C:\WINDOWS\system32\osk.exe就能正常工作。 - 可以在调用前先检查文件是否存在,提前避免报错:
If Dir(Environ("windir") & "\system32\osk.exe") = "" Then MsgBox "屏幕键盘程序不存在!" Exit Sub End If
内容的提问来源于stack exchange,提问作者ddavidd
相关产品推荐
相关产品推荐

