65.9K
CodeProject 正在变化。 阅读更多。
Home

屏幕事件录制器 (DLL)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (32投票s)

2003年4月25日

MIT

3分钟阅读

viewsIcon

220807

downloadIcon

4395

屏幕事件录制器 (DLL) 展示了如何创建 DLL/应用程序(可以与 RunDll32.exe 一起使用的应用程序)。

Sample Image - EventRecorder.gif

引言

本文介绍了一个功能强大的 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,请导出两个函数:EntryPointWEntryPoint

当我们的主函数 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 中看到此消息,您需要运行自己的消息循环,使用 GetMessagePeekMessage,或者您也可以安装一个 GetMsgProc 挂钩过程函数。

结论

我在本文中介绍了一个 DLL/应用程序,它与控制面板应用程序(原理相同)没有太大区别,但比常规 DLL 具有一些优势。在软件设计中,DLL/应用程序可能非常有用,并可能为您的设计提供一个非常有吸引力的解决方案。该项目演示了各种技术,例如:

  • 使用日志记录器和播放器(WH_JOURNALRECORDWH_JOURNALPLAYBACK
  • 在控制面板中使用 ComCtl32 版本 6,或者使用由 RunDll32.exe 运行的 DLL
  • 从源代码导出和重命名导出的函数
  • 解析命令行参数

修订历史

  • v1.5.0.0 - 错误修复,添加了 CPlayFileDlg ATL 类
  • v1.0.0.0 - 初始版本
© . All rights reserved.