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 位上运行了。 您似乎随机将一些Longs 替换为LongPtr,您should have not done。请咨询documentation 并使用正确的类型。您还必须在需要时手动提供64-bit padding,并且Declares 也都是错误的。您可以在 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提示由于与64位版本不兼容

Excel VBA 一段宏在64位系统中运行会报错,32位系统运行完美,求解决方案?

Excel 的 Application.Hwnd 属性是不是可用于 64 位 VBA?

切换到 64 位 Excel 后如何修复 VBA“类型不匹配”错误

64 位 Excel VBA 调用 JavaScript 函数

vba模拟键盘操作?