精華區beta Liu 關於我們 聯絡資訊
※ 引述《ChrisTorng (ChrisTorng)》之銘言: : : 完全更新了原本按鍵攔截的結構 : : 因此會非常不穩定,也非常需要測試 ^^" : : (才剛解決一個嚴重 Bug) : : 事實上我還在評估 : : 因為雖然這個結構可以改良部份困擾已久的問題 : : 不過程式效率可能會降低(目前還不確定是不是真的會降低) : : 所以可能根據大家的回報再決定最後用哪一個結構好了 : 用 vc 寫 dll 對嗎? : 事實上我為了工作已經寫好一個現成的攔截鍵盤 vc dll, : 也是由書上抄來的,我用是已經很穩定了,不知道會不會有幫助,提供做參考: : // CbtHook.cpp : Defines the entry point for the DLL application. : // : #include "stdafx.h" : #include "CbtHook.h" : #define CBTHOOK_VERSION 1 : #define MYWM_APPACTIVATE WM_USER + 1 : #define MYWM_APPMINMAX WM_USER + 2 : #define MYWM_APPDESTROYWND WM_USER + 3 : HINSTANCE g_hinstDll = NULL; : // for VS.NET warning C4659: : // #pragma 'data_seg' : 使用保留的區段 '.drectve' 有未定義的行為, : // 使用 #pragma comment(linker, ...) : #pragma data_seg(".drectve") : //#pragma comment(linker, "/SECTION:.drectve,RWS") : static char szLinkDirectiveShared[] = "-section:Shared,rws"; : #pragma data_seg() : #pragma data_seg("Shared") : HHOOK g_hhook = NULL; : HWND g_hwndPost = NULL; : #pragma data_seg() : static LRESULT WINAPI WndHook_HookProc(int nCode, WPARAM wParam, : LPARAM lParam) : { : switch (nCode) : { : case HCBT_ACTIVATE: : PostMessage(g_hwndPost, MYWM_APPACTIVATE, wParam, : (LPARAM)(((LPCBTACTIVATESTRUCT)lParam)->hWndActive)); : break; : case HCBT_MINMAX: : PostMessage(g_hwndPost, MYWM_APPMINMAX, wParam, lParam); : break; : case HCBT_DESTROYWND: : PostMessage(g_hwndPost, MYWM_APPDESTROYWND, wParam, lParam); : break; 亂po參考試看看,說不定會有用,當初寫一個滑鼠監測程式是卡在這裡 好像是不能全都是用PostMessage(..) 如果現在最上層的執行視窗 是本身自已的執行程式的話 就要用SendMessage(..) (原理 也就是現在進來讀取這個DLL檔的 是本身自已的程式) 我之前寫的那個程式是要滿足這樣的規則 不知道xliu需不需要 HWND hWnd1, hWnd2; hWnd1 = GetForegroundWindow(); hWnd2 = GetParent(hWnd1); if (!hWnd2) hWnd2 = hWnd1; if (hWnd2 == m_hWnd)//為本程式的執行視窗 SendMessage(m_hWnd, WM_COMMAND, dwArg, NULL); else PostMessage(m_hWnd, WM_COMMAND, dwArg, NULL); : } : return CallNextHookEx(g_hhook, nCode, wParam, lParam); : } : BOOL WINAPI SetWindowHook(int ThreadId, HWND hWndPost) : { : HHOOK hhook; : if (g_hhook != NULL) return(FALSE); : g_hwndPost = hWndPost; : hhook = SetWindowsHookEx(WH_CBT, WndHook_HookProc, g_hinstDll, : ThreadId); : InterlockedExchange((PLONG) &g_hhook, (LONG) hhook); : return(g_hhook != NULL); : } : BOOL WINAPI ReleaseWindowHook() : { : BOOL fOK = TRUE; : if (g_hhook == NULL) : return(FALSE); : fOK = UnhookWindowsHookEx(g_hhook); : g_hhook = NULL; : return(fOK); : } : int WINAPI GetDllVersion() : { : return(CBTHOOK_VERSION); : } : BOOL APIENTRY DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) : { : switch (fdwReason) : { : case DLL_PROCESS_ATTACH: : g_hinstDll = hinstDll; : break; : case DLL_THREAD_ATTACH: : case DLL_THREAD_DETACH: : case DLL_PROCESS_DETACH: : break; : } : return(TRUE); : } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.25.174 ※ 編輯: badpp 來自: 140.112.25.174 (06/26 23:51)