灯谜生字少一笔是什么字笔

我想大家都有过忙手忙脚最小化窗口(或关闭窗口)的经历吧!原因很简单——不想让突如其来的老板、老妈、老婆看到我们电脑屏幕上正在显示的游戏、日记、MM:-) 等属于個人隐私的东东 如果能做一个程序在后台运行,当我们发出一个特殊的输入事件(我选择了鼠标左、右键同时按下)时该程序就迅速隱藏正在显示的窗口,免去人工瞄准并按下每个窗口右上方的那个小得可怜的的最小化按扭之苦了当危险解除再利用这个特殊事件使隐藏的窗口恢复。这对于像我这样小脑不太发达、心理素质又不过硬而又经常在老板的眼皮底下“悬崖骑马”的同志们来说是绝对有实战意義的于是我做了这个“魔高一丈”以实现上述功能!

首先,我们得能截获鼠标左、右键同时按下去这个事件——这并不难——设一个标志變量当鼠标发出WM_LBUTTONDOWN并且又有WM_RBUTTONDOWN消息发出时把它置“1”罢了而我要说明的是,这个“同时按下”只是一种宏观上的概念鼠标是不会同时发出兩个消息的。其次就是解决不管鼠标位于任何窗口之上都能在程序里截获(或者称为监听更准确)到鼠标发出的消息并加以过滤的问题了这是很关键的。我用了钩子船长的那只钩子(Hook)而且是全局的鼠标钩子,它给了我们跟操作系统沟通的一个机会许多比较有神秘感嘚程序(比如金山词霸的鼠标取词)都是用它实现的,稍后我将详细解释最后就是剩下能得到可见的窗口的句柄(HANDLE)并根据其句柄显示、隐藏窗口的问题了,这也没什么难的有现成的API函数——EnumWindows和ShowWindow你可以先运行一下我的程序(那个大五星,需要把它跟那个Mousehook.dll文件放在一个文件夹下)当鼠标左右键一起按下时所有的窗口都隐藏了;再一次同时按下左右键又可恢复隐藏窗口;单击任务栏右下角(托盘)的图标鈳隐藏或显示本程序窗口。


第0步、选用VC 6.0集成开发环境
第1步、由于建立全局钩子必须把钩子函数放在DLL里面,所以我们选择MFC AppWizard(DLL)创建一个新的项目命名为“Mousehook”,再选择选择MFC Extension 这里我想特别地提一下EnumWindowsProc函数前的CALLBACK跟static对于CALLBACK我想给大家一个特别江湖的解释其就是:凡是由你设计而却由Windows系统調用的函数,统称callback函数这些函数都有一定的类型,以配合Windows的调用操作——引用台湾侯师傅的话。他还说某些Windows dwThreadID)的第二个参数。这种API通瑺会在进行某种行为之后或满足某种状态的情况下调用其参数中的callback函数又由于系统在调用callback函数的时候并不会借助任何对象去调用该callback函数,所以在用类来封装callback函数时需要用static来使callback函数能够独立于对象而又属于类的成员函数。明白了不(啊?地球人都知道呀!太伤自尊了!)

第3步、在项目中加入Mousehook.cpp文件在CMousehook里封装其中加入必要的共享数据以及SetWindowsHookEx、UnhookWindowsHookEx等函数——这些API函数具体的参数的类型跟作用解释在程序代码的注释裏有(网上也到处都有我也是从网上抠下来的。一个声音高叫着——当然MSDN里也有),而把它们写在文章里就不免有骗取稿费之嫌了峩只是想解释一下为什么需要使用一个共享的数据段,如下: SHARED"将mydata数据段设置为一个可读写的共享段在程序里加入预编译指令,或在开发環境的项目设置里也可以达到设置数据段属性的目的我就不一一赘述了。


我前面讲过系统通过调用放在DLL中的钩子回调函数来实现全局鉤(钩取所有窗口的鼠标消息),操作系统对DLL的操作仅仅是把DLL映射到需要它的进程的虚拟地址空间里去也就是说,DLL函数中的代码所创建嘚任何对象(包括变量)都归调用它的线程或进程所有“DLL在WIN32中什么都不拥有”——这句话很重要。比如我们在DLL里建立了一个变量a而我們的这个DLL文件又被两个进程所调用,这两个进程的中都用到了a可这绝对是两个不同存储单元中存储的两个a它们之间没有丝毫的联系。给其中一个赋值也绝对不会影响到另一个而对于本程序的一些数据是需要在不同的进程中保持唯一的(也可以说是一致),比方说: GlobalWndHandle[100]它是鼡来保存程序做了隐藏的窗口之句柄的数组当程序运行,我在任意窗口A中同时按下了鼠标左、右键由于设置了鼠标钩子,系统会调用DLLΦ的钩子处理函数截获消息并加以处理即把目前的可见窗口隐藏并把窗口句柄保存到GlobalWndHandle[100]数组中以备将来显示之用。如果不把GlobalWndHandle[100]放到一个共享嘚数据段里系统就会在目前我们截获鼠标消息的A窗口的进程的地址空间里开辟HWND GlobalWndHandle[100]来存储窗口句柄。这样对于其他进程就不能方便地得到这個进程存入GlobalWndHandle[100]数组的数据了这时只能将GlobalWndHandle[100]等需要跨进程访问的变量数据放在一个共享的数据段里了。另外需要特别注意——必须给这些变量赋初值(就象我在程序代码里傻呼呼地写了100个NULL一样。你可以不初始化这个数组试验一下有助于你理解我上面的话),否则编译器会把沒有赋初始值的变量放在一个叫未被初始化的数据段中

modules”编辑框里填入Mousehook.lib(此文件是与dll一起生成的,当编译一个隐式调用dll的exe时lib文件起到提供dll引出函数接口地址的作用,如果此路径设置不正确程序是无法进行连接的)文件的存放路径这样就可以放心使用dll里定义的CMousehook类的成员叻。如下:

}
两木重一心火烧东门城。生字尐一笔是什么字笔月土一同行。... 两木重一心火烧东门城。
生字少一笔是什么字笔月土一同行。

生字少一笔是什么字笔:牛两木重┅心:未。火烧东门城:灶月土一同行:肚。一

你对这个回答的评价是

你对这个回答的评价是?

}

我要回帖

更多关于 生字少一笔是什么字 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信