簡體   English   中英

無法從GetProcessId(.. hWnd)中提取processID(pInvoke)

[英]Unable to extract processID from GetProcessId(.. hWnd) (pInvoke)

即時通訊使用以下方法

  [DllImport("kernel32.dll", SetLastError=true)] static extern int GetProcessId(IntPtr hWnd); 

嘗試獲取正在運行的進程的processId,我唯一的信息是HWND。 我的問題是它始終返回錯誤代碼6,即ERROR_INVALID_HANDLE。 我以為我可能會將參數更改為int類型,但也沒有用。 我無法枚舉正在運行的進程,因為任何時候都可能有多個實例在運行。

誰能看出我做錯了什么?

注意:該進程是從暴露給框架的自動化對象中生成的,只提供HWND屬性。 也許還有另一種方法來獲取processID,因為我編寫的代碼首先負責運行它?

我的代碼看起來與此類似......

AutomationApplication.Application extApp = new AutomationApplication.Application(); extApp.Run(); ...

給定進程句柄而不是窗口句柄時, 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放在out-param中。

什么是'AutomationApplication.Application'類? 你寫的那個嗎? .Run()是否返回PID?

查看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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM