`

触摸屏应用相关技术之二——鼠标键盘hook

    博客分类:
  • VC++
阅读更多

触摸屏应用相关技术之二——鼠标键盘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;
}

0
0
分享到:
评论

相关推荐

    C#按键精灵,低级鼠标键盘Hook及发送按键 带源码

    第二个知识点是“模拟鼠标键盘输入”。这通常涉及到Windows API中的`SendInput`函数。`SendInput`允许程序模拟用户输入,包括键击、鼠标移动和点击等行为。在C#中,我们需要创建一个`INPUT`结构体,填充相应的键盘或...

    C#全局鼠标键盘Hook (备查)

    C#全局鼠标键盘Hook (备查) 这个类可以让你得到一个在运行中程序的所有键盘或鼠标事件 并且引发一个带KeyEventArgs参数的.NET事件以便你很容易使用这些信息

    C++全局键盘鼠标Hook

    总的来说,C++全局键盘鼠标Hook是一种强大的技术,它可以让我们深入操作系统内部,实现对用户输入的精细控制。然而,这也要求开发者具备扎实的Windows API知识和高度的责任感,以确保其应用在合法和安全的范围内。在...

    C#中全局鼠标、键盘Hook的应用方法.doc

    在C#中实现全局鼠标和键盘Hook,主要是为了在应用程序之外捕获系统级别的输入事件。全局Hook允许开发者跟踪用户在任何窗口或程序中的鼠标和键盘活动。虽然.NET Framework不直接支持全局Hook,但通过使用WinAPI函数,...

    用mfc实现hook,屏蔽了键盘和鼠标消息,留有默认后门

    总结,用MFC实现Hook技术可以有效地监控和处理键盘鼠标消息,但如果不慎留下默认后门,可能导致严重的安全问题。因此,在编程时必须重视安全性,遵循最佳实践,防止恶意利用。对于HookTest这样的项目,应着重审查...

    用Hook编写的鼠标键盘记录程序

    在本项目“用Hook编写的鼠标键盘记录程序”中,开发者利用Hook机制来记录用户的鼠标和键盘活动,这在软件开发、测试、数据分析以及安全研究等多个方面都有广泛应用。 首先,我们要理解什么是Hook。在Windows操作...

    通过hook技术,模拟鼠标的操作

    在本例中,我们将关注如何利用Hook来模拟鼠标操作,这在自动化测试、游戏开发、辅助工具等领域有着广泛应用。 首先,我们要了解Windows操作系统中的消息机制。Windows采用事件驱动的模型,当用户进行鼠标操作时,...

    DXInput来做的键盘HOOK的软件源码

    ### DXInput实现键盘HOOK技术详解 #### 一、概述 DXInput实现的键盘HOOK技术是一种在Windows环境下通过DirectInput API捕获键盘输入的方法。这种方法广泛应用于游戏开发、自动化测试及键盘事件监听等领域。本篇...

    HOOK——鼠标连点器

    编程语言:CPP/MFC 主要功能: 获取鼠标坐标 统计鼠标左/右键单击/双击次数,滚轮转动次数 计算鼠标从按下到弹起经历的时间 设置鼠标双击速度 鼠标自动连点,可自定义点击次数、点击间隔时间

    VB Hook 键盘、鼠标消息

    在这个主题中,我们将深入探讨VB Hook技术,以及如何应用于键盘和鼠标消息的捕获。 首先,我们要理解Windows消息机制。在Windows操作系统中,所有的用户交互,包括键盘敲击和鼠标移动,都会被转换成特定的消息,并...

    VB 鼠标、键盘 HOOK

    在VB(Visual Basic)编程中,鼠标和键盘的HOOK技术是一种高级技巧,它允许程序员捕获和处理系统级的输入事件,即使这些事件不在应用程序的焦点窗口内。这个技术主要涉及Windows API(应用程序接口),通过调用特定...

    hook入门,带键盘hook源代码与学习资料

    学习键盘Hook及相关技术,可以参考以下资源: 1. Microsoft官方文档:Windows Hooks - 提供了详细的API说明和技术介绍。 2. 开源项目:GitHub上有很多开源的Hook实现,如EasyHook、libHooker等,可以从中学到实际...

    VB.NET全键盘鼠标Hook附测试

    【VB.NET全键盘鼠标Hook附测试】是一个关于在VB.NET环境下实现全局键盘和鼠标事件捕获的教程。在这个项目中,开发者将学习如何利用钩子技术来监听并处理系统的键盘和鼠标输入事件,这对于开发需要监控用户输入或者...

    MFC制作基于全局hook的记录键盘工具

    【文件名称列表】:“hook盗取”可能指的是这个项目包含了一个名为“hook”的部分,可能是一个DLL文件,用于实现全局键盘钩子的功能,以及一个可能与“盗取”相关的组件,可能用于收集和存储键盘记录数据。...

    键盘鼠标操作记录,利用winhook

    标题中的“键盘鼠标操作记录,利用winhook”指的是在Windows操作系统中通过WinHook技术来捕获和记录用户的键盘和鼠标活动。WinHook是Windows API提供的一种机制,允许开发者注册钩子(hook)来监听特定类型的系统...

    Hook 鼠标、键盘事件

    在IT领域,"Hook鼠标、键盘事件"是一个常见的技术手段,用于监听和处理用户的输入行为。这主要涉及到操作系统级别的编程,尤其是Windows API的使用。在Windows操作系统中,Hook机制允许程序在其他进程执行特定操作...

    QT-HOOK鼠标键盘_低级钩子

    QT-HOOK鼠标键盘_低级钩子是一种技术,它允许开发者在Windows操作系统中截取和处理底层的鼠标和键盘输入事件。这个项目是用Visual Studio 2015开发的,并且利用了QT库的5.10版本。通过设置低级钩子,程序能够捕获到...

    在C#中使用全局鼠标、键盘Hook

    在C#编程中,有时我们需要捕获系统的全局鼠标和键盘事件,这通常涉及到Windows API的使用,特别是通过创建钩子(Hook)来实现。全局钩子允许我们的应用程序监听系统范围内的输入事件,无论焦点在哪个窗口。下面我们...

    Win32键盘Hook的Delphi编程.pdf

    本文将重点介绍第二种方法——利用键盘Hook技术实现系统范围的热键。 #### Win32按键Hook技术细节 Hook是Windows操作系统中一种特殊的消息处理机制,允许开发者设置子程序来监控系统中的消息传递,并在消息到达...

Global site tag (gtag.js) - Google Analytics