※ 引述《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)