19,504
社区成员
发帖
与我相关
我的任务
分享
CRITICAL_SECTION k_csec; // Critical Section handle
BOOL MPKeyProcRunning=FALSE; // is TRUE if thread runs
#define WH_KEYBOARD_LL 20
typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM);
typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK);
typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef HHOOK (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD);
static _CallNextHookEx CallNextHookEx;
static _SetWindowsHookExW SetWindowsHookEx;
static _UnhookWindowsHookEx UnhookWindowsHookEx;
typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
HINSTANCE g_hHookApiDLL = NULL;
HHOOK g_hInstalledLLKBDhook = NULL;
CWnd* m_pOwner;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
UINT CKeyProcess::KeyProcThread( LPVOID pParam )
{
return TRUE;
}
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode,WPARAM wParam,
LPARAM lParam)
{
//RETAILMSG(1,(L"載入KeyboardProc "));
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
if (!MPKeyProcRunning)
{
goto _Exit_;
}
if(wParam == WM_KEYUP)
{
//RETAILMSG(1,(L"key down\n"));
switch(pkbhs->vkCode)
{
case 'A':
//RETAILMSG(1,(TEXT("You pressed Key A\r\n")));
::PostMessage(m_pOwner->m_hWnd, (DWORD)WM__HARDKEY_A,
(WPARAM)NULL,
(LPARAM)NULL);
break;
case 'B':
::PostMessage(m_pOwner->m_hWnd, (DWORD)WM__HARDKEY_B,
(WPARAM)NULL,
(LPARAM)NULL);
break;
case 'C':
::PostMessage(m_pOwner->m_hWnd, (DWORD)WM__HARDKEY_C,
(WPARAM)NULL,
(LPARAM)NULL);
break;
case 'D':
::PostMessage(m_pOwner->m_hWnd, (DWORD)WM__HARDKEY_D,
(WPARAM)NULL,
(LPARAM)NULL);
break;
case 'E':
::PostMessage(m_pOwner->m_hWnd, (DWORD)WM__HARDKEY_E,
(WPARAM)NULL,
(LPARAM)NULL);
break;
case 'F':
::PostMessage(m_pOwner->m_hWnd, (DWORD)WM__HARDKEY_F,
(WPARAM)NULL,
(LPARAM)NULL);
break;
case 0x0d:
::PostMessage(m_pOwner->m_hWnd, (DWORD)WM__HARDKEY_SEND,
(WPARAM)NULL,
(LPARAM)NULL);
//::PeekMessage(pkbhs-> WM_KEYDOWN, m_pOwner->m_hWnd, 0, 0, PM_REMOVE);
break;
case 0x1b:
::PostMessage(m_pOwner->m_hWnd, (DWORD)WM__HARDKEY_ESC,
(WPARAM)NULL,
(LPARAM)NULL);
break;
}
}
// LRESULT RetVal = CallNextHookEx( NULL, nCode, wParam, lParam );
_Exit_:
return CallNextHookEx(NULL,nCode,wParam,lParam);
}
CKeyProcess::CKeyProcess()
{
}
CKeyProcess::~CKeyProcess()
{
}
BOOL CKeyProcess::InitKeyProc(CWnd* pPortOwner)
{
/*
DWORD ThreadId = 0L;
if (MPKeyProcRunning) return TRUE;
m_pOwner = pPortOwner;
CWinThread* m_Thread;
if (!(m_Thread = AfxBeginThread(KeyProcThread, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL)))
return FALSE;
RETAILMSG(1,(TEXT("Key Thread started\r\n")));
InitializeCriticalSection(&k_csec);
MPKeyProcRunning=TRUE;
*/
if (MPKeyProcRunning) return TRUE;
m_pOwner = pPortOwner;
RETAILMSG(1,(L"載入ActivateKBHook\r\n"));
//we need to manually load these standard Win32 API calls
//MSDN states that these aren't supported in WinCE
SetWindowsHookEx = NULL;
CallNextHookEx = NULL;
UnhookWindowsHookEx = NULL;
//now load the coredll.dll
g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
if(g_hHookApiDLL == NULL)
{
//something is awfully wrong
//the dll has to be present
RETAILMSG(1,(L"載入coredll.dll失敗\r\n"));
return false;
}
else
{
//load the SetWindowsHookEx API call
//the SetWindowsHookEx function installs an application-defined hook procedure into a hook chain.
//You would install a hook procedure to monitor the system for certain types of events.
//here we use use the hook to monitor kyeboard events
SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
if(SetWindowsHookEx == NULL)
{
//this means that MS has really stopped supporting this API in WinCE
RETAILMSG(1,(L"獲取SetWindowsHookExW地址失敗\r\n"));
return false;
}
else
{
//install the KB hook
//the hande needs to be saved for default processing of the events and to uninstall the hook, once we are done with it
g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, 0, 0);
if(g_hInstalledLLKBDhook == NULL)
{
int re;
re=GetLastError();
RETAILMSG(1,(L"SetWindowsHookEx失敗%d \r\n",re));
return false;
}
}
//load CallNextHookEx() API call
//the CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain.
//we use this call for default processing of events.
CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx"));
if(CallNextHookEx == NULL)
{
RETAILMSG(1,(L"獲取_CallNextHookEx地址失敗\r\n"));
return false;
}
//load UnhookWindowsHookEx() API
//the UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function.
//we use this call to unistall the hook.
UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL, _T("UnhookWindowsHookEx"));
if(UnhookWindowsHookEx == NULL)
{
RETAILMSG(1,(L"獲取_UnhookWindowsHookEx地址失敗\r\n"));
return false;
}
}
MPKeyProcRunning=TRUE;
return TRUE;
}
BOOL CKeyProcess::CloseKeyProc(void)
{
if (MPKeyProcRunning)
{
MPKeyProcRunning=FALSE;
}
return TRUE;
}