Impossible d'extraire processID de GetProcessId (.. hWnd) (PInvoke)
-
16-09-2019 - |
Question
im en utilisant la méthode suivante
[DllImport("kernel32.dll", SetLastError=true)] static extern int GetProcessId(IntPtr hWnd);
pour essayer d'obtenir le processId pour un processus en cours d'exécution et la seule information dont je dispose est le HWND. Mon problème est qu'il retourne toujours le code d'erreur 6 qui est ERROR_INVALID_HANDLE. Je pensais que je pourrais changer le paramètre à être de type int, mais ce travail aussi na pas. Je ne suis pas en mesure d'énumérer les processus en cours, car il peut y avoir plus de 1 instance en cours d'exécution à un moment donné.
Quelqu'un peut-il voir si je fais quelque chose de mal?
NB: Le processus est donné naissance à partir d'un objet d'automatisation exposé au cadre et ne fournit que la propriété HWND. Peut-être il y a une autre façon d'obtenir le processID car le code je l'ai écrit était responsable en cours d'exécution en premier lieu?
Mon code ressemble à quelque chose de semblable à ce ...
AutomationApplication.Application extApp = new AutomationApplication.Application (); extApp.Run (); ...
La solution
Quelle est la classe 'AutomationApplication.Application'? Avez-vous écrit cela? Est-ce que .Run () retourne un PID?
Autres conseils
GetProcessId obtient l'ID de processus lorsque donné une poignée de processus, non une poignée de fenêtre. Il est en fait:
[DllImport("kernel32", SetLastError = true)]
static extern int GetProcessId(IntPtr hProcess);
Si vous avez une poignée de fenêtre, alors vous voulez que le GetWindowThreadProcessId fonction:
[DllImport("user32")]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);
renvoie l'identifiant de fil, et met le numéro de processus dans le hors-param.
Voir Pinvoke, pas besoin de l'appel WIN32
, comme vous pouvez utiliser une API gérée:
API Managed Alternative: classe System.Diagnostics.Process contient de nombreux modules, processus et méthodes de fil.
Par exemple:
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);
}
}
}
}