Pergunta

Estou usando o seguinte método

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

Para tentar obter o ProcessID para um processo em execução e a única informação que tenho é a HWND. Meu problema é que ele está sempre retornando o código de erro 6, que é error_invalid_handle. Eu pensei que poderia mudar o parâmetro para ser do tipo int, mas isso também não funcionou. Não consigo enumerar os processos de execução, porque pode haver mais de uma instância em execução a qualquer momento.

Alguém pode ver se estou fazendo algo errado?

NB: O processo é gerado de um objeto de automação exposto à estrutura e fornece apenas a propriedade HWND. Talvez haja outra maneira de fazer com que o ProcessId tenha visto que o código que escrevi foi responsável por executá -lo em primeiro lugar?

Meu código parece algo semelhante a isso ...

AutomationApplication.Application exPapp = new AutomationApplication.Application (); excapp.run (); ...

Foi útil?

Solução

O que é a classe 'AutomationApplication.Application'? Você escreveu isso? .Run () retorna um pid?

Outras dicas

GetProcessId Obtém o ID do processo quando recebe um identificador de processo, não um identificador de janela. É realmente:

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

Se você tem uma alça de janela, então você quer o GetWindowThreadProcessId função:

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

Isso retorna o ID do thread e coloca o ID do processo na parte externa.

Veja um Exemplo em Pinvoke, não há necessidade de WIN32 Ligue, como você pode usar uma API gerenciada:

API gerenciada alternativa: System.diagnostics.Process Class contém muitos métodos de módulo, processo e encadeamento.

Por exemplo:

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);
            }
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top