2012-06-15 86 views
2

我正在製作一個小程序,以便在使用Microsoft遠程協助(msra.exe)時使我的生活更輕鬆。使用C++,我可以打開msra.exe,然後找到窗口句柄。然後我想要找到子窗口(按鈕),並與它們進行交互。問題似乎是,雖然我找不到我想要的按鈕。 Spy ++顯示按鈕具有以下文本:使用FindWindowEx函數找不到子窗口

窗口004902F4「邀請您信任的人來幫助您」按鈕。

我的程序在搜索此字符串時返回該按鈕不存在。有人有主意嗎?下面的代碼:

#include "stdafx.h" 
#include <windows.h> 
#include <string> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <Windows.h> 
#include <process.h> 


using std::string; 

void openRA(void * dummy); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

_beginthread(openRA, 0, NULL); 

Sleep(1000); 

HWND handle = NULL; 

handle = FindWindow(NULL, TEXT("Windows Remote Assistance")); 

if(handle == NULL){ 
    printf("handle was null\n"); 
} 
else{ 
    printf("handle was not null\n"); 
} 



HWND button1 = NULL; 
Sleep(1000); 
button1 = FindWindowEx(handle, 0, 0, TEXT("Invite someone you trust to help you")); 

if(button1 == NULL){ 
    printf("Button1 was null"); 
} 
else{ 
    printf("I found he button!"); 
} 
fflush(stdout); 
return 0; 
} 

void openRA(void * dummy){ 
printf("I'm inside this function\n"); 
system("msra.exe &"); 

} 

編輯:

這裏是間諜++顯示的圖像。 Spy++ Image

+0

我已經與多個窗口,這個確切的問題。事實證明,使用你看到的數字手柄是行得通的,但當然這不是一個非常長期的解決方案。什麼讓Spy ++找到他們,但不是我們,我想知道。 – chris

+0

'FindWindowEx()'不遞歸掃描所有後代控件。你確定這個按鈕是主框架的直接子嗎? –

+0

@FrédéricHamidi,我絕對相信我嘗試過的一些是直接的孩子。 – chris

回答

4

頂層窗口的標題爲「Windows遠程協助」。這是由FindWindow返回的窗口。

這包含嵌入的對話,其中也有標題「Windows遠程協助」,幷包含按鈕你感興趣的內容。

的按鈕不是頂層窗口的直接孩子,所以FindWindowEx沒有按找不到它。

使用EnumChildWindows遞歸枚舉頂級窗口的所有子項並自己檢查標題。

-1

我在這裏做這個代碼,所以沒有tryied它(我跑我的Linux現在)

EnumChildWindows(FindWindow(NULL, TEXT("Windows Remote Assistance), (WNDENUMPROC)&EnumProc, 0); 
    //------------------------------------------------------------------------ 
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam); 
{ 
LPTSTR szBuff; 
if (GetWindowText(hwnd, szBuff, sizeof(szBuff) 
{ 
if (!strcmp("Invite someone you trust to help you", szBuff) 
{ 
//We found the button! 
} 
} 
//No button was found 
}