В Windows 7, следующий фрагмент Excel VBA 7.1 успешно запускает экранную клавиатуру (OSK.EXE), но значение члена dwProcessID, полученное из параметра proc (информация о процессе) (передано ByRef), не совпадаетэто или любой другой 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 неверно.Я проверил значение идентификатора процесса proc.dwProcessID с идентификатором PID, указанным для OSK в диспетчере задач, и они не совпадают.Действительно, proc.dwProcessID не указан ни для одного процесса (даже в Process Explorer), поэтому кажется, что тип PROCESS_INFORMATION не получает правильные выходные данные.
Все отлично работает для NOTEPAD и CALC.Эквивалентный код, скомпилированный в VB.NET, работает правильно с OSK, так что же отличает VBA от неправильной работы CreateProcessA с OSK?
Заранее спасибо, Джон.