C++: SendMessage 的使用方式

Posted: 一月 16, 2008 in 非關分類
標籤:, ,

之前提過 PostMessage 的用法 其實 SendMessage 的用法也滿類似的

先看看他的定義:

LRESULT SendMessage(HWND hWnd, UINT Msg,WPARAM wParam, LPARAM lParam);

  • hWnd – handle of destination window
  • Msg – message to send
  • wParam – first variable
  • lParam – second variable

宣告跟 PostMessage 也滿類似的 差別僅在於回傳值的不同

PostMessage 是 BOOL 而 SendMessage 則是 LRESULT

故 SendMessage 用於需要即時得知處理結果的情況下

而 PostMessage則是將處理送出 不在意立即結果

下面兩篇網誌 有查到一些使用時機與用法 可以參考… [1]、[2]

不過會去查這個 是因為 之前提到 AutoComplete 小程式尚未解決的兩個問題

第一個是 無法將 ENTER 鍵 鍵入後 focus 到 EditBox 之最後字母….

  • 思考邏輯 -> SetFocus() 後 在送出鍵盤 “End" 的 Message…

那解決方法呢?

  1. 在 Dialog – OnInitDialog() 時 找出 EditBox 的 handle
  2. 於鍵入 “ENTER" 鍵且 SetFocus() 後送出 “END" 的 Message

找出 Window Component Handle 的方式 可以透過先取得 Component 的 Window 指標

再透過 ->GetSafeHwnd() 得到 Component 的 handle

首先於 .h 檔宣告 EditBox的 handle variable


HWND hName;

在於 主程式 OnInitDialog() 中得到 Component 指標 獲取 handle


CWnd *pName = GetDlgItem(IDC_Name);
hName = pName->GetSafeHwnd();

最後於 PreTranslateMessage() 的 “case VK_RETURN:" 中送出 Message

Parital Code 如下


case VK_RETURN:
	Sel_Item = -1;
	m_Hide.DeleteAllItems();
	GetDlgItem(IDC_LIST_Hide)->EnableWindow(FALSE);
	GetDlgItem(IDC_Name)->SetFocus();
	:: SendMessage(hName, WM_KEYDOWN, VK_END, 0);

	return TRUE;
	break;

hName 是 Component handle, WM_KEYDOWN 是 Messag, VK_END 是Message 所帶的參數 1

如此即可解決AutoComplete 程式在鍵入 “ENTER" 鍵後 Focus 在最前面之問題 …

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s