Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从excelvba调用屏幕键盘_Vba_Excel - Fatal编程技术网

从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会更困难呢?