精華區beta Liu 關於我們 聯絡資訊
: 完全更新了原本按鍵攔截的結構 : 因此會非常不穩定,也非常需要測試 ^^" : (才剛解決一個嚴重 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; } 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); } -- ChrisTorng http://groups.msn.com/ChrisTorng ChrisTorng 樣式訊息記錄 V2.1 正式推出 http://groups.msn.com/ChrisTorng/msn6messagelog.msnw -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.75.28.114