首先声明此文没有任何新的地方,俗话说阳光之下无原创。写下这个短文仅仅是对前几天做的一个小事情的总结,也许有可能对一些初学者起到一定的帮助作用,则善莫大焉。
先看任务要求:需要实现全局的鼠标钩子,但是是在后台运行的,希望安装程序之后在系统启动时自动启动,并且监视一个具体的设备,当该设备插入时,启动全局钩子;当该设备从系统删除时,撤销全局钩子。非常简单的一句话概括了任务。
再看解决方案:当拿到这个任务的时候,我们大概的解决思路和关键技术在于几个方面:1. 钩子技术的实现,包括钩子的创建和撤销,因为是鼠标钩子所以牵涉到动态连接库的实现和调用;2.后台运行的实现,直接想法应该是应用windows服务程序,这样的程序可以在系统启动是自动启动并且运行于后台。
钩子DLL没有什么难题,不进行详细解释。关于windows服务程序的实现,需要监视设备的插入/删除,另外这样的程序的调试也稍稍有点不同,就是在debug的菜单里面,关联process来进行调试。实现设备的监视关键代码如下:
ServiceMain(DWORD dwArgc, PWSTR *pszArgv)
{
Sleep(3000);
// Register the handler function for the service
RegisterServiceCtrlHandlerEx(
s_service->m_name,(LPHANDLER_FUNCTION_EX)ServiceCtrlHandler, 0);
if (s_service->m_statusHandle == NULL)
{
throw GetLastError();