getProcessId (.. hwnd)에서 ProcessID를 추출 할 수 없습니다 (Pinvoke)
-
16-09-2019 - |
문제
다음 방법을 사용하고 있습니다
[DllImport("kernel32.dll", SetLastError=true)] static extern int GetProcessId(IntPtr hWnd);
실행중인 프로세스를 위해 ProcessID를 얻으려면 내가 가진 유일한 정보는 HWND입니다. 내 문제는 항상 error_invalid_handle 인 오류 코드 6을 반환한다는 것입니다. 나는 매개 변수를 유형 int로 변경할 수 있다고 생각했지만 작동하지 않았습니다. 한 번에 2 개 이상의 인스턴스가 실행될 수 있으므로 실행 프로세스를 열거 할 수 없습니다.
내가 잘못하고 있는지 누구든지 볼 수 있습니까?
NB : 프로세스는 프레임 워크에 노출 된 자동화 객체에서 스폰되며 HWND 속성 만 제공합니다. 아마도 내가 쓴 코드가 처음에 그것을 실행할 책임이 있었기 때문에 ProcessID를 볼 수있는 또 다른 방법이 있습니까?
내 코드는 이것과 비슷한 것 같습니다 ...
AutomationApplication.application extApp = 새로운 자동화 application.application (); extapp.run (); ...
해결책
'AutomationApplication.application'클래스는 무엇입니까? 당신은 그것을 썼습니까? .run ()가 PID를 반환합니까?
다른 팁
getProcessId 창 핸들이 아닌 프로세스 핸들이 주어지면 프로세스 ID를 가져옵니다. 실제로 :
[DllImport("kernel32", SetLastError = true)]
static extern int GetProcessId(IntPtr hProcess);
창 손잡이가 있다면 getWindowthreadProcessId 기능:
[DllImport("user32")]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);
이것은 스레드 ID를 반환하고 프로세스 ID를 아웃 파람에 넣습니다.
참조 Pinvoke의 예, 필요 없다 WIN32
관리 된 API를 사용할 수 있으므로 전화하십시오.
대체 관리 API : System.Diagnostics.Process 클래스에는 많은 모듈, 프로세스 및 스레드 메소드가 포함되어 있습니다.
예를 들어:
using System.Diagnostics;
...
private void DumpModuleInfo(IntPtr hProcess)
{
uint pid = GetProcessId(hProcess);
foreach (Process proc in Process.GetProcesses())
{
if (proc.Id == pid)
{
foreach (ProcessModule pm in proc.Modules)
{
Console.WriteLine("{0:X8} {1:X8} {2:X8} {3}", (int)pm.BaseAddress,
(int)pm.EntryPointAddress, (int)pm.BaseAddress + pm.ModuleMemorySize, pm.ModuleName);
}
}
}
}