【发布时间】:2018-12-06 15:13:19
【问题描述】:
在 Windows 7 中,以下 Excel VBA 7.1 sn-p 成功启动了屏幕键盘 (OSK.EXE),但从“proc”(进程信息)参数(通过 ByRef)检索到的 dwProcessID 成员的值没有与任务管理器显示的那个或任何其他 PID 不匹配。
Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long ' Integer doesn't work either
dwThreadID As Long
End Type
Declare Function CreateProcessA Lib "kernel32" (ByVal _
lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
ByRef lpStartupInfo As STARTUPINFO, ByRef lpProcessInformation As _
PROCESS_INFORMATION) As Long
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
start.cb = Len(start)
If CreateProcessA(0, "OSK.EXE", 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, 0, start,
proc) <> 0 Then
WaitForInputIdle proc.hProcess, INFINITE
MsgBox CStr(proc.dwProcessID), vbInformation, "Process ID" ' Wrong for
OSK, but correct for Notepad and Calc
CloseHandle (proc.hProcess)
CloseHandle (proc.hThread)
End If
对于 OSK,proc.hProcess 的值似乎不正确。我根据任务管理器中为 OSK 列出的 PID 检查了 proc.dwProcessID 的进程 ID 值,但它们不匹配。实际上,没有为任何进程列出 proc.dwProcessID(即使在 Process Explorer 中),因此 PROCESS_INFORMATION 类型似乎没有收到正确的输出。
不过,对于 NOTEPAD 和 CALC,一切正常。在 VB.NET 中编译的等价代码在 OSK 中正常运行,那么 VBA 有什么不同导致 CreateProcessA 无法在 OSK 中正常运行?
提前致谢, 约翰。
【问题讨论】:
标签: excel vba createprocess on-screen-keyboard