如何修改VBA代码以在64位Excel(Windows 10 64位系统)中打开屏幕键盘(osk.exe)
在64位Excel VBA中打开屏幕键盘(osk.exe)的解决方案
我帮你调整了代码,适配64位Excel环境,同时简化了不必要的操作。下面是修改后的完整代码,以及关键调整点的说明:
关键修改点
- 移除Wow64文件系统重定向相关代码:64位Excel本身运行在64位Windows的原生环境中,不需要
Wow64DisableWow64FsRedirection和Wow64RevertWow64FsRedirection这两个API——这些是给32位程序在64位系统里访问64位系统目录用的,64位程序直接访问System32就是正确的目录。 - 修正SHELLEXECUTEINFO结构的类型:把结构里多个原
Long类型的指针字段改为LongPtr,比如hProcess、hInstApp等,因为64位环境下指针类型需要用LongPtr保证兼容性。 - 简化执行逻辑:直接调用
osk.exe,不需要通过cmd.exe中转,让代码更简洁高效。
修改后的完整代码
Option Explicit Type SHELLEXECUTEINFO cbSize As LongPtr fMask As Long hwnd As LongPtr lpVerb As String lpFile As String lpParameters As String lpDirectory As String nShow As Long hInstApp As LongPtr ' 原Long改为LongPtr,适配64位指针 lpIDList As LongPtr ' 原Long改为LongPtr lpClass As String hkeyClass As LongPtr ' 原Long改为LongPtr dwHotKey As Long hIcon As LongPtr hProcess As LongPtr ' 关键修改:原Long改为LongPtr End Type Public Declare PtrSafe Function ShellExecuteEx Lib "shell32.dll" _ (lpExecInfo As SHELLEXECUTEINFO) As LongPtr Public Function KeyboardOpen() Dim shInfo As SHELLEXECUTEINFO With shInfo .cbSize = Len(shInfo) .lpFile = Environ("WINDIR") & "\System32\osk.exe" ' 自动获取系统目录,适配不同配置 .lpVerb = "open" .nShow = 1 ' 让屏幕键盘窗口正常显示 End With Call ShellExecuteEx(shInfo) End Function Sub OpenKeyboard() Call KeyboardOpen End Sub
额外说明
- 如果你的场景依然需要通过
cmd.exe中转(比如有特殊参数需求),可以把lpFile设为"cmd.exe",lpParameters设为"/c start osk.exe",同时nShow设为0隐藏cmd窗口,但直接调用osk.exe更高效。 Environ("WINDIR")会自动获取系统安装目录(比如C:\Windows),比硬编码路径更适配不同系统配置。
内容的提问来源于stack exchange,提问作者Jonathan Walker
相关产品推荐
相关产品推荐

