時間:2023-07-25 02:09:01 | 來源:網(wǎng)站運營
時間:2023-07-25 02:09:01 來源:網(wǎng)站運營
自定義·自制HTML壁紙:本文很大程度上基于 @今晚的風兒很喧囂 的文章 今晚的風兒很喧囂:手寫一個 windows 桌面動態(tài)壁紙(以下簡稱“參考文獻1”) *hDesktop = FindWindowA("Progman", "Program Manager"); SendMessageA(*hDesktop, WM_USER + 300, 0, 0);
啊,我這個笨蛋沒有做錯誤處理,大家不要學我。 SetParent(reinterpret_cast<HWND>(item->winId()),hDesktop); ShowWindow(hWorkerX,SW_SHOW); EnableWindow(hWorkerX,TRUE);
然后,我們試圖截獲桌面上的鼠標按鍵。LRESULT CALLBACK MouseProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam) { //according to MSDN, when nCode<0, do nothing if (nCode < 0)return CallNextHookEx(hHook, nCode, wParam, lParam); //when middle button is released, hide the desktop. if (wParam == WM_MBUTTONUP) { ShowWindow(WorkerW, SW_HIDE); return 1; } //passing mouse actions: it can not handle properly when you drag. if ((wParam == WM_LBUTTONDOWN)|| (wParam == WM_LBUTTONUP)|| (wParam == WM_LBUTTONDBLCLK)||(wParam==WM_MOUSEMOVE)) { MOUSEHOOKSTRUCT *in = reinterpret_cast<MOUSEHOOKSTRUCT*>(lParam); if(in->pt.x) PostMessage(Recv, MsgCode, wParam, MAKELPARAM(in->pt.x, in->pt.y)); } return CallNextHookEx(hHook, nCode, wParam, lParam);}
大概的意思是,如果點擊鼠標中鍵,則隱藏桌面圖標。而對左鍵的動作,保留原有處理方式并轉(zhuǎn)發(fā)給我們的窗口。#pragma data_seg("Shared")......//待定義的變量們#pragma data_seg()
然后,我們就可以使用SetWindowsHookEx進行掛鉤了。BOOL StartHook(_In_ HWND pIcons, _In_ HWND pWorkerW, _In_ HWND pRecv) { //Hook into the window with icons. DWORD tid = GetWindowThreadProcessId(pIcons, NULL); if (tid == 0)return FALSE; hHook = SetWindowsHookEx(WH_MOUSE, MouseProc, Me, tid); if (hHook == 0)return FALSE; //make sure the icons are shown. ShowWindow(WorkerW, SW_SHOW); //Retrieve necessary data. Icons = pIcons; WorkerW = pWorkerW; Recv = pRecv; return TRUE;}void StopHook(){ //clear data up. Icons = 0; WorkerW = 0; Recv = 0; //make sure that the icons are shown ShowWindow(WorkerW, SW_SHOW); //release the hooks UnhookWindowsHookEx(hHook); hHook = 0;}
好的。這樣子我們就成功地截獲了Windows鼠標消息。LIBRARY OpenDesktopEXPORTS MouseProc StartHook StopHook FindWindows SECTIONS Shared READ WRITE SHARED
然后,我們在使用時則需要通過LoadLibrary加載dll,之后利用GetProcAddress獲得函數(shù)地址。 bool initDll(){ list.clear(); map.clear(); hDll=LoadLibraryA("OpenDesktop.dll"); if(hDll==nullptr)return false; FARPROC hFun1 = GetProcAddress(hDll, "StartHook"); FARPROC hFun2 = GetProcAddress(hDll, "FindWindows"); FARPROC hFun3 = GetProcAddress(hDll, "StopHook"); StartHook=reinterpret_cast<STARTHOOK>(hFun1); FindWindows=reinterpret_cast<FINDWINDOWS>(hFun2); StopHook=reinterpret_cast<STOPHOOK>(hFun3); if((StartHook==nullptr)||(FindWindows==nullptr)||(StopHook==nullptr))return false; return true; }
其中幾個我們不認識的類型定義如下:typedef BOOL (*STARTHOOK)(HWND,HWND,HWND);typedef BOOL (*FINDWINDOWS)(HWND*,HWND*,HWND*);typedef BOOL (*STOPHOOK)();
之后就是直截了當?shù)漠斪髡:瘮?shù)那樣調(diào)用就好了啦。UINT TaskbarCreated=RegisterWindowMessageA("TaskbarCreated");
之后只要聆聽這個消息就好了啦…它會自動推送給所有有條件接收消息的頂級窗口的。LRESULT CALLBACK WindowProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ){ if(uMsg==TaskbarCreated)Explorer::init(); if(uMsg==CustomMessage){ //Building the mouse event to send. QPoint pt(LOWORD(lParam),HIWORD(lParam)); Explorer::DispatchMouseMessage(pt,wParam); }; return DefWindowProcA(hwnd,uMsg,wParam,lParam);}
首先我們構(gòu)造這個窗口的窗口過程,并在其中處理消息。這里我們處理了Explorer重建的消息和自定義鼠標事件的消息。 WNDCLASS winclass; winclass.style=NULL; winclass.lpfnWndProc=WindowProc; winclass.cbClsExtra=NULL; winclass.cbWndExtra=NULL; winclass.hInstance=GetModuleHandleA(nullptr); winclass.hIcon=nullptr; winclass.hCursor=nullptr; winclass.hbrBackground=nullptr; winclass.lpszMenuName=nullptr; winclass.lpszClassName=L"DesktopMessageListener"; RegisterClass(&winclass);
大概的意思就是…除了必要的參數(shù)之外,剩下的都一律寫0. Listener=CreateWindowA( "DesktopMessageListener", nullptr, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, nullptr,nullptr,GetModuleHandleA(nullptr),nullptr); if(Listener==nullptr)return false;
最后我們把它隱藏好 ShowWindow(Listener,SW_HIDE);
這樣子,我們就完成了事件監(jiān)聽窗口的建立。bool WebPage::event(QEvent *e){ //Events to a WebEngineView should be handled by a RenderWidgetHostViewQtDelegateWidget if (e->type() == QEvent::ChildPolished) { QChildEvent *child_ev = static_cast<QChildEvent*>(e); childObj = child_ev->child(); } return QWebEngineView::event(e);}
而通過以下的方式將事件發(fā)送給孩子void WebPage::SendToChild(QEvent *e){ QApplication::sendEvent(childObj,e);}
最后的最后,加入防止重復運行的方式…關(guān)鍵詞:定義
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。