从excelvba调用屏幕键盘
我正试图打开屏幕键盘。从excelvba调用屏幕键盘,vba,excel,Vba,Excel,我正试图打开屏幕键盘。 以下是我迄今为止的尝试: ' 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 S
以下是我迄今为止的尝试:
' 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
测试2来自。测试3来自 我检查了osk.exe的路径是否正确。
我有一台Surface笔记本电脑/平板电脑,所以它有一个触摸屏和一个“触摸”键盘(不同于osk)。这就是导致问题的原因吗?或者可能是Windows 10的问题吗?在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
发现,这可能是解释,引用链接
这是64位操作系统的问题,它会影响任何64位版本的Windows
基本上,您正在调用osk.exe,但您的程序正在调用它
from是一款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
根据中的信息,使用WOW64禁用WOW64FSRedirection和Wow64RevertWow64FsRedirection函数可能更可靠。在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
发现,这可能是解释,引用链接
这是64位操作系统的问题,它会影响任何64位版本的Windows
基本上,您正在调用osk.exe,但您的程序正在调用它
from是一款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
根据其中的信息,使用Wow64DisableWow64FsRedirection和Wow64RevertWow64FsRedirection函数可能更可靠。对于使用64位的用户,请更改为Private DeclarePtrSafe@QHarr:如果使用64位版本的Excel,则需要对其进行调整,如果您在64位Windows上使用32位Excel,则不会这样做。这非常有效!我做了检查,我正在运行32位Excel,所以我认为这就是问题所在。虽然现在我必须弄清楚如何关闭它,但我知道这有点困难。为什么终止osk.exe会更困难呢?对于那些使用64位更改为私有声明的用户来说PtrSafe@QHarr:如果使用64位版本的Excel,则需要对其进行调整,如果您在64位Windows上使用32位Excel,则不会这样做。这非常有效!我做了检查,我正在运行32位Excel,所以我认为这就是问题所在。虽然现在我必须弄清楚如何关闭它,但我知道这有点困难。为什么终止osk.exe会更困难呢?