[英]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.