`
totoxian
  • 浏览: 1034536 次
  • 性别: 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的消息流程啦。

分享到:
评论

相关推荐

    blogit:一个基于 git 的博客脚本,用 Python 编写为 git 钩子

    我需要一些更个性化并适合我的需求的东西,所以我想出了这个代码。 它不是很漂亮,大部分可以优化,但它对我有用。 它可能不适合您的需求,但由您来决定。 这个脚本只是一个应该作为 git hook 运行的 python 脚本...

    windows编程资料大全

    在编写程序的过程中,我遇到了这样的需求:在基于Windows 9x 或 Windows NT4.0 的程序中,要求确定键盘、鼠标处于空闲状态的时间。查询了有关资料文档以后,发现Windows 9x和Windows NT4.0 没有提供API或系统调用来...

    AHOOKAPI(一)——HOOK基础+一个鼠标钩子实例

    HOOK(钩子,挂钩)是一种实现Windows平台下类似于中断的机制[24]。HOOK机制允许应用程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达目标窗口之前将其捕获,从而得到对消息的...

    messageboxmanager.zip

    C# Winform 消息提示框MessageBox 按钮显示英文,它提供了一个 MessageBoxManager 类。该类使用Windows钩子,来根据需求改变 MessageBox 按钮的文本

    SenchaCmd-5.1.0.26-windows

    Sencha cmd 是一个跨平台的命令行工具,它从你应用程序的新创建到部署入产品中的整个生命周期都提供了...13.代码生成的钩子:可以指定到一个页面或者在工作控件分享所有页面,例如检查daunting的惯例或者产生新的模型。

    研究论文-基于Google Earth的人机交互平台设计.pdf

    实现地图定位、实时坐标获取和地理位置搜索功能,并结合Windows Hook(钩子)机制,实现GE视图放大缩小和绘制轨迹的功能,达到人机交互的目的,满足应用基本需求.所设计的人机交互平台具有三维场景逼真、界面友好、...

    dbdwiggler:可访问性工具,可自动执行《死者之死》中钩子和摆动时的挣扎

    我认为可以肯定地说,几乎整个DbD社区都讨厌挣扎的机制。 您有多少次因为手指滑脱而意外松开了第二个钩子,这有可能使您的3个队友为此付出代价? 该技工所做的只是破坏游戏并导致RSI。 这个简单的自动热键脚本会在您...

    易语言-全局钩子支持库1.2#3版(第三方)

    易语言eHook.fne支持库中文名为易语言全局钩子支持库,支持库实现对全局钩子的支持。 易语言eHook.fne支持库为一般支持库,需要易系统3.0版本的支持,需要系统核心支持库3.0...操作系统需求: Windows 易语言官方论坛

    SVN使用手册中文版快速入门

    我偶然在Windows得到“Access Denied”错误,它们看起来随即出现。 在FreeBSD,某些操作(特别是svnadmin create)有时会挂起。 我可以在web浏览器看到我的版本库,但是svn checkout给我一个301 Moved Permanently...

    基于Google Earth的人机交互平台设计 (2010年)

    实现地图定位、实时坐标获取和地理位置搜索功能,并结合Windows Hook(钩子)机制,实现GE视图放大缩小和绘制轨迹的功能,达到人机交互的目的,满足应用基本需求.所设计的人机交互平台具有三维场景逼真、界面友好、...

    SVN使用手册中文版.chm

    我偶然在Windows得到“Access Denied”错误,它们看起来随即出现。 在FreeBSD,某些操作(特别是svnadmin create)有时会挂起。 我可以在web浏览器看到我的版本库,但是svn checkout给我一个301 Moved Permanently...

    UsualToolCMS v8.0 bulid20190922

    安装须知:本系统您可以适量修改以适应您的需求,但不得派生系统或发布、分发派生版本。UsualToolCMS授权方式分为免费授权和商业授权,您需要独立承担使用该系统后所产生的所有法律责任及义务。首先您的系统需要支持...

    基于虚拟设备的访问控制模型 (2011年)

    访问控制系统需具备便携性、易用性。基于此,提出一种Windows 操作系统I/O 模型下的访问控制...根据需求进行模块设计,使用API 钩子、虚拟设备驱动和过滤驱动等技术开发,测试包括性能的模型特点,并给出2 种应用扩展。

    mestral:Git的简单挂钩管理

    中性 Git的钩子管理器关于Mestral可以轻松管理您的Git挂钩。 结合所谓的挂钩,形成适合您需求的挂钩。安装可以通过简单的安装脚本来安装Mestral: $ ruby -e " $( curl -fLsS ...

    缺陷管理_缺陷管理流程_缺陷生命周期

    失效(Failure):软件运行时产生的外部异常行为结果,表现与用户需求不一致,功能能力终止,用户无法完成所需要的应用。 禅道是第一款国产的优秀开源项目管理软件。先进的管理思想,合理的软件架构,简洁实效的操作...

    使用Subversion进行版本控制(针对 Subversion 1.4)

    URL 和路径需求 使用 C 和 C++ 以外的语言 代码样例 9. Subversion 完全参考 Subversion 命令行客户端:svn svn选项 svn子命令 svnadmin svnadmin选项 svnadmin子命令 svnlook svnlook选项 svnlook子命令 svnsync ...

    UsualToolCMS 一款内容管理系统及快速建站框架

    安装须知:本系统您可以适量修改以适应您的需求,但不得派生系统或发布、分发派生版本。UsualToolCMS授权方式分为免费授权和商业授权,您需要独立承担使用该系统后所产生的所有法律责任及义务。首先您的系统需要支持...

Global site tag (gtag.js) - Google Analytics