Excel CreateProcess未检索OSK的正确PID

Excel CreateProcess未检索OSK的正确PID,excel,vba,createprocess,on-screen-keyboard,Excel,Vba,Createprocess,On Screen Keyboard,在Windows 7中,以下Excel VBA 7.1代码段成功启动了屏幕键盘(OSK.EXE),但从“proc”(进程信息)参数(passed ByRef)检索的dwProcessID成员的值与任务管理器显示的值或任何其他PID不匹配 Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessID As Long ' Integer doesn't work either dwT

在Windows 7中,以下Excel VBA 7.1代码段成功启动了屏幕键盘(OSK.EXE),但从“proc”(进程信息)参数(passed 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
类型进程信息
hProcess尽可能长
hThread尽可能长
dwProcessID As Long“Integer也不起作用
dwThreadID尽可能长
端型
声明函数CreateProcessA Lib“kernel32”(ByVal_
lpApplicationName为Long,ByVal lpCommandLine为String,ByVal_
lpProcessAttributes为Long,ByVal lpThreadAttributes为Long_
ByVal bInheritHandles尽可能长,ByVal dwCreationFlags尽可能长_
ByVal lpEnvironment为Long,ByVal lpCurrentDirectory为Long_
ByRef lpStartupInfo作为STARTUPINFO,ByRef lpProcessInformation作为STARTUPINFO_
尽可能长地处理信息
作为过程信息的Dim proc
将启动设置为STARTUPINFO
start.cb=Len(开始)
如果CreateProcessA(0,“OSK.EXE”,0,0,1,正常优先级\u类,0,0,开始,
proc)0那么
WaitForInputdle进程,无限
MsgBox CStr(proc.dwProcessID),vbInformation,“进程ID”错误
OSK,但适用于记事本和计算器
CloseHandle(proc.hProcess)
CloseHandle(proc.hThread)
如果结束
对于OSK,proc.hProcess值似乎不正确。我将proc.dwProcessID的进程ID值与任务管理器中为OSK列出的PID进行了检查,但它们不匹配。事实上,proc.dwProcessID并没有为任何进程列出(甚至在process Explorer中),因此似乎该进程信息类型没有收到正确的输出

不过,对于记事本和计算器来说,一切都很好。在VB.NET中编译的等效代码在OSK中运行正常,那么VBA有什么不同之处导致CreateProcessA在OSK中无法正常工作

提前感谢,,
John。

可能是您正在启动的可执行文件(OSK.EXE)执行另一个进程,或者执行某些作业并很快退出,因此当您在process explorer中查找时,您找不到任何内容。
如果“If”中的代码未执行,我将尝试使用GetLastError调用获取错误。

我认为您遇到了如下问题。 Long不是指针的好替代品,在这种情况下应该是


输入进程信息
hprocessalongptr
hThread As LongPtr
dwProcessID尽可能长
dwThreadID尽可能长
端型

声明函数CreateProcessA Lib“kernel32”(ByVal_ lpApplicationName作为LongPtr,ByVal lpCommandLine作为String,ByVal_ lpProcessAttributes作为LongPtr,ByVal lpThreadAttributes作为LongPtr_ ByVal bInheritHandles尽可能长,ByVal dwCreationFlags尽可能长_ ByVal lpEnvironment作为LongPtr,ByVal lpCurrentDirectory作为LongPtr_ ByRef lpStartupInfo作为STARTUPINFO,ByRef lpProcessInformation作为STARTUPINFO_ 尽可能长地处理信息


另请参见

谢谢您的建议。“if”语句中的代码被执行,OSK仍按要求运行,但CreateProcess为OSK生成的句柄与任务管理器中显示的不同。未标记任何错误。如果在VB.NET中编译,相同的代码会正常运行,因此问题似乎与VBA运行方式的不同有关。