Incapaz de extrair ProcessID do getProcessId (.. hwnd) (Pinvoke)
-
16-09-2019 - |
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 (); ...
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);
}
}
}
}