我尝试获取打开的应用程序(窗口)的句柄ID。如何通过编程方式从进程HWND获取句柄ID?
我运行Window detective
程序(如spy ++)来验证我得到了正确的值。
为了测试我试图让只有一个句柄ID由红色箭头指向(见图片):
所以我有计划,让我的进程ID和线程ID,但不是第一个孩子把手ID。
在我来说,我把calc.exe
,但实际上我需要做的所有exe
应用:
readWindow.c
#include <windows.h>
#include <stdio.h>
#include <stddef.h>
#include <inttypes.h>
#include <tchar.h>
#include <psapi.h>
HMODULE getModulePid(DWORD processID, char* searchStr){ // gets the module by the module name from an explicit process
HANDLE hProcess;
HMODULE hMods[1024];
TCHAR szModName[MAX_PATH];
DWORD cbNeeded;
if(hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID))
{
if(EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
{
unsigned int k;
for(k = 0; k < (cbNeeded/sizeof(HMODULE)); ++k)
{
if (GetModuleFileNameEx(hProcess, hMods[k], szModName, sizeof(szModName)/sizeof(TCHAR)))
{
//printf("fess pid: %u modname: %s\n", processID, szModName);
if(strstr(szModName, searchStr))
{
printf("pid: %u modname: %s\n", processID, szModName);
CloseHandle(hProcess);
return hMods[k];
}
}
}//for
}
}
CloseHandle(hProcess);
return NULL;
}
HMODULE getModule(char* searchStr){ // gets the module by the modul name from all processes
DWORD aProcesses[1024], cbNeeded, cProcesses;
if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) return NULL;
cProcesses = cbNeeded/sizeof(DWORD);
HMODULE hmodule;
unsigned int i;
for (i = 0; i < cProcesses; ++i)
{
if(hmodule = getModulePid(aProcesses[i], searchStr))
{
return hmodule;
}
}
return NULL;
}
HMODULE getModuleHwnd(HWND hwnd){ // gets the module from a window
DWORD pid;
DWORD tid = GetWindowThreadProcessId(hwnd, &pid); // !!??!!
printf("hwnd tid: %u\n", tid );
printf("hwnd pid: %u\n", pid );
return getModulePid(pid, ".exe");
}
HMODULE hModuleT;
char* searchStrT;
BOOL CALLBACK shownWindow(HWND hwnd, LPARAM lParam){ // EnumWindows callback
if(hModuleT) return TRUE;
char pcWinTitle[256];
if(GetWindow(hwnd, GW_OWNER)) return TRUE; // whats that?
GetWindowText(hwnd, pcWinTitle, 1024);
if(strstr(pcWinTitle, searchStrT)){
printf("wndtitle: %s\n", pcWinTitle);
hModuleT = getModuleHwnd(hwnd);
}
return TRUE;
}
HMODULE getModuleByWndTitle(char* searchStr){ // gets the module from a window title
searchStrT = searchStr;
EnumWindows(shownWindow, 0);
return hModuleT;
}
int main()
{
//EnumWindows(EnumWindowsProc, 0);
printf("find by name ... \n");
getModule("calc.exe");
printf("\nfind by title ... \n");
getModuleByWndTitle("Calculator");
printf("Done");
return 0;
}
运行从minGW
:
$ gcc -L/local/lib -I/local/include -o readWindow readWindow.c -lpsapi
输出:
find by title ...
wndtitle: Calculator
hwnd tid: 33364
hwnd pid: 25440
Done
我怎样才能从流程的处理?
我确定它应该是一些1-2行的代码。
DWORD dwValue .....
printf("The value in hexa: 0X%.8X(%d).\n", dwValue);
应该0x007B137C
从谍照++我需要这个值,红色箭头:
句柄不是唯一的值/标识符。如果两个应用程序有某种处理方式,它们将不具有相同的十六进制值,因此将输出与您的程序进行比较以及将输出与第三方应用程序进行比较是没有意义的。 –
但是'CalcFrame'有'text' - 'Calculator',但是当我使用'Window Detective'搜索时,我只有一个窗口,看到我的编辑 –
“句柄ID”不是Windows术语。你是什么意思? – Medinoc