Frage

Ich verwende die folgende Methode

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

Um den ProzessID für einen Laufprozess zu erhalten, und die einzigen Informationen, die ich habe, sind die HWND. Mein Problem ist, dass es immer zurückgegeben wird, Fehlercode 6, der ERROR_INVALID_HANDLE ist. Ich dachte, ich könnte den Parameter so ändern, dass es vom Typ int ist, aber das hat auch nicht funktioniert. Ich bin nicht in der Lage, die laufenden Prozesse aufzählen, da möglicherweise mehr als 1 Instanz gleichzeitig ausgeführt wird.

Kann jemand sehen, ob ich etwas falsch mache?

NB: Der Prozess wird aus einem Automatisierungsobjekt hervorgebracht, das dem Framework ausgesetzt ist, und liefert nur die HWND -Eigenschaft. Vielleicht gibt es eine andere Möglichkeit, den Prozess zu erhalten, da der Code, den ich schrieb, dafür verantwortlich war, ihn überhaupt auszuführen?

Mein Code sieht ähnliches ähnelt ...

AutomationApplication.Application extApp = new AutomationApplication.Application (); extapp.run (); ...

War es hilfreich?

Lösung

Wie lautet die Klasse "AutomationApplication.Application"? Hast du das geschrieben? Gibt .run () eine PID zurück?

Andere Tipps

GetProcessid Ruft die Prozess -ID ab, wenn ein Prozessgriff angegeben wird, nicht mit einem Fenstergriff. Es ist eigentlich:

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

Wenn Sie einen Fenstergriff haben, möchten Sie das GetwindowthreadProcessid Funktion:

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

Dies gibt die Thread-ID zurück und stellt die Prozess-ID in das Out-Param ein.

Siehe an Beispiel auf Pinvoke, keine Notwendigkeit für die WIN32 Rufen Sie an, wie Sie eine verwaltete API verwenden können:

Alternative verwaltete API: System.Diagnostics.Process -Klasse enthält viele Modul-, Prozess- und Thread -Methoden.

Zum Beispiel:

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);
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top