`
totoxian
  • 浏览: 1104688 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

Windows钩子—我的需求

 
阅读更多

我一直在利用工作时间写文章,这并不能说明我不爱工作一心做自己的事,而是因为我做事非常迅速,往往将分内的工作完成以后没有事干,可是领导就不愿意了,他们不可能让我闲着,然而我又十分不情愿接受新的任务而没有得到任务额外的报酬,于是我就写一些linux方面的文章,领导当然不愿意了,他们看到我在写文章总会过来说我几句。他们怎么能看到我在写文章呢?很简单,只要我一写,他们当然能看到我写的内容,于是他们就过来了,告诉我还有别的任务要做,我讨厌这种方式,于是我想通过我的老本行避开这样的骚扰。我一向对linux感兴趣,但是这并不能说我对别的就没有兴趣,我对windows也是十分了解的,只不过我不喜欢它罢了,说实话我一开始的第一份工作就是做windows驱动的,呵呵。我对windows还是有自己的理解的,特别是windows钩子方面的内容。

既然我不想让领导看到我在做什么,那么我就有必要写一个程序来实现这一个需求,谁让咱是干这的呢!于是我想写一个程序,要点就是我输入编辑器比如“记事本”的内容不回显,但是我输入的内容却已经保存在了另外的一个位置。这个很简单,利用windows钩子就可以做到,但是必须理解windows的消息机制,这个对于我来说已经不再话下了,我对windows钩子还是十分了解的,于是我就写了一个程序,该程序运行以后无论我往编辑器写什么内容都不会被回显,但是我写的内容却已经保存在了文件里面,呵呵,道高一尺魔高一丈,我就是这样避开领导的监视的。

啥也不说了,先看我的程序的核心内容,其实就是写了一个全局钩子,该钩子钩住了所有的windows消息,然后用我自己的方式处理了以后再发送,钩子的具体定义如下:

HHOOK hHook = NULL; //钩子句柄

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)

{

PMSG pmsg = (PMSG)lParam;

if(nCode != HC_ACTION)

return 0;

if(pmsg->message==WM_IME_COMPOSITION)

{

HIMC handle;

DWORD size;

HWND hWnd = pmsg->hwnd;

if(pmsg->lParam & GCS_RESULTSTR)

{

char buff[128];

handle = ImmGetContext(hWnd); //这些API都是MS提供了输入法API,学习它们是没有意义的,用着了查就得了。

size = ImmGetCompositionString(handle, GCS_RESULTSTR,NULL, 0);

size += sizeof(WCHAR);

memset(buff, 0, sizeof(buff));

ImmGetCompositionString(handle, GCS_RESULTSTR, buff, size); //得到输入的中文字符串

fp = fopen( "c://dd.txt","a+");

fwrite( lpstr,strlen(buff),1,fp ); //将中文输入法的输入汉字写入文件

fclose(fp);

pmsg->lParam = 0; //重置消息,这样的话消息就被更改了,于是编辑器上就显示不出你输入的中文字符串了。

pmsg->wParam = 0

ImmReleaseContext(hWnd, handle);

}

}

return 0;

}

void hook()

{

hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)HookProc,/*this dll*/,0);

}

再写一个应用程序加载这个钩子,大功就告成了,就是这么简单,钩子函数的具体内容注释都有,如果不理解加之谁想用的话,直接复制就可以,呵呵。加载这个钩子以后,我写的任何内容都会被保存在c:/dd.txt文件里面,如此一来,领导就不会看到我写的是什么了,猛吧?其实windows挺好的,无论你有什么需求,它都会满足你的。

说到这里我不得不发一番感慨了,windows竟然提供了这么多策略性的API,在unix/linux中这是绝对不可能的。你可以看看MS的MSDN几乎什么都有的,你只要需要一个功能,它都会满足你的,这看起来十分不错,但是很艺术吗?不!我现在有点喝多了,有点语无伦次,但是,我还是十分欣赏unix的那种方式:策略由用户自己实现,而十分反 ”感windows的方式:为用户提供策略性的API。 像“ 输入法”这一类的API简直太“策略“化了,真的不明白为何windows的设计者要为用户提供如此的API。

不过还好,我既然用windows的API解决了我的一个实际问题,那么我就没有什么好说的了。感谢我现在用windows系统,感谢我们都用windows系统。

其实对于这个钩子我还有一些要说的,这不关windows和unix/linux的比较,而是仅仅对于windows钩子说的,如果你截获WH_KEYBOARD钩子的话,你在钩子函数里面的到的仅仅是一个键盘消息的副本,而不是键盘消息的真实值,但是WH_GETMESSAGE不一样,他所得到的就是消息的指针,你更改的指针就是实际消息。这样的话,你所得到的 lParam其实就是消息的指针值,这样的话,你就可以更改消息了,具体的流程如何还请参见windows的消息流程啦。

分享到:
评论

相关推荐

    WPF 使用windows钩子监控键盘

    Windows钩子是一种机制,允许应用程序在系统级安装一个函数,该函数会在特定事件发生时被调用,如键盘输入。在C#中,我们通常使用P/Invoke(Platform Invoke)技术来调用这些API函数。下面将详细解释如何在WPF应用中...

    Windows消息处理机制--钩子实例

    ### Windows消息处理机制——钩子实例 #### 一、钩子概述 钩子(Hook)是Windows消息处理机制中的一个重要组成部分,它允许应用程序通过设置子程序来监视指定窗口的特定消息,甚至可以监视其他进程创建的窗口。当...

    WINDOWS钩子与API截获和替换Win32 API的开发包HookAPI源码1.62版

    《深入理解WINDOWS钩子与API截获:HookAPI1.62源码解析》 Windows钩子(Hook)是微软Windows操作系统提供的一种机制,允许应用程序监视特定事件的发生,或者在这些事件发生时采取行动。钩子是Windows消息处理系统的...

    windows键盘钩子

    在Windows操作系统中,键盘钩子(Keyboard Hook)是一种机制,允许应用程序截获并处理键盘输入事件,即使这些...通过研究和分析这个示例,你可以更直观地了解如何在VC++环境中实际操作键盘钩子,并根据需求进行定制。

    全局键盘钩子演示 全局键盘钩子演示 全局键盘钩子演示

    全局键盘钩子是Windows操作系统中一种高级技术,它允许应用程序拦截和处理系统中其他应用程序的键盘事件,即使这些事件在焦点窗口之外。这种技术在开发特定类型的应用程序时非常有用,比如系统监控、输入法软件或者...

    Hook钩子\钩子程序.pdf

    根据不同的监控需求,Windows系统提供了多种类型的钩子。下面将详细介绍几种常用的钩子类型及其应用场景: ##### 1. 键盘钩子与低级键盘钩子 **键盘钩子**(Keyboard Hook)用于监控所有键盘消息,包括按键按下与...

    内置钩子程序VC MFC

    在Windows编程中,钩子(Hook)是一种机制,允许开发者拦截和处理系统或应用程序的...在实际工作中,我们需要根据需求选择合适的钩子类型,并注意处理好钩子函数的执行效率和系统资源占用,以确保程序的稳定性和效率。

    VC++鼠标键盘钩子

    在Windows编程中,钩子(Hook)是一种机制,允许应用程序拦截和处理系统消息,以便在消息传递到目标窗口之前对其进行处理。"VC++鼠标键盘钩子"是指在Visual C++环境中,利用Windows API来实现对鼠标和键盘输入事件的...

    C++完美版钩子的使用实例

    根据需求选择合适的钩子类型至关重要。 2. **定义钩子函数**:每个钩子都需要一个回调函数,当指定的事件发生时,Windows会调用这个函数。在C++中,我们需要定义一个符合特定原型的函数,比如键盘钩子的回调函数应...

    易语言鼠标钩子例程

    易语言是一种专为中国人设计的编程语言,它以简体中文作为编程界面,降低了编程的门槛,使得更多的人能够理解并参与到程序开发中。...在实践中,你需要根据具体需求调整代码,确保钩子的正确设置和有效管理。

    Hook键盘钩子.rar

    标题“Hook键盘钩子.rar”涉及的是一个C++编写的程序,它利用了Windows API中的“钩子”机制,特别是键盘钩子,来记录键盘输入。这个程序包含了一个动态链接库(DLL)文件,用于捕获和处理键盘事件。下面我们将深入...

    非常好的鼠标钩子

    在Windows API中,实现鼠标钩子主要通过`SetWindowsHookEx`函数来完成,它需要指定钩子类型(如`WH_MOUSE_LL`用于低级鼠标钩子),钩子处理程序(即你的回调函数),以及钩子的线程ID。一旦钩子被设置,每当有匹配的...

    [VB]局部钩子演示

    对于跨进程的需求,全局钩子更适合,但实现起来更复杂,需要考虑多线程和进程间通信等问题。 总结来说,VB中的局部钩子是一个强大的工具,它允许我们对应用程序内部的事件进行精细的控制。通过理解其原理并正确使用...

    全局键盘钩子SysHook

    - **权限需求**:设置全局钩子可能需要更高的权限,普通用户可能无法安装。 - **兼容性**:不是所有版本的Windows都支持全局键盘钩子,也可能受到反病毒软件的误报或阻止。 - **安全风险**:全局键盘钩子可能被...

    钩子资料整理,个人感觉不错

    一、Windows钩子类型 1. **系统级钩子**:全局钩子,适用于整个系统,无论哪个线程或进程发出指定事件,都会触发钩子。 2. **应用程序级钩子**:局部钩子,只对创建它的进程及其子进程有效。 3. **线程级钩子**:...

    vc++ hook 键盘钩子

    在Windows编程中,钩子(Hook)是一种机制,允许应用程序拦截和处理系统消息,以便在消息传递到目标窗口之前对其进行修改或记录。VC++(Visual C++)是Microsoft开发的一个集成开发环境,常用于创建Windows应用程序...

    MFC HOOK获取程序钩子

    1. **选择钩子类型**:根据需求,选择合适的钩子类型,如WH_KEYBOARD(键盘钩子)、WH_MOUSE(鼠标钩子)等。 2. **创建钩子函数**:编写处理特定事件的回调函数,这是当钩子事件发生时被调用的函数。 3. **设置钩子...

    XueTr钩子工具

    4. **可扩展性**:XueTr通常允许用户自定义钩子处理函数,这使得该工具具有很高的灵活性,可以根据需求定制特定的钩子处理逻辑。 5. **兼容性**:XueTr通常兼容多个版本的Windows操作系统,从Windows XP到Windows ...

    XP键盘钩子源码

    源码中应该定义了钩子处理函数,这个函数会接收到系统发送的键盘事件,并根据需求进行记录或屏蔽操作。同时,源码可能还包括了安装和卸载钩子的逻辑,以及可能的用户交互界面部分,用于配置或显示记录的键盘事件。 ...

    低级键盘钩子,勾你所想

    1. 定义钩子函数:钩子函数应具有特定的原型,接收键盘消息参数,并根据需求进行处理。 2. 创建线程:由于钩子函数在全局钩子链中运行,因此需要一个独立的线程来维持其生命周期。 3. 安装钩子:使用`...

Global site tag (gtag.js) - Google Analytics