2009-08-16 9 views
2

im en utilisant la méthode suivanteImpossible d'extraire processID de GetProcessId (.. hWnd) (PInvoke)

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

pour essayer d'obtenir le processId pour un processus en cours et la seule information dont je dispose le HWND. Mon problème est qu'il renvoie toujours le code d'erreur 6 qui est ERROR_INVALID_HANDLE. Je pensais que je pourrais changer le paramètre pour être de type int mais cela n'a pas fonctionné. Je ne suis pas en mesure d'énumérer les processus en cours car il peut y avoir plus d'une instance en cours d'exécution à la fois. Est-ce que quelqu'un peut voir si je fais quelque chose de mal? NB: Le processus est généré à partir d'un objet Automation exposé à l'infrastructure et fournit uniquement la propriété HWND. Peut-être y a-t-il une autre façon d'obtenir le processusID vu que le code que j'ai écrit était responsable de l'exécuter en premier lieu?

Mon code ressemble à quelque chose de semblable à ce ...

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

Répondre

1

Qu'est-ce que la classe 'AutomationApplication.Application'? Avez-vous écrit cela? Est-ce que .Run() renvoie un PID?

+0

non malheureusement rien d'utile comme ça. – Grant

+0

Son pour AutoCad en fait donc pas je ne l'ai pas écrit. – Grant

+1

Eh bien, l'option, potentiellement boiteuse, est d'appeler 'System.Diagnostics.Process.GetCurrentProcess();' et vérifiez la propriété '.Handle' de chacun? –

0

Voir un example on Pinvoke, pas besoin de l'appel WIN32, que vous pouvez utiliser une API gérée:

Alternative Managed API: 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); 
      } 
     } 
    } 
} 
+0

Pensez-vous ** vraiment ** que cette double boucle imbriquée sur tous les processus du système est meilleure que l'appel win32? – poncha

+0

Pointant vers une possibilité. Commencez par http://stackoverflow.com/questions/3368802/what-is-the-difference-in-managed-and-unmanaged-code-memory-and-size et faites quelques recherches.Mesurez toujours les paramètres importants pour le cas spécifique (lisibilité, vitesse, empreinte mémoire, ...). – gimel

11

GetProcessId obtient l'ID de processus lorsque donné une poignée de processus, pas 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 la fonction GetWindowThreadProcessId:

[DllImport("user32")] 
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId); 

Ce retourne l'identifiant de fil, et met le numéro de processus dans le hors-param.

Questions connexes