Domanda

im utilizzando il seguente metodo

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

per cercare di ottenere il ProcessID per un processo in esecuzione e l'unica informazione che ho è l'HWND. Il mio problema è che si è sempre restituendo il codice di errore 6, che è ERROR_INVALID_HANDLE. Ho pensato che potrebbe cambiare il parametro di tipo int, ma che il lavoro anche di poco. Im non in grado di enumerare i processi in esecuzione, perché ci possono essere più di 1 istanza in esecuzione in un dato momento.

Chiunque può vedere se sto facendo qualcosa di sbagliato?

NB: Il processo è generato da un oggetto di automazione esposta al quadro e fornisce solo la proprietà HWND. Forse c'è un altro modo per ottenere l'idprocesso visto che il codice che ho scritto è stato responsabile per la sua esecuzione, in primo luogo?

Il mio codice osserva qualcosa di simile a questo ...

  

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

È stato utile?

Soluzione

Qual è la classe 'AutomationApplication.Application'? Hai scritto che? Ha .Run () restituisce un PID?

Altri suggerimenti

GetProcessId ottiene l'ID di processo quando somministrato un handle di processo, non un handle di finestra. In realtà è:

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

Se hai un handle di finestra, poi si desidera che il GetWindowThreadProcessId funzione:

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

Ciò restituisce l'ID, e mette l'ID di processo in out-param.

Vedere un su Pinvoke , non c'è bisogno per la chiamata WIN32, come è possibile utilizzare un'API gestita:

  

Alternativa API gestito:   classe System.Diagnostics.Process contiene molti modulo, processi e metodi filetto.

     

Ad esempio:

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);
            }
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top