我尝试获取打开的应用程序(Windows)的句柄 ID。
我运行Window detective
程序(如 spy++)来验证我是否获得了正确的值。
为了测试,我尝试只获得一个由红色箭头指向的句柄 ID(见图):
所以我有程序给我进程ID和线程ID,但不是第一个子句柄ID。
就我而言,我采取了calc.exe
,但实际上我需要为所有exe
应用程序这样做:
读取窗口.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
从 Spy++ 我需要这个值,红色箭头: