VBA 在 64 位 Excel 中打开屏幕键盘
Posted
技术标签:
【中文标题】VBA 在 64 位 Excel 中打开屏幕键盘【英文标题】:VBA to open Onscreen keyboard in 64bit Excel 【发布时间】:2021-10-21 02:53:37 【问题描述】:我正在尝试在 Windows 10 64 位的 Excel 64 位中从 VBA 打开 osk.exe。
我拼凑了以下适用于 64 位 Windows 10 上的 32 位 Excel 的代码,但我不知道如何修改它以使其再次适用于 64 位 Excel:
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 Long
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As LongPtr
hProcess As Long
End Type
Public Declare PtrSafe Function ShellExecuteEx Lib "shell32.dll" _
(lpExecInfo As SHELLEXECUTEINFO) As LongPtr
Declare PtrSafe Function Wow64DisableWow64FsRedirection Lib "kernel32.dll" (ByRef ptr As LongPtr) As Boolean
Declare PtrSafe Function Wow64RevertWow64FsRedirection Lib "kernel32.dll" (ByRef ptr As LongPtr) As Boolean
Public Function KeyboardOpen()
Dim shInfo As SHELLEXECUTEINFO
Dim lngPtr As LongPtr
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
Sub OpenKeyboard()
Call KeyboardOpen
End Sub
【问题讨论】:
我使用的是 64 位 Windows 7,而我的 VBA 不喜欢您的 Declare 语句中的关键字PtrSafe
。我必须删除它们,以便编译器停止在这些行上给我错误消息。 VBA 版本 6.5.1020。在 Excel 2007 v12.0.4518.1014
它还在每个 As LongPtr
变量类型定义上给了我“用户定义的类型未定义”错误。在我将它们全部更改为 As Long
后,代码工作并且屏幕键盘打开了!
@Toddleson Windows 的位数与此无关,只有 Office 的位数。您有一个不受支持的 32 位旧 Office,它没有 VBA7、LongPtr 和 PtrSafe。这不是告诉其他人删除这些正确且必要的关键字的理由。就像 OP 提到的那样,这段代码已经在 32 位上运行了。
您似乎随机将一些Long
s 替换为LongPtr
,您should have not done。请咨询documentation 并使用正确的类型。您还必须在需要时手动提供64-bit padding,并且Declare
s 也都是错误的。您可以在 32 位上使用它,因为那里的 LongPtr
等于 Long
。您不会摆脱对 RevertRedirection 的错误调用。
再想一想,这段代码可能永远不会工作,因为ShellExecuteEx
不是 shell32.dll 中存在的函数。您是否有理由不能简单地执行Shell "C:\windows\system32\osk.exe"
或“使用已知文件夹”的版本?
【参考方案1】:
我找到了解决办法。要运行 64 位 Windows 10 屏幕键盘 (osk.exe),请将以下代码添加到 64 位 Excel 的模块中,然后您可以在应用程序中调用 OpenKeyboardSub:
Private Declare PtrSafe 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 OpenKeyboardSub()
ShellExecute 0, vbNullString, "osk.exe", vbNullString, "C:\", 1
End Sub
【讨论】:
以上是关于VBA 在 64 位 Excel 中打开屏幕键盘的主要内容,如果未能解决你的问题,请参考以下文章
Excel VBA 一段宏在64位系统中运行会报错,32位系统运行完美,求解决方案?
Excel 的 Application.Hwnd 属性是不是可用于 64 位 VBA?
切换到 64 位 Excel 后如何修复 VBA“类型不匹配”错误