应用SetWinEventHook截获Windows事件

用SetWindowsHookEx可以截获Windows中的消息,然而对于更高级一点的Windows事件(如:弹出菜单事件、ATL+TAB切换事件等等),可以用SetWinEventHook来截获.

SetWinEventHook创建的钩子也分为进程内和进程外两种,进程内钩子效率高但必须以DLL形式存在,因为其须映射到别的进程中.在这个Demo中我采用进程外钩子来截获所有事件。

钩子例程如下所示:

VOID CALLBACK WinEventsProc( HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime )
{
    switch( dwEvent )
    {
    case EVENT_SYSTEM_SWITCHSTART:
        AtlMessageBox( NULL, _T("Alt+Tab开始") ); 
        break;

case EVENT_SYSTEM_SWITCHEND:
        AtlMessageBox( NULL, _T("Alt+Tab结束") ); 
        break;

case EVENT_SYSTEM_MENUPOPUPSTART:
        AtlMessageBox( NULL, _T("弹出菜单开始") ); 
        break;

case EVENT_SYSTEM_MENUPOPUPEND:
        AtlMessageBox( NULL, _T("弹出菜单开始") ); 
        break;


         
    }
}

安装进程外HOOK(截获所有进程的所有事件):

HWINEVENTHOOK hHook =  ::SetWinEventHook( EVENT_MIN , EVENT_MAX , NULL, WinEventsProc, 0, 0, WINEVENT_OUTOFCONTEXT  );

使用完一定要记得卸载HOOK:

::UnhookWinEvent( hHook );

时间: 2024-10-07 10:23:23

应用SetWinEventHook截获Windows事件的相关文章

SetWinEventHook 事件钩子(有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等)good

相信消息钩子大家听的比较多,消息钩子能够在应用程序处理系统消息之前将其截获,提前处理并可以决定是否继续将消息往下传送,有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等等,要截获这些事件可以使用SetWinEventHook,它的原型如下: HWINEVENTHOOK WINAPI SetWinEventHook(  __in  UINT eventMin,  __in  UINT eventMax,  __in  HMODULE hmodWinEventPro

使用EventLog类写Windows事件日志

在程序中经常需要将指定的信息(包括异常信息和正常处理信息)写到日志中.在C#3.0中可以使用EventLog类将各种信息直接写入Windows日志.EventLog类在System.Diagnostics命名空间中.我们可以在“管理工具” > "事件查看器“中可以查看我们写入的Windows日志,如下图所示: 下面是一个使用EventLog类向应用程序(Application)写入日志的例子,日志类型使用EventLogEntryType枚举类型指定. Code highlighting

Windows 事件查看器(收集)

原文:Windows 事件查看器(收集) 事件查看器相当于一本厚厚的系统日志,可以查看关于硬件.软件和系统问题的信息,也可以监视 Windows 的安全事件 提示:除了可以在"控制面板→管理工具"中找到"事件查看器"的踪影外,也可以在"运行"对话框中 手工键入"%SystemRoot%\system32\eventvwr.msc /s"打开事件查看器窗口. 1. 应用程序日志 包含由应用程序或系统程序记录的事件,主要记录程序运

Windows事件日志写入SQL Server并PowerBI统计分析

在这里我准备了2台系统,一个Windows Server 2012 R2的域控服务器DC01,一台SQL on CentOS7的SQL数据库服务器 首先我使用SQL Manager Studio连接到SQL数据库服务器创建需要存放Windows转发事件日志的数据库"EventCollections" CREATE DATABASE EventCollections GO USE EventCollections GO -- the table name loosely relates

为什么要使用日志管理?-syslog和Windows事件日志

为什么要使用日志管理?syslog和Windows事件日志 日志管理 - 确保网络安全的先决条件日志给予您有关网络活动的第一手信息.日志管理确保日志中隐藏的网络活动数据转换为有意义的可操作的安全信息.日志管理是网络安全管理员为保护网络而要完成的首要任务.日志管理包括收集.安全存储.规范化.分析.生成报表和告警.日志收集· 日志收集必须是非侵入性的.· 需要从网络中出现的不同设备.服务器和应用程序组中收集日志.· 最好以无代理的方式收集日志.在某些网络环境中,以使用代理的方式进行的日志收集应以可选

使用rsync备份Windows事件日志

使用rsync备份Windows事件日志 Windows版软件:cwRsyncServer 安装比较简单一直下一步即可,输入到创建账号页面的时候可以自己设置一个密码. 服务器端:cwRsyncServer_4.0.5_Installe.zip 客户端:cwRsync_4.0.5_Installer.zip 由于特殊原因需要收集Windows的Application.Security.Setup.System事件日志,而事件日志的位置是在C:\Windows\System32\winevt\Log

使用Windows事件查看器调试崩溃

本文讨论如何使用Windows事件查看器获取实际崩溃的模块以及代码中崩溃的位置.示例代码是用C++编写的,以生成不同类型的崩溃,例如访问冲突和堆栈溢出. 简介 我经常听同事和QA那里听说,一个特定的崩溃很容易在客户机上重现,而不是在他们的机器上重现.这是一个棘手的问题,因为开发人员无法在客户机上调试崩溃.最终的结果是支持团队和客户之间无休止的沟通,甚至是现场会议.很少有聪明的程序员自己开发一个崩溃日志系统来确定导致崩溃的代码.很少有人会在代码中全面地实现try-catch块,以缩小问题的范围.

windows事件

<script language="javascript"> function GetCharCount( textObj ) { if (textObj.length > 10) { alert("请重新输入你的姓名(少于10个字符)"); } else { alert("您输入了"+textObj.length+"个字符"); } } </script> 请输入您的姓名(少于10个字符): N

C#操作windows事件日志项

1 /// <summary> 2 /// 指定事件日志项的事件类型 3 /// </summary> 4 public enum EventLogLevel 5 { 6 /// <summary> 7 /// 错误事件.它指示用户应该知道的严重问题(通常是功能或数据的丢失). 8 /// </summary> 9 Error = 1, 10 /// <summary> 11 /// 警告事件.它指示并不立即具有重要性的问题,但此问题可能表示将来