[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_CANCELTRYCONTINUEMB_OKCANCELMB_RETRYCANCELMB_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();
 
  //會去尋找目前執行的視窗名稱為ABCHandle
  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)兩種函式的演進。一般函式後方完全沒寫WA的函式,會因為沒定義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"。

參考網站:

這個網誌中的熱門文章

[Tips] 設定桌面文字顏色

登入失敗: 使用者帳戶限制。可能原因為不允許空的密碼,登入時數限制,或強制的原則限制

[CCD] Line Scan V.S. Area Scan