15,979
社区成员
发帖
与我相关
我的任务
分享
/*全局低级钩子 指令运行时,关闭物理键盘和鼠标,不管虚拟键盘和鼠标*/
HHOOK gMouseHook = NULL; //鼠标钩子
HHOOK gKBordHook = NULL; //键盘钩子
#define DW_EXTRA_DIFF_VIRTUAL_AND_REAL 4294967295
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code >= HC_ACTION && (wParam == WM_KEYDOWN || wParam == WM_KEYUP)) //有键按下
{
DWORD vk_code = ((KBDLLHOOKSTRUCT*)lParam)->vkCode;
KBDLLHOOKSTRUCT* pkbs = (KBDLLHOOKSTRUCT*)lParam;
if (vk_code == 119 || pkbs->dwExtraInfo == DW_EXTRA_DIFF_VIRTUAL_AND_REAL)
{
return CallNextHookEx(gKBordHook, code, wParam, lParam);
}
return TRUE;
}
return CallNextHookEx(gKBordHook, code, wParam, lParam); //将消息还给钩子链,不要影响别人
}
LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code >= HC_ACTION ) //有键按下
{
BOOL bEvent = FALSE;
MSLLHOOKSTRUCT *pkbhs = (MSLLHOOKSTRUCT *)lParam;
switch (wParam)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
case WM_MOUSEMOVE:
bEvent = TRUE;
break;
}
if (bEvent && pkbhs->dwExtraInfo == DW_EXTRA_DIFF_VIRTUAL_AND_REAL)
{
return CallNextHookEx(gMouseHook, code, wParam, lParam);
}
return TRUE;
}
return CallNextHookEx(gMouseHook, code, wParam, lParam); //将消息还给钩子链,不要影响别人
}
void InstallHook()
{
int codeMouse = 0;
int codeKBord = 0;
if (gMouseHook == NULL)
{
gMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, GetModuleHandle(NULL), 0);
codeMouse = GetLastError();
}
if (gKBordHook == NULL)
{
gKBordHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(NULL), 0);
codeMouse = GetLastError();
}
}
void UninstallHook()
{
if (gMouseHook) {
UnhookWindowsHookEx(gMouseHook); // 卸载钩子
gMouseHook = NULL;
}
if (gKBordHook)
{
UnhookWindowsHookEx(gKBordHook); // 卸载钩子
gKBordHook = NULL;
}
}
int CSchedulerThread::Exec() //线程执行函数
{
while (1)
{
DoEveryLoop();
if (GetQuestPack(*m_pQPack))
{
LOG.LOGINF("%s Begin...", m_pQPack->GetSerialNo().c_str());
BOOL bRet = FALSE;
wcomm::charstring sRes;
this->SetTaskSTime();
int s;
if(CIM.SetRunSignal(s))
{
InstallHook(); //安装钩子
bRet = m_pEventEngine->Exec(m_pQPack->GetLuaText());
sRes = m_pEventEngine->getError();
UninstallHook();//卸载钩子
CIM.UnSetRunSignal();
}
else
{
sRes = CIM.GetInterruptDescrible(s);
}
//保存指令最后执行结果 和 坐标
EventTask::Instance()->setResult(bRet);
this->SetResult(bRet, sRes);
this->WriteTask();
InitQuestPack();
PutFileResult(m_pQPack->GetSerialNo(), m_pQPack->GetTaskType(), bRet);
this->SetTaskETime();
this->SetTaskResult(sRes);
this->WriteTaskLog();
LOG.LOGINF("%s End(%s) ...", m_pQPack->GetSerialNo().c_str(), sRes.c_str());
}
else
Sleep(100);
}
return 0;
}