HANDLE m_hKeyFunThread=NULL;
UINT m_keyFunThreadId=0;
m_hKeyFunThread = (HANDLE)_beginthreadex(NULL, 0, (_beginthreadex_proc_type)RdpFunThreadFun, parent, 0, &m_keyFunThreadId);
DWORD WINAPI RdpFunThreadFun(LPVOID ptPara)
{
keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(keyboardHook);
return 0;
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
int iOpt=0;
int iVal1=0;
int iVal2=0;
int iSys=0;
int iWin=0;
int lWin=0;
int rWin=0;
int iShow=g_showFileDlg;
char chaBuf[256]={0};
if (nCode == HC_ACTION)
{
PKBDLLHOOKSTRUCT pKeyData = reinterpret_cast<PKBDLLHOOKSTRUCT>(lParam);
int iExt=(pKeyData-> flags & LLKHF_EXTENDED);
int iAlt=(pKeyData-> flags & LLKHF_ALTDOWN);
iVal1=pKeyData->vkCode;
iVal2=wParam;
lWin=GetKeyState(VK_LWIN);
rWin=GetKeyState(VK_RWIN);
switch(wParam)
{
case WM_SYSKEYDOWN:
iSys=1;
case WM_KEYDOWN:
if((pKeyData->vkCode==VK_LWIN)||(pKeyData->vkCode==VK_RWIN))
{
iWin=1;
}
break;
case WM_SYSKEYUP:
iSys=1;
case WM_KEYUP:
if((pKeyData->vkCode==VK_LWIN)||(pKeyData->vkCode==VK_RWIN))
{
iWin=1;
}
break;
default:
break;
}
}
if(!iWin && (iSys || ((!iSys)&&(lWin || rWin))) && !iShow)
return true;
else
return CallNextHookEx(NULL, nCode, wParam, lParam);
}