2014-04-28 104 views
1

我想製作一個程序,將獲得另一個程序的窗口的名稱。爲此,我想用WM_GETTEXT消息使用SendMessage()函數。但是我知道,我可能做了很多的東西錯了,所以這裏是我使用的代碼:SendMessage WM_GETTEXT錯誤

string text; 
SendMessage(windowHandle, WM_GETTEXT, sizeof(text), LPARAM(text)); 

我的pritty確保...我可能有很多的東西是錯誤的。 LPARAM(文本)可能是錯誤的,因爲在MSDN中它說這個參數是:指向要接收文本的緩衝區的指針。

問題是......我不知道什麼是緩衝區,以及如何聲明它......以及如何將它轉換爲一個字符串變量,其中的窗口名稱。

我得到的錯誤是:

error: invalid cast from type 'std::string {aka std::basic_string<char>}' to type 'LPA {aka long int}' 

誤差與SendMessage函數就行了。所以我的問題是:

我做錯了什麼?什麼是緩衝區?我如何聲明緩衝區?如何將該緩衝區轉換爲文本文件? 如果有人可以給我看看我想要的代碼......那可能是我可以要求的最好答案!

回答

0

Win32 API是一個C API,你不能使用它的C++字符串。你需要使用一個char緩衝區,而不是:

char text[256]; 
LRESULT result = SendMessage(windowHandle, WM_GETTEXT, sizeof(text), LPARAM(text)); 

而且sizeof(text)當一個字符串的text沒有你想要什麼。 sizeof給出了使用的字節數,對於string而言,由於string動態分配其緩衝區,因此不是緩衝區中的字符數。

最後將string轉換爲LPARAM,這是一個整數沒有任何意義。一般來說,沒有辦法將C++對象轉換爲整數。

+0

很酷的東西,thanx人 – computerWizard

1

更改字符串文本;到TCHAR(TCHAR將導致對wchar_t的對Unicode版本)陣列:

TCHAR text[256]; 
SendMessage(windowHandle, WM_GETTEXT, sizeof(text)/sizeof(text[0]), LPARAM(text)); 

如果你正在使用SendMessage函數與一些未知的應用程序的安全使用SendMessageTimeout溝通,因爲這個程序實際上可以在指定的消息塊:

DWORD result; 
::SendMessageTimeout(hwnd, WM_GETTEXT, sizeof(text)/sizeof(text[0]), LPARAM(text), 0, 1000, &result); 
0

SendMessage(WM_GETTEXT)需要一個字符數組作爲它的LPARAM。

例如

const int nSize(80); 
char szBuff[nSize] = ""; 
int nRet = 
    ::SendMessage(hWnd, WM_GETTEXT, nSize, reinterpret_cast<LPARAM>(szBuff));