屏幕事件录制器 (DLL)






4.91/5 (32投票s)
屏幕事件录制器 (DLL) 展示了如何创建 DLL/应用程序(可以与 RunDll32.exe 一起使用的应用程序)。
引言
本文介绍了一个功能强大的 DLL。我说它功能强大,因为它比标准库 DLL 具有一些优势。这个 DLL 不仅可以链接到你的应用程序;它还可以作为独立的应用程序运行。
描述
几乎每一次开发者开发一个库时,都会创建一个单独的应用程序来使用它。但有时,GUI 中的逻辑非常简单,无需单独的应用程序。通过使用 Windows 提供的 RunDll.exe 工具(通常在 System32 文件夹下),开发者可以自动在 DLL 本身中提供所需的 GUI。这样就无需编写一个单独的应用程序来使用它。这样的 DLL 不仅可以用 Win32 API 编程,你也可以选择使用 MFC/ATL/WTL 库。
RunDLL
MSDN: Windows 中包含的 Run DLL 工具 (Rundll32.exe) 使您能够调用从 32 位 DLL 导出的函数。这些函数必须具有以下语法:
void CALLBACK EntryPoint( HWND hwnd, // handle to owner window HINSTANCE hinst, // instance handle for the DLL LPTSTR lpCmdLine, // string the DLL will parse int nCmdShow // show state );
Windows NT/2000/XP:可以创建函数的 Unicode 版本。Rundll32
首先尝试查找名为 EntryPointW
的函数。如果找不到该函数,它会尝试 EntryPointA
,然后是 EntryPoint
。要创建支持 Windows 95/98/ME 上的 ANSI 和其他系统上的 Unicode 的 DLL,请导出两个函数:EntryPointW
和 EntryPoint
。
当我们的主函数 PlayFile
被调用时,HWND hwnd
指向 RunDLL
窗口类。这个窗口通常是隐藏的,并且 RunDll.exe 应用程序中的主线程正在运行其消息循环。因此,要终止正在运行的线程,您只需要调用 PostQuitMessage()
。DLL/应用程序能够录制/播放用户输入事件。它可以被视为一个功能齐全的应用程序,能够录制鼠标和键盘活动。可以创建一个文件(.evr)并在稍后播放。这对于自动化应用程序测试非常有用。
如何使用
独立运行
要将此 DLL 作为独立应用程序使用,您可以创建一个具有以下内容的快捷方式:
%windir%\System32\RunDll32.exe C:\Program Files\EventRecorder\MacRcrd.dll,PlayFile
您还可以使用导出的注册表设置文件(.reg),该文件可用于将事件录制器文件扩展名注册到您的计算机,这样您就可以使用资源管理器通过上下文菜单命令执行录制器文件。
REGEDIT4 [HKEY_CLASSES_ROOT\.evr] @="EventFile" [HKEY_CLASSES_ROOT\EventFile] @="Event File" [HKEY_CLASSES_ROOT\EventFile\DefaultIcon] @="C:\\Progra~1\\EventRecorder\\MacRcrd.dll" [HKEY_CLASSES_ROOT\EventFile\shell] @="" [HKEY_CLASSES_ROOT\EventFile\shell\Start Player] [HKEY_CLASSES_ROOT\EventFile\shell\Start Player\command] @="RunDll32.exe C:\\Progra~1\\EventRecorder\\MacRcrd.dll,PlayFile /file:%1" [HKEY_CLASSES_ROOT\EventFile\shell\Play Events] [HKEY_CLASSES_ROOT\EventFile\shell\Play Events\command] @="RunDll32.exe C:\\Progra~1\\EventRecorder\\MacRcrd.dll,PlayFile /play /file:%1"
静态或动态链接到其他应用程序
将此 DLL 作为静态链接到您的应用程序也是可能的。通过简单地包含以下内容,可以轻松完成
#include "MacRcrdImport.h"
在您的项目中。此事件录制器 DLL (MacRcrd.dll) 公开以下接口:
HRESULT InstallCBT( LONG_PTR lEventObj, LONG_PTR lEventObjInstance, DWORD fdwOptions ); HRESULT UninstallCBT(); HRESULT InstallRecorder( LONG_PTR lEventObj, LONG_PTR lEventObjInstance, DWORD fdwOptions ); HRESULT UninstallRecorder(); HRESULT InstallPlayer( LONG_PTR lEventObj, LONG_PTR lEventObjInstance, DWORD fdwOptions ); HRESULT UninstallPlayer();
函数 InstallRecorder
在系统中安装一个日志记录挂钩,而 InstallPlayer
安装一个日志播放挂钩。您可以提供一个 CALLBACK 函数作为事件对象或窗口句柄。目前我不推荐使用窗口句柄,因为回调方法提供了更多功能。回调必须遵循此原型:
typedef LRESULT (CALLBACK* PFNCALLBACK)(int nCode, WPARAM wParam, LPARAM lParam, LONG_PTR dwInstance);
我建议您查看 PlayFile.cpp 文件,其中有如何使用的示例。请记住,WM_CANCELJOURNAL
会被发布到您的 MFC 应用程序,但在 RunDll32.exe 中,此消息不容易看到。为了在您的 DLL 中看到此消息,您需要运行自己的消息循环,使用 GetMessage
或 PeekMessage
,或者您也可以安装一个 GetMsgProc
挂钩过程函数。
结论
我在本文中介绍了一个 DLL/应用程序,它与控制面板应用程序(原理相同)没有太大区别,但比常规 DLL 具有一些优势。在软件设计中,DLL/应用程序可能非常有用,并可能为您的设计提供一个非常有吸引力的解决方案。该项目演示了各种技术,例如:
- 使用日志记录器和播放器(
WH_JOURNALRECORD
和WH_JOURNALPLAYBACK
) - 在控制面板中使用 ComCtl32 版本 6,或者使用由 RunDll32.exe 运行的 DLL
- 从源代码导出和重命名导出的函数
- 解析命令行参数
修订历史
- v1.5.0.0 - 错误修复,添加了
CPlayFileDlg
ATL 类 - v1.0.0.0 - 初始版本