BOOL DeskBandWindow::CreateDeskBand(HWND hParentWnd, HINSTANCE hInstance, LPVOID pData) { WNDCLASS wc; UnregisterClass(DB_CLASS_NAME,NULL); if (!GetClassInfo(hInstance, DB_CLASS_NAME, &wc)) { wc = { 0 }; wc.style = CS_HREDRAW | CS_VREDRAW; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = DB_CLASS_NAME; wc.hbrBackground = (HBRUSH)0; if (!RegisterClass(&wc)) return FALSE; } mHwnd = CreateWindowEx( 0, DB_CLASS_NAME, NULL, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0,//rc.left, 0,//rc.top, 30,//rc.right - rc.left, 24,//rc.bottom - rc.top, hParentWnd, NULL, hInstance, pData); mHookHwnd = mHwnd; Shell = RegisterWindowMessage(TEXT("SHELLHOOK")); RegisterShellHookWindow(mHookHwnd); return (NULL != mHwnd); };
BOOL SetShellHook(HWND hwndHook) { WM_SHELLHOOKMESSAGE = RegisterWindowMessage(TEXT("SHELLHOOK")); if (WM_SHELLHOOKMESSAGE) { if (RegisterShellHookWindow(hwndHook)) { return TRUE; } } return FALSE; }
/* * Callback method that creates the hidden window on initialization to receive * any WM_HOTKEY messages and process them. */ void JIntellitypeHandler::doInitialize() { // Register window class WNDCLASSEX l_Class; l_Class.cbSize = sizeof( l_Class ); l_Class.style = CS_HREDRAW | CS_VREDRAW; l_Class.lpszClassName = TEXT( "JIntellitypeHandlerClass" ); l_Class.lpfnWndProc = WndProc; l_Class.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); l_Class.hCursor = NULL; l_Class.hIcon = NULL; l_Class.hIconSm = NULL; l_Class.lpszMenuName = NULL; l_Class.cbClsExtra = 0; l_Class.cbWndExtra = 0; l_Class.hInstance = m_instance; if( !RegisterClassEx( &l_Class ) ) return; // Create window m_window = CreateWindow ( TEXT( "JIntellitypeHandlerClass" ), TEXT( "JIntellitypeHandler" ), WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, m_instance, NULL ); if( !m_window ) return; //Set pointer to this object inside the Window's USERDATA section SetWindowLong( m_window, GWL_USERDATA, (LONG) this ); // hide the window ShowWindow(m_window, SW_HIDE); UpdateWindow(m_window); //register this window as a shell hook to intercept WM_APPCOMMAND messages WM_SHELLHOOK = RegisterWindowMessage(TEXT("SHELLHOOK")); BOOL (__stdcall *RegisterShellHookWindow)(HWND) = NULL; RegisterShellHookWindow = (BOOL (__stdcall *)(HWND))GetProcAddress(GetModuleHandle("USER32.DLL"), "RegisterShellHookWindow"); //make sure it worked if (!RegisterShellHookWindow(m_window)) { // throw exception jclass JIntellitypeException = g_JIntellitypeThread.m_env->FindClass("com/melloware/jintellitype/JIntellitypeException"); g_JIntellitypeThread.m_env->ThrowNew(JIntellitypeException,"Could not register window as a shell hook window."); } }
DWORD WINAPI ShellHookThread(PVOID pParam) { HWND hWnd = CreateWindowW(L"Button", NULL, WS_OVERLAPPED,0, 0, 10, 10, HWND_MESSAGE, NULL, NULL, NULL); #if defined(WIN64) || defined(_WIN64) SetWindowLongPtrW(hWnd,GWLP_WNDPROC,(LONG)ShellHookWndProc); #else SetWindowLongW(hWnd,GWL_WNDPROC,(LONG)ShellHookWndProc); #endif BOOL bRes = RegisterShellHookWindow(hWnd); MSG msg; // Ö÷ÏûϢѻ·: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
BOOL SetShellHook(HWND hwndHook) //需要安装钩子的窗口句柄 { WM_SHELLHOOKMESSAGE = RegisterWindowMessage("SHELLHOOK"); return WM_SHELLHOOKMESSAGE && RegisterShellHookWindow(hwndHook); }