열린 응용 프로그램 (창)의 핸들 ID를 가져 오려고합니다.Handle Id 프로세스, HWND 프로그래밍 방식으로 얻는 방법?
나는 적당한 값을 얻는 지 확인하기 위해 spy ++와 같은 프로그램을 실행한다. 테스트를 위해
는 난 단지 빨간색 화살표가 가리키는 하나 개의 핸들 이드 (이미지 참조) 얻으려고 :그래서 나는 나에게 프로세스 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
을해야 ++ 나는이 값을, 빨간색 화살표가 필요합니다
핸들은 고유 한 값/식별자가 아닙니다. 두 응용 프로그램이 어떤 것에 대한 핸들을 가지고 있다면, 그것들은 16 진수 값이 같지 않을 것이다. 따라서 출력을 프로그램과 비교하고 출력을 타사 응용 프로그램과 비교하는 것은 의미가 없다. –
하지만'CalcFrame'에는'text' -'Calculator'가 있습니다. 더 이상,'Window Detective' 검색을 사용하면 하나의 창만 보게됩니다. 내 편집 –
"handle ID"는 Windows 용어가 아닙니다. 그게 무슨 뜻이야? – Medinoc