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 (); ...

Était-ce utile?

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);
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top