문제

다음 방법을 사용하고 있습니다

    [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);
            }
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top