窗口子類化 截取窗口消息

 

子類化聽起來很是讓人不覺明歷,

其實就是自定義窗口的消息處理,截取消息

使用的方法就是 SetWindowLong

子類化設置

 

LONG SetWindowLong(

    HWND hWnd,               // handle to window

    int nlndex,              // offset of value to set

    LONG dwNewLong           // new value

);

 

常量

常量值

意義

GWL_EXSTYLE

-20

設定一個新的擴展風格。

GWL_HINSTANCE

-6

設置一個新的應用程序實例句柄。

GWL_ID

-12

設置一個新的窗口標識符

GWL_STYLE

-16

設定一個新的窗口風格。

GWL_USERDATA

-21

設置與窗口有關的32位值。每個窗口均有一個由創建該窗口的應用程序使用的32位值。

GWL_WNDPROC

-4

爲窗口設定一個新的處理函數。

GWL_HWNDPARENT -8 改變子窗口的父窗口,應使用SetParent函數。

其中 參數使用 GWL_WNDPROC,設置一個新的處理函數,就是所謂的窗口子類化

 

子類化示例:

比如截取CEF瀏覽器窗口 鼠標信息, 需要子類化CEF瀏覽器窗口

 

			HWND cefHWND = cef_student_->GetCefHandle();
			HWND subHWND = GetTopWindow(cefHWND);
			if (subHWND)
				subHWND = GetTopWindow(subHWND);

			cefHWND = subHWND;
			TCHAR ch[100] = { 0 };
			GetWindowText(cefHWND, ch, 100);

            //首先要找準需要子類化的窗口
			OldProc = (WNDPROC)SetWindowLong(cefHWND, GWL_WNDPROC, (LONG)ProcCEF);

 

窗口消息截取:

WNDPROC OldProc;
LRESULT CALLBACK ProcCEF(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    pClassform = (MyClassForm*)(nim_comp::WindowsManager::GetInstance()->GetWindow(MyClassForm::kClassName, MyClassForm::kClassName));


	if (Msg == WM_CHAR )
	{
		MessageBeep(MB_OK);
		return 0;
	}
	else if (Msg == WM_LBUTTONDOWN)
	{

		int i = 0;
		i++;
	}
	else if (Msg == WM_MOUSEHOVER)
	{
		int	xPos = GET_X_LPARAM(lParam);
		int 	yPos = GET_Y_LPARAM(lParam);

		std::wstring pos = nbase::StringPrintf(L"%d  %d", xPos, yPos);

		QLOG_APP(pos);
	}

	else if (Msg == WM_MOUSEMOVE)
	{

	  int	xPos = GET_X_LPARAM(lParam);
      int 	yPos = GET_Y_LPARAM(lParam);

	  std::wstring pos = nbase::StringPrintf(L"%d  %d", xPos, yPos);

	  QLOG_APP(pos);

		if (pClassform)
			pClassform->showCefBackBtn(TRUE);
	}
	else if (Msg == WM_MOUSELEAVE)
	{
		if (pClassform)
			pClassform->showCefBackBtn(false);
	}

	else
		return CallWindowProc(OldProc, hWnd, Msg, wParam, lParam);
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章