[WinAPI] [C++] 2 - FindWindow、MessageBox
此練習主要是尋找畫面Handle,之後在Handle上顯示一訊息視窗。
用到的API有以下:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633515(v=vs.85).aspx
HWND
WINAPI GetWindow(
_In_ HWND hWnd,
_In_ UINT uCmd
);
傳入指定的Handle後,會在指定Handle中,利用uCmd設定值去尋找要找的視窗Handle。
順序是利用Z-Order來計算(最上層的視窗Z-Order最大,越底下越易被其他視窗蓋住,其Z-Order越小)。
GW_HWNDFIRST = 0; {選第一個同類型的視窗}
GW_HWNDLAST = 1; {選最後一個同類型的視窗}
GW_HWNDNEXT = 2; {選指定視窗下一個同類型的視窗}
GW_HWNDPREV = 3; {選指定視窗上一個同類型的視窗}
GW_OWNER = 4; {選所屬的主視窗}
GW_CHILD = 5; {選所擁有的子視窗}
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx
HWND
WINAPI FindWindow(
_In_opt_ LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName
);
輸入要尋找的視窗類別名稱(不知道可略為NULL),以及視窗的名稱(即是視窗title),函式就會回傳找到的視窗Handle。搜尋合乎參數的最上層視窗。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633504(v=vs.85).aspx
HWND WINAPI GetDesktopWindow(void);
利用此函式來取得桌面的Handle。電腦的桌面是整個系統的MDI主視窗,所有的MDI函式皆適用。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx
int WINAPI MessageBox(
_In_opt_ HWND hWnd,
_In_opt_ LPCTSTR lpText,
_In_opt_ LPCTSTR lpCaption,
_In_ UINT uType
);
輸入要有關聯的Handle、內容、標頭、以及訊息視窗上的按鈕參數即可。
按鈕參數有許多(MB_CANCELTRYCONTINUE、MB_OKCANCEL、MB_RETRYCANCEL、MB_OK…)
詳細請看上頭列的MSDN網站。
#include "stdafx.h"
#include <windows.h> //加入函式標頭
int
_tmain(int argc, _TCHAR* argv[])
{
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx
//取得桌面的Handle
HWND hWnd = ::GetDesktopWindow();
//會去尋找目前執行的視窗名稱為ABC的Handle。
HWND hWnd1 = ::FindWindow(NULL, _T("ABC"));
//指定要在哪個Handle上顯示此訊息視窗,輸入顯示文字、標頭、按鈕型態
//結尾W代表此函式要輸入寬字元指標(UNICODE)LPCWSTR
//結尾A代表此函式要輸入非寬字元指標(ASCII)LPCSTR
//_T(X) 會將其轉為UNICODE型態
MessageBoxW(hWnd, _T("Text"),
_T("Caption"), MB_OK | MB_OKCANCEL);
MessageBoxA(hWnd1, "Text", "Caption",
MB_OK);
//當檔案有定義_UNICODE時 ,MessageBox =
MessageBoxW
//反之 ,MessageBox =
MessageBoxA
MessageBox(NULL, _T("Text"),
_T("Caption"), MB_OK);
return 0; //跳出
}
可以發現,有一些API最後都有分W或是A或都沒有來結尾。
因為演進的關係,之前系統都是使用一個字節來表示文字或符號,後來發展到使用兩個字節來定義文字或符號。
所以有分W(寬字元UNICODE)跟A(ASCII)兩種函式的演進。一般函式後方完全沒寫W或A的函式,會因為沒定義UNICODE就為W的函式;反之為A的函式。
EX: (取自WinUser.h)
#ifdef
UNICODE
#define
MessageBox MessageBoxW
#else
#define
MessageBox MessageBoxA
#endif //
!UNICODE
Note:當有定義_UNICODE時,_T("AAA")會等於L"AAA",若沒有定義時,_T("AAA)會等於"AAA"。
參考網站: