触摸屏应用相关技术之二——鼠标键盘hook
上文提及,在系统启动过程中,到访问内容完全占据桌面的间隙,桌面直接暴露给访客,这是危险的间隙,需要想办法解决。
我们的应对措施是:在这段间隙中,对鼠标键盘进行完全锁定,直至访问内容全屏打开。开放鼠标左键,允许访客交互内容。
利用hook,我们可以在客户端统计点击数,及长时间无人点击时自动切回内容首页。
为此需要利用hook技术,并在Winlogon中载入。
在注册表中登记项如下:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\CET]
"Asynchronous"=dword:00000000
"Dllname"="SetHook.dll"
"Impersonate"=dword:00000000
"Logoff"="StopProcessAtWinLogoff"
"Logon"="StartProcessAtWinLogon"
SetHook.dll中的关键代码如下:
…
//全局变量
HHOOK hKeyBoardHook=NULL; //keyboard hook
HHOOK hMouseHook=NULL; //mouse hook
HWND hOutPutWnd=NULL; //Display Pass Wnd
…
//Winlogon加载函数
VOID APIENTRY StartProcessAtWinLogon (PWLX_NOTIFICATION_INFO pInfo)
{
//start hook
hThread= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&dwThreadId);
//get jk_path
getJkPath();
}
…
//Winlogon卸载函数
VOID APIENTRY StopProcessAtWinLogoff (PWLX_NOTIFICATION_INFO pInfo)
{
//MessageBox(NULL,"系统正在注销!","Winlogon Notification Package",MB_OK);
}
…
//鼠标键盘hook
DWORD WINAPI ThreadFunc()
{
HDESK hDesk;
//_H同一桌面上进程之间只能发送窗口消息。无法跨进程与其他桌面发送它们。
//_H同样,Windows消息是限制应用程序定义挂钩。
//_H特定桌面中运行的进程挂钩过程将〈〈只获得针对同一桌面上创建窗口消息。〉〉
//_H详见http://support.microsoft.com/kb/171890/zh-cn
//_H所以,这里必须设置钩子所在线程的桌面为Default桌面
//_H才能使得钩子所在线程能接收到Default桌面的消息
hDesk = OpenDesktop("Default",0,FALSE,MAXIMUM_ALLOWED);
SetThreadDesktop(hDesk);
CloseHandle(hDesk);
//_H设置低级键盘钩子,屏蔽非SAS window的热键
//_H需要#define _WIN32_WINNT 0x0500
hMouseHook=SetWindowsHookEx(WH_MOUSE_LL,MouseHookProc,glhInstance,0);
hKeyBoardHook=SetWindowsHookEx(WH_KEYBOARD_LL,KeyBoardProc,glhInstance,0);
if (hMouseHook == NULL)
{
OutputDebugString("Set hook failed..");
//__leave;
return 1;
}
OutputDebugString("钩子成功设置");
// ::ShowWindow(::FindWindow("ProgMan",NULL),SW_HIDE);
// ::ShowWindow(::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);
//_H在非GUI线程中使用消息钩子必须主动接收并分发收到的消息
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
…
//取消hook
void CloseMe(){
if(hOutPutWnd!=NULL)
::SendMessage(hOutPutWnd,WM_IDLE,2,0);
BOOL mHook=UnhookWindowsHookEx(hMouseHook);
BOOL kHook=UnhookWindowsHookEx(hKeyBoardHook);
TerminateThread(hThread,1);
CloseHandle(hThread);
hThread=NULL;
}
…
//向桌面程序发送鼠标消息,在此基础上可以统计点击数,及长时间无人点击自动切回内容首页
void OnEvent(){
::SendMessage(hOutPutWnd,WM_IDLE,1,0);
}
…
//如果检查到桌面程序被强制关闭了,再启动它!
void ShellJK(){
PROCESS_INFORMATION pi;
STARTUPINFO sti;
ZeroMemory(&sti,sizeof(sti));
sti.cb=sizeof(sti);
sti.lpDesktop="winsta0\\default";
CreateProcess(jk_file,NULL,NULL,NULL,FALSE,0,NULL,jk_path, &sti, &pi);
}
//键盘hook,按Ctrl+ESC或者Ctrl+Space退出hook
LRESULT WINAPI KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{ //keyboard hook proc
BOOL bUnlock1=FALSE;
BOOL bUnlock2=FALSE;
OnEvent();
if (nCode == HC_ACTION){
switch (wParam) {
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
bUnlock1=(p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0);//Ctrl+Esc
bUnlock2=(p->vkCode == VK_SPACE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0);//Ctrl+Space
break;
}
}
if(bUnlock1 || bUnlock2){
CloseMe();
}
return CallNextHookEx(hKeyBoardHook,nCode,wParam,lParam);
}
…
//鼠标hook,在hOutPutWnd为NULL前屏蔽所有事件,之后允许左键
LRESULT WINAPI MouseHookProc(int nCode,WPARAM wParam ,LPARAM lParam)
{
//LPMOUSEHOOKSTRUCT lpMouse=(MOUSEHOOKSTRUCT FAR*)lParam;
if(wParam==WM_RBUTTONDOWN | wParam==WM_RBUTTONUP
| wParam==WM_LBUTTONDBLCLK){
return TRUE;
}
if(hOutPutWnd!=NULL){
if(wParam==WM_LBUTTONDOWN && nCode>=0){
if(!IsWindow(hOutPutWnd)){
ShellJK();
return TRUE;
}
OnEvent();
}
return CallNextHookEx(hMouseHook,nCode,wParam,lParam);
}
else
return TRUE;
}
…
//桌面程序全屏之后通知hook程序其窗口句柄
BOOL CHook::StartHook(HWND hwnd, int span, int dev)
{
if(hThread==NULL)
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&dwThreadId);
hOutPutWnd=hwnd;
return TRUE;
}
分享到:
相关推荐
C#全局鼠标键盘Hook (备查) 这个类可以让你得到一个在运行中程序的所有键盘或鼠标事件 并且引发一个带KeyEventArgs参数的.NET事件以便你很容易使用这些信息
两个工具,简单实现了按键精灵的功能,带源码。 1.从xml脚本中读取数据,简易的模拟鼠标键盘输入。调用自己SendInput API封装好的DLL。 2.全局鼠标键盘钩子,生成模拟输入脚本。
C#中全局鼠标、键盘Hook的应用方法.doc
C++全局键盘鼠标钩子程序HOOK,也可以注入到单一程序.。C++全局键盘鼠标钩子程序HOOK,也可以注入到单一程序.。
编程语言:CPP/MFC 主要功能: 获取鼠标坐标 统计鼠标左/右键单击/双击次数,滚轮转动次数 计算鼠标从按下到弹起经历的时间 设置鼠标双击速度 鼠标自动连点,可自定义点击次数、点击间隔时间
用Hook编写的鼠标键盘记录程序,可以记录鼠标键盘的操作,并进行回放
VB 鼠标、键盘 HOOK VB 鼠标、键盘 HOOK
如何在C#中使用全局鼠标、键盘Hook 源码参考 结合msdn 原文在http://support.microsoft.com/default.aspx?scid=kb;en-us;318804
通过hook windows的鼠标消息,实现拦截以及模拟鼠标动作
本资源使用VS2015开发,QT版本5.10,截取处理Windows消息,HOOK鼠标键盘,获取所有按键信息,可区分鼠标侧键及滚轮上下滚动消息。
键盘钩子 hook 键盘钩子 hook 键盘钩子 hook 键盘钩子 hook 键盘钩子 hook 键盘钩子 hook 键盘钩子 hook 键盘钩子 hook
VB Hook 键盘、鼠标消息。Hook内容详尽。
用里面的图形界面聊天工具打命令可以得到指定文件 dll是主要工程
hook 键盘 鼠,标键盘鼠标操作记录,简单的winhook利用
全局键盘鼠标钩子,适用于VB.NET,可用VS进行测试,内附源码测试,有了这个应该可以学习钩子的建立,以及在主程序的调用
全局的Hook,可以获取MouseMove,MouseClick,MouseDown Up,DoubClick. 滚轮,Press,键盘的KeyPress,keyDown,KeyUp
鼠标键盘全局钩子以及windows api hook代码, 鼠标键盘全局钩子以及windows api hook代码 vs2013 工程
vb.net (c#)中鼠标,键盘钩子Hook
用Hook(即钩子)技术编写的应用程序添加到Windows的任务栏的指示区中就能够 很好的达到这个目的。我在参考了API帮助文档基础上,根据在Delphi开发环境中 的具体实现分别对这两部分进行详细论述。 一、Hook(钩子)的...