2013-09-10 1 views
2

열린 응용 프로그램 (창)의 핸들 ID를 가져 오려고합니다.Handle Id 프로세스, HWND 프로그래밍 방식으로 얻는 방법?

나는 적당한 값을 얻는 지 확인하기 위해 spy ++와 같은 프로그램을 실행한다. 테스트를 위해

는 난 단지 빨간색 화살표가 가리키는 하나 개의 핸들 이드 (이미지 참조) 얻으려고 :

enter image description here

그래서 나는 나에게 프로세스 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: &#37;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

을해야 ++ 나는이 값을, 빨간색 화살표가 필요합니다

enter image description here

+1

핸들은 고유 한 값/식별자가 아닙니다. 두 응용 프로그램이 어떤 것에 대한 핸들을 가지고 있다면, 그것들은 16 진수 값이 같지 않을 것이다. 따라서 출력을 프로그램과 비교하고 출력을 타사 응용 프로그램과 비교하는 것은 의미가 없다. –

+0

하지만'CalcFrame'에는'text' -'Calculator'가 있습니다. 더 이상,'Window Detective' 검색을 사용하면 하나의 창만 보게됩니다. 내 편집 –

+0

"handle ID"는 Windows 용어가 아닙니다. 그게 무슨 뜻이야? – Medinoc

답변

1

그것은 매우 간단하지만 나 까다로운 조금이었다.

포인터 HWND hwnd%p으로 인쇄하면됩니다.

그래서 난 내 코드에 추가 :

char szBuff[512]; 
sprintf(szBuff, "%p", hwnd); 

printf("Found .... hWnd: %s\n", szBuff); 

그리고 내가 원하는 걸 얻었 :

Found .... hWnd: 007B137C 

[편집]

작동 코드 예제 :

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: &#37;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); 

     char szBuff[512]; 
     sprintf(szBuff, "%p", hwnd); 

     printf("Found .... hWnd: %s\n", szBuff); 

    } 

    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; 
} 
+0

당신이 downvote –

+3

때 동의하십시오, 어떻게 printf() 사용하는 방법에 대한 답변을 많이 "프로세스에서 핸들을 얻을 수 있습니까?" 이 답변에 만족한다면 지구상에 왜 현상금을 넣었습니까? 아직도 해결하려는 문제는 무엇입니까? –

+0

특정 화면 또는 전체 화면을 스트리밍 할 수있는 화면 공유 응용 프로그램이 있습니다. 화면 공유 응용 프로그램은 특정 윈도우의 핸들 ID (헥사)를 넣어야하는 레지스트리를 통해 API 만 사용합니다. 프로세스 ID 나 스레드를 hwnd에서 가져올 수 있지만 핸들 ID를 얻는 방법을 찾기 위해 하루 종일 걸렸습니다. 지금까지 아무도 말해주지 않았으므로 포인터에서 핸들러 ID를 가져올 수 있다는 것을 알았습니다. 임 "C"프로그래머가 아닙니다. 그렇게하는 올바른 방법을 알고 있다면, 50 점 + V가 당신 것입니다. 감사합니다 –