怪物猎人OL运行会屏蔽所有多媒体热键,怎么解除热键占用屏蔽

打击外挂及工作室的严正声明-怪物猎人Online-MHO-官方网站-腾讯游戏-所有猎人在此集结
  为了生存,与巨大的怪物不断战斗,反复磨练狩猎技巧,从而慢慢的成为一个精英猎人。在《怪物猎人OL》的世界中,猎人之所以会受到人们的信赖,是因为猎人们不仅拥有一身精湛的狩技,同时猎人也会守护他人,以自己的言行成为人们心目中的楷模。  但是,近日《怪物猎人OL》官方发现有极少量猎人玩家使用外挂进行游戏,破坏了正常的游戏秩序。  《怪物猎人OL》官方在此也特别强调一下,使用外挂进行游戏,不仅破坏游戏的平衡,污染游戏环境,也对其他猎人正常的游戏体验造成了影响。更有可能危害到外挂使用者的账号安全。还请诸位猎人珍惜公平游戏环境,不辱猎人之名。  目前,只要系统检测到游戏运行同时有外挂(包括按键精灵、简单游等等在内的第三方辅助软件)启动,无论是否已经运用到《怪物猎人OL》之中,即会被判定为使用外挂,并且遭受到严厉的处罚。  1:游戏内刷屏广告,主要包括:诈骗、宣传政治、代练、工作室、外挂等,视严重程度进行禁言至封号(7—30天)处罚。  2:使用外挂或第三方软件对游戏提供辅助,首次发现封停7天,之后每次发现封停30天。  3:对工作室行为,一旦被确认即永久封号,并且《怪物猎人OL》官方将保留通过司法途径提起诉讼的权利。  4:对于任何制作、销售、传播外挂的个人,我们绝不姑息。任何制作和销售外挂的行为,都属于严重违法行为。《怪物猎人OL》官方将保留通过司法途径提起诉讼的权利。  《怪物猎人OL》官方对于外挂和工作室,向来都是采取零容忍的态度。我们号召所有猎人共同抵制外挂和工作室,一起创造一个清静稳定的狩猎环境。《怪物猎人Online》运营团队日
健康游戏公告
抵制不良游戏
拒绝盗版游戏
注意自我保护
谨防受骗上当
适度游戏益脑
沉迷游戏伤身
合理安排时间
享受健康生活在vista/Win7中,用CB如何屏蔽CTRL+ALT+DEL热键
回复讨论(解决方案)
/document/viewdoc/?id=424
操作注册表
大家帮忙看一下,这个地方的一个DLL,用得着不?我调用试了下,编译正常,运行失败。
/viewthread.php?tid=91160
没人理会啊?大家要是碰到应用系统需要屏蔽这三个键的时候,是如何处理呢?
我所知道的是要用驱动,这个驱动怎么写俺就不懂了。。
来哥们儿,,
/eros412/blog/item/76cf907e7af7d93c0dd7da3d.html
用VS2010&+&WDK7600.1&编译得到
FilterCtrlAltDel.sys&
参考这里的代码&加载到自己的程序中
http://www.oidn.net/post/21.html
等下将工程文件加上.sys一起打包给你。
呵呵,功能没有死牛的强大,勉强用吧,欢迎改进了回传。
顺便说下这个不能卸载(重启后就卸载了),但是可以使用快捷键&ctrl&+&alt&+&f10来控制是否启用屏蔽ctrl&+&alt&+&del
当然这个驱动处理得有点点问题,第一次ctrl&+&alt&+&del它没有屏蔽到,而且我加了ctrl&+&alt&+&f10&这个开关&需要用最快的速度&按下&f10后放开才有效,需要你细致的处理一下。
&&&&&&&&&&&&if(ctrl_state&&alt_state&&KeyData[i].MakeCode==0x53)&{
if&(my_flag&==&TRUE)
KeyData[i].MakeCode&=&0;
&&&&&&&&&&&&}
if(ctrl_state&&alt_state&&KeyData[i].MakeCode==0x44){//0x44&就是f10了
if&(my_flag&==&TRUE)my_flag&=&FALSE;
else&my_flag&=&TRUE;
最后下载地址在此&http://download.csdn.net/source/2812589
至于那个&ctrl&+&alt&+&f10&这个需要快速处理的情况&哪位大牛给个办法,谢谢。
另外,希望对你有用,并且分数全部给我&&&&
??真的有用???
没有得到实际的效果.期待高手回答.
在dll中注入hook,截获该消息
到底行还是不行后使用快捷导航没有帐号?
查看: 1773|回复: 23
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
本帖最后由 葉落丶椥晚秋 于
21:11 编辑
这里也再多说一句,我在贴吧前几层多加了个回复,在这里也给你们说一下,因为肯定有部分人是看这个帖子去贴吧看我的帖子的,那就是还有个大毒瘤没写,这个大毒瘤对延迟绝对会立竿见影,你们某个路径里肯定有这个:某某盘:腾讯游戏\怪物猎人Online\TCLS\Tenio\TenioDL\TenioDL.exe,这货和迅雷一样是P2P加速,就是你曾经下载的东西会给你上传,让别人下载的时候速度快点,建议也用第三步的注册表路径规则设置不允许的方法禁止运行,这个大毒瘤弄了应该网络会更好点
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
&&先说一点题外话,怪物猎人OL最低4G内存4M带宽(电信玩电信网通玩网通,这里不考虑什么移动长城那些更坑爹的,虽然电信也坑)就可以玩了,你显卡CPU好的话画质一样可以开高画质,CPU不行就还是默默游戏调低画质然后F8屏蔽人,但是显卡显存最低1G才行。笔记本和台式同型号显卡是没法比的,笔记本是阉割版(性能不如台式同型号),想最好体验游戏尽量用台式游玩。
& & 建议低配电脑比较划算加内存条开双通道,减少后台程序(比如你后台挂着的QQYY,还有一些人设置的某某视频软件等其他的开机启动,这些会占用内存,有些不止占用内存还会默默占用网速上传,这会影响你的网速,比如后台的迅雷等下载软件,你不下载东西他会默默上传,至于为什么上传,上传什么,这里就不说了,感兴趣自行百度了解)
& & 这里主要是教大家怎么防止游戏默默的给你安装上TX管家,我这里说的是游戏,不是软件,软件会有一些小地方不明显给你写着安装,前面有个勾,你可以不选,但是游戏没有这个勾的,他会默默给你装上,电脑也不会提醒,是解决这个办法,不止怪物猎人OL可以用,别的TX游戏都可以这样,是通用的方法。
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
哎呀,还不让发
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
我给贴吧地址好了,这里不让发,强行删帖
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
你们可以看了学会了自己分享给别人,因为我这算是顶风作案,保不准会被删哦
最后登录QQ注册时间阅读权限15精华0积分995帖子
采集熟练工, 积分 995, 距离下一级还需 205 积分
不错啊...........................
最后登录注册时间阅读权限10精华0积分155帖子
初涉猎场, 积分 155, 距离下一级还需 445 积分
游戏都不卡,但有时候一进副本走几步就掉线了,希望你的方法可以改善我掉线的问题。
还有这 TQMCenter.exe 和 IIPSHostApp.exe 能禁止吗?每次结束游戏后,这两个exe还在任务管理器,需要自行强行关闭。
最后登录注册时间阅读权限20精华0积分2350帖子
搬蛋高手, 积分 2350, 距离下一级还需 150 积分
本帖最后由 J-Lam 于
09:15 编辑
CairnL 发表于
游戏都不卡,但有时候一进副本走几步就掉线了,希望你的方法可以改善我掉线的问题。
还有这 TQMCenter.exe ...
IIPSHostApp.exe的在我台式电脑上试过了,把IIPSHostApp.exe去掉或禁掉,是进不了游戏,还得重装+更新。
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
CairnL 发表于
游戏都不卡,但有时候一进副本走几步就掉线了,希望你的方法可以改善我掉线的问题。
还有这 TQMCenter.exe ...
不能哦,因为会打不开游戏,你如果详细看完文字应该会看到我有说这个
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
J-Lam 发表于
IIPSHostApp.exe的在我台式电脑上试过了,把IIPSHostApp.exe去掉或禁掉,是进不了游戏,还得重装+更新。 ...
不能哦,因为会打不开游戏,你如果详细看完文字应该会看到我有说这个,你不用重装,把那个不允许的规则删掉就好了
最后登录注册时间阅读权限20精华0积分2350帖子
搬蛋高手, 积分 2350, 距离下一级还需 150 积分
葉落丶椥晚秋 发表于
不能哦,因为会打不开游戏,你如果详细看完文字应该会看到我有说这个,你不用重装,把那个不允许的规则删 ...
我之前是做一下测试,IIP这个就是进程里的腾讯端下载那个,这个比较占内存和网速,若是该程序与游戏内核分开的话,禁掉或删掉应该是没问题的,但这个文件已和游戏启动的数据链接起来了,动这个文件就等于游戏没了启动的程序,但万恶来源还是IPP,哎,没办法。
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
J-Lam 发表于
我之前是做一下测试,IIP这个就是进程里的腾讯端下载那个,这个比较占内存和网速,若是该程序与游戏内核 ...
只有TX游戏后台是个新天地
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
还有个大毒瘤没写,这个大毒瘤对延迟绝对会立竿见影,你们某个路径里肯定有这个:某某盘:腾讯游戏\怪物猎人Online\TCLS\Tenio\TenioDL\TenioDL.exe,这货和迅雷一样是P2P加速,就是你曾经下载的东西会给你上传,让别人下载的时候速度快点,建议也用第三步的注册表路径规则设置不允许的方法禁止运行,这个大毒瘤弄了应该网络会更好点
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
J-Lam 发表于
我之前是做一下测试,IIP这个就是进程里的腾讯端下载那个,这个比较占内存和网速,若是该程序与游戏内核 ...
还有个大毒瘤没写,这个大毒瘤对延迟绝对会立竿见影,你们某个路径里肯定有这个:某某盘:腾讯游戏\怪物猎人Online\TCLS\Tenio\TenioDL\TenioDL.exe,这货和迅雷一样是P2P加速,就是你曾经下载的东西会给你上传,让别人下载的时候速度快点,建议也用第三步的注册表路径规则设置不允许的方法禁止运行,这个大毒瘤弄了应该网络会更好点
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
CairnL 发表于
游戏都不卡,但有时候一进副本走几步就掉线了,希望你的方法可以改善我掉线的问题。
还有这 TQMCenter.exe ...
还有个大毒瘤没写,这个大毒瘤对延迟绝对会立竿见影,你们某个路径里肯定有这个:某某盘:腾讯游戏\怪物猎人Online\TCLS\Tenio\TenioDL\TenioDL.exe,这货和迅雷一样是P2P加速,就是你曾经下载的东西会给你上传,让别人下载的时候速度快点,建议也用第三步的注册表路径规则设置不允许的方法禁止运行,这个大毒瘤弄了应该网络会更好点
最后登录注册时间阅读权限25精华0积分3130帖子
猫车常客, 积分 3130, 距离下一级还需 1870 积分
和尚工资真高 发表于
不错啊...........................
还有个大毒瘤没写,这个大毒瘤对延迟绝对会立竿见影,你们某个路径里肯定有这个:某某盘:腾讯游戏\怪物猎人Online\TCLS\Tenio\TenioDL\TenioDL.exe,这货和迅雷一样是P2P加速,就是你曾经下载的东西会给你上传,让别人下载的时候速度快点,建议也用第三步的注册表路径规则设置不允许的方法禁止运行,这个大毒瘤弄了应该网络会更好点
最后登录注册时间阅读权限10精华0积分155帖子
初涉猎场, 积分 155, 距离下一级还需 445 积分
miniQTalk.exe / CrossProxy.exe / TQMCenter.exe / TenioDL.exe / components 都禁止了,登录游戏明显快了,掉线少了。但还得观察多几天。
最后登录注册时间阅读权限20精华0积分2350帖子
搬蛋高手, 积分 2350, 距离下一级还需 150 积分
WIN10,安全策略,是没办法,只能把额外的管家删除
09:32 上传
最后登录注册时间阅读权限10精华0积分155帖子
初涉猎场, 积分 155, 距离下一级还需 445 积分
J-Lam 发表于
WIN10,安全策略,是没办法,只能把额外的管家删除
自行新建 New Software Restriction Policies 就可以啦。
最后登录注册时间阅读权限20精华0积分2350帖子
搬蛋高手, 积分 2350, 距离下一级还需 150 积分
本帖最后由 J-Lam 于
10:29 编辑
CairnL 发表于
自行新建 New Software Restriction Policies 就可以啦。
请教一下,新建New Software Restriction Policies文件就会看到该文件里TX这恶心玩意?
现在是没有这文件夹, 这恶心玩意还存在吗?若新建才有,那不新建这个文件夹不就没有了?
还有就是TX恶心一直存在,新建New Software Restriction Policies能看到?
Powered by&&&&&&&&&&&&&&&&&&
posts - 52,comments - 180,trackbacks - 2
文章作者:
原始地址:
&&& 在编写程序的过程中,我们有时需要实现屏蔽操作系统一些热键的功能,如(Ctrl+Alt+Delete,Ctrl+Shift+Esc等)。网络上有很多关于这方面的资料,总结了一下,一般有如下两个方法:
&&& 1. 通过加载低级键盘钩子(WH_KEYBOARD_LL)截获大部分的系统热键,并屏蔽它。这个方法比较简单,但有个缺陷,那就是对Ctrl+Alt+Delete没有办法。
&&& 2. 通过远程注入DLL到winlogon进程,修改winlogon桌面下SAS窗口的回调函数,从而捕获该窗口的WM_HOTKEY消息,并屏蔽它,可以实现屏蔽ctrl+delete+alt。这个方法相对复杂,可以解决第一点中存在的问题,但是也有缺陷,那就是除了Ctrl+Alt+Delete外,大多数的其它系统热键,(包括Alt+Tab,Ctrl+Esc及左右两个Windows键)都无法屏蔽。
&&& 所以如果我们的程序需要屏蔽大量的系统热键,就应当将以上两个方法结合起来使用。dll注入有很多好处,包括可以实现对我们所运行进程的隐藏,这非常有用。当我们的进程运行后,屏蔽掉了系统热键,当然不想用户随便在进程管理器里面就kill掉,因此将以上两个方法结合的办法就是把代码通通写到dll里面,然后再一起注入到winlogon进程中。
&&& 对于上面所讲的第二点,注入到winlogon进程,没问题,可以很好的完成功能(网上有很多相关的文章及代码)。但对于第一点,如果在一个GUI程序中加载钩子,也没有问题。但现在加载的对象是winlogin进程,这个进程很特殊,它不是GUI进程,也不在系统应用程序所处的Default桌面下,因此在这个进程中加载钩子,需要注意以下几点:
&&& 1. 在需要注入的DLL代码中的DLL_PROCESS_ATTACH后面开启一个新线程,并在该线程中实现修改SAS窗口回调函数的代码以及设置低级键盘钩子。
&&& 2. 由于钩子所在的线程为非GUI线程,因此,必须在该线程成功设置钩子以后主动接收并分发收到的消息,否则钩子将不会钩到任何消息:
while(GetMessage(&msg,&NULL,&0,&0))
&&&&TranslateMessage(&msg);
&&&&DispatchMessage(&msg);
&&& 3. 由于该线程创建时默认与winlogon同属一个桌面(winlogon桌面),而其它包括explorer.exe在内的GUI程序都处在Default桌面,Windows中规定程序只能获得针对同一桌面上创建的窗口消息。所以,要让该线程能接收到用户在Default桌面下操作所产生的消息,必须在该线程中使用如下代码将它的桌面设置为Default桌面:
HDESK&hDesk&=&OpenDesktop("Default",0,FALSE,MAXIMUM_ALLOWED);
SetThreadDesktop(hDesk);
CloseHandle(hDesk);
&&& 我的程序在解决了以上问题之后,能正确将所编写的DLL注入到winlogon进程,并在DLL加载的时候开启线程,设置钩子,替换SAS窗口回调函数。从而实现屏蔽了我所能想到的所有系统热键。
&&& 附:DLL的完整源码(注入该DLL到winlogon进程的源码大家可以在网上找到)
#define&_WIN32_WINNT&0x0500&//Use&WH_KEYBOARD_LL
#include&&windows.h&
#include&&stdio.h&
//SAS&window句柄
HWND&hSASWnd&=&NULL;
//原有SAS&window回调函数地址
FARPROC&FOldProc&=&NULL;
//起屏蔽作用的新SAS&window回调函数
LRESULT&CALLBACK&SASWindowProc(HWND&hwnd,UINT&uMsg,WPARAM&wParam,LPARAM&lParam);
//枚举所有窗体句柄的回调函数
BOOL&CALLBACK&EnumWindowsProc(HWND&hwnd,LPARAM&lParam);
//Dll所创建线程的句柄
HANDLE&hThread&=&NULL;
//Dll所创建线程的ID
DWORD&dwThreadId&=&0;
//Dll所创建线程的线程函数
DWORD&WINAPI&ThreadFunc();
//_H钩子句柄
HHOOK&hHook&=&NULL;
//_H低级键盘钩子回调函数
LRESULT&CALLBACK&KeyboardProc(int,WPARAM,LPARAM);
//对外输出字符串
char&szOutput[36];
BOOL&APIENTRY&DllMain(HANDLE&hMoudle,&DWORD&dwReason,&LPVOID&lpReserved)
&&&&switch(dwReason)
&&&&&&&&case&DLL_PROCESS_ATTACH:
&&&sprintf(szOutput,"Dll成功加载于&%d&号进程。",GetCurrentProcessId());
&&&OutputDebugString(szOutput);
&&&//创建更替SAS&window回调函数的线程
&&&if(FOldProc&==&NULL)
&&&&hThread&=&CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&dwThreadId);
&&&&&&&&case&DLL_PROCESS_DETACH:
&&&sprintf(szOutput,"Dll成功卸载。",GetCurrentProcessId());
&&&//MessageBox(NULL,&szOutput,&"ZZ",&MB_ICONINFORMATION&|&MB_OK);
&&&OutputDebugString(szOutput);
&&&//恢复原有SAS&window的回调函数
&&&if(FOldProc&!=&NULL)
&&&&&&&&&&&&&&&&SetWindowLong(hSASWnd,GWL_WNDPROC,long(FOldProc));
&&&&&&&&&&&
&&&//_H卸载低级键盘钩子
&&&if(hHook&!=&NULL)
&&&&if(!UnhookWindowsHookEx(hHook))
&&&&&OutputDebugString("Unhook&failed..");
&&&&&break;
&&&&OutputDebugString("键盘钩子成功取消");
&&&TerminateThread(hThread,1);
&&&CloseHandle(hThread);
&&&&&&&&case&DLL_THREAD_ATTACH:
&&&&&&&&case&DLL_THREAD_DETACH:
&&&&return&TRUE;
//Dll所创建线程的线程函数
DWORD&WINAPI&ThreadFunc()
&&&&//打开Winlogon桌面
&&&&HDESK&hDesk&=&OpenDesktop("Winlogon",0,FALSE,MAXIMUM_ALLOWED);
&//枚举桌面所有窗体
&&&&EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowsProc,0);
&//修改SAS&window的回调函数
&&&&if(hSASWnd&!=&NULL)
&&&&&&&&FOldProc&=&(FARPROC)SetWindowLong(hSASWnd,GWL_WNDPROC,long(SASWindowProc));
&&&&CloseHandle(hDesk);
&//_H同一桌面上进程之间只能发送窗口消息。无法跨进程与其他桌面发送它们。
&//_H同样,Windows消息是限制应用程序定义挂钩。
&//_H特定桌面中运行的进程挂钩过程将〈〈只获得针对同一桌面上创建窗口消息。〉〉
&//_H详见http:///kb/171890/zh-cn
&//_H所以,这里必须设置钩子所在线程的桌面为Default桌面
&//_H才能使得钩子所在线程能接收到Default桌面的消息
&hDesk&=&OpenDesktop("Default",0,FALSE,MAXIMUM_ALLOWED);
&SetThreadDesktop(hDesk);
&CloseHandle(hDesk);
&//_H设置低级键盘钩子,屏蔽非SAS&window的热键
&//_H需要#define&_WIN32_WINNT&0x0500
&hHook&=&SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardProc,GetModuleHandle(NULL),0);
&if&(hHook&==&NULL)
&&OutputDebugString("Set&hook&failed..");
&&return&1;
&OutputDebugString("键盘钩子成功设置");
&//_H在非GUI线程中使用消息钩子必须主动接收并分发收到的消息
&while(GetMessage(&msg,&NULL,&0,&0))
&&TranslateMessage(&msg);
&&DispatchMessage(&msg);
&return&1;
//枚举所有窗体句柄的回调函数
BOOL&CALLBACK&EnumWindowsProc(HWND&hwnd,LPARAM&lParam)
&&&&char&ClassBuf[128];
&//获得当前窗体的显示文本
&&&&GetWindowText(hwnd,ClassBuf,sizeof(ClassBuf));
&&&&//在"Winlogon"桌面中查询窗口"SAS&window"。
&if(strstr(ClassBuf,"SAS&window")!=NULL)
&&&&&&&&//返回SAS&window句柄
&&hSASWnd&=&
&&&&&&&&return&FALSE;
&&&&return&TRUE;
//起屏蔽作用的新SAS&window回调函数
LRESULT&CALLBACK&SASWindowProc(HWND&hwnd,UINT&uMsg,WPARAM&wParam,LPARAM&lParam)
&&&&if(uMsg&==&WM_HOTKEY)
&&//屏蔽所有WM_HOTKEY消息
&&OutputDebugString("All&SAS&window's&hotkeys&are&disabled");
&&return&1;
&&&&&&&&WORD&wKey&=&HIWORD(lParam);
&&&&&&&&WORD&wModifier&=&LOWORD(lParam);
&&&&&&&&bool&IsCtrlDown&=&((wModifier&&&VK_CONTROL)&!=&0);
&&&&&&&&bool&IsAltDown&=&((wModifier&&&VK_MENU)&!=&0);
&&&&&&&&bool&IsShiftDown&=&((wModifier&&&VK_SHIFT)&!=&0);
&&&&&&&&//Ctrl&+&Alt&+&Del组合键
&&&&&&&&if(IsCtrlDown&&&&IsAltDown&&&&wKey&==&VK_DELETE)
&&&return&1;&//屏蔽
&&&&&&&&//Ctrl&+&Shift&+&Esc组合键,这个组合键将显示任务管理器,可根据需要是否屏蔽。
&&&&&&&&else&if(IsCtrlDown&&&&IsShiftDown&&&&wKey&==&VK_ESCAPE)
&&&&&&&&&&&&//&Do&nothing
&&&&return&CallWindowProc((WNDPROC)FOldProc,hwnd,uMsg,wParam,lParam);
//_H低级键盘钩子回调函数
LRESULT&CALLBACK&KeyboardProc(int&nCode,WPARAM&wParam,LPARAM&lParam)
&if&(nCode&==&HC_ACTION)
&&&&&&&&switch&(wParam)
&&&case&WM_KEYDOWN:&&case&WM_SYSKEYDOWN:
&&&//case&WM_KEYUP:&&&&case&WM_SYSKEYUP:
&&&PKBDLLHOOKSTRUCT&p&=&(PKBDLLHOOKSTRUCT)&lP
&&&if&(p-&vkCode&==&VK_F12)
&&&&//实现模拟按键代码
&&&&MessageBox(GetForegroundWindow(),"I'm&in&position..","ZZ",MB_OK);
&&&//屏蔽ALT+TAB
&&&else&if&((p-&vkCode&==&VK_TAB)&&&&((p-&flags&&&LLKHF_ALTDOWN)&!=&0))
&&&&OutputDebugString("ALT+TAB&is&disabled");
&&&&return&1;
&&&//屏蔽ALT+ESC
&&&else&if&((p-&vkCode&==&VK_ESCAPE)&&&&((p-&flags&&&LLKHF_ALTDOWN)&!=&0))
&&&&OutputDebugString("ALT+ESC&is&disabled");
&&&&return&1;
&&&//屏蔽CTRL+ESC
&&&else&if&((p-&vkCode&==&VK_ESCAPE)&&&&((GetKeyState(VK_CONTROL)&&&0x8000)&!=&0))
&&&&OutputDebugString("CTRL+ESC&is&disabled");
&&&&return&1;
&&&//屏蔽CTRL+SHIFT+ESC,(SAS&window中也已屏蔽)
&&&else&if&((p-&vkCode&==&VK_ESCAPE)&&&
&&&&((GetKeyState(VK_CONTROL)&&&0x8000)&!=&0)&&&
&&&&((GetKeyState(VK_SHIFT)&&&0x8000)&!=&0))
&&&&OutputDebugString("CTRL+SHIFT+ESC&is&disabled");
&&&&return&1;
&&&//屏蔽左右windows键
&&&else&if&(p-&vkCode&==&VK_LWIN&||&p-&vkCode&==&VK_RWIN)
&&&&OutputDebugString("windows&key&is&disabled");
&&&&return&1;
&&&//此处无法屏蔽CTRL+ALT+DEL,已在SAS&window中屏蔽
&&&else&if&((p-&vkCode&==&VK_DELETE)&&&
&&&&&((GetKeyState(VK_CONTROL)&&&0x8000)&!=&0)&&&
&&&&&((GetKeyState(VK_MENU)&&&0x8000)&!=&0&))
&&&&return&1;
&return&CallNextHookEx(hHook,nCode,wParam,lParam);
阅读(...) 评论() &下次自动登录
现在的位置:
& 综合 & 正文
一种屏蔽所有系统热键的方法
今天在上看到一篇论述在新建桌面中运行应用来屏幕所有系统热键的,很受启发,按照它的思路和改成了一个 vfp 类,只要直接实例化它并调用它的 run 方法即可在新建桌面中运行一个应用程序。
关于屏蔽系统热键的问题,以前看过很多方法,最好的方法是替换 GINA,但用 vfp 无法实现。这篇文章中的方法可以很容易的修改为几乎所有语言的代码。原理很简单:系统热键(如:ctrl+alt+del, alt+tab, 系统任务栏等)都只会显示在 Windows 的缺省桌面中,所以如果想要使这些东西不出现,最简单的办法就是新建一个桌面(一个全新的桌面,除了背景图片外什么也没有),然后在其中运行它,这样即使你按下系统热键,它也不会在新桌面中显示(它显示在缺省桌面中)。新建和切换桌面只要几个 api 函数即可实现,但切换到新桌面后不能用 run / shellexec 等来启动 exe,因为这些函数只能在缺省桌面中创建新进程,所以需要用到 CreateProcess 这个 api 来创建并启动新进程,它其中的一个结构参数可指定要执行进程所在的桌面。
Run 方法接收两个参数,第一个是要执行的完整文件路径及名称,第二个参数【可选】指定等待它运行多长时间后自动返回缺省桌面,缺省将一直等待到你关闭新桌面中的进程为止,下面是示例代码:
m.oDesktop = NEWOBJECT(
m.cFile = GETFILE(
m.oDesktop.Run( m.cFile )
m.oDesktop = NULL
DEFINE CLASS NewDesktop AS Custom
HIDDEN hOldDesktop
hOldDesktop = 0
HIDDEN hOldInput
hOldInput = 0
HIDDEN hNewDesktop
hNewDesktop = 0
HIDDEN pcNewDesktop
pcNewDesktop = 0
HIDDEN NewDesktopName
NewDesktopName = (
HIDDEN ErrMsg
HIDDEN PROCEDURE api_decl
DECLARE Long GetThreadDesktop IN WIN32API Long dwThreadId
DECLARE Long OpenInputDesktop IN WIN32API ;
Long dwFlags, Long fInherit, Long dwDesiredAccess
DECLARE Long CreateDesktop IN WIN32API ;
String lpszDesktop, Long lpszDevice, Long pDevmode, ;
Long dwFlags, Long dwDesiredAccess, Long lpsa
DECLARE Long SetThreadDesktop IN WIN32API Long hDesktop
DECLARE Long SwitchDesktop IN WIN32API Long hDesktop
DECLARE Long CloseDesktop IN WIN32API Long hDesktop
DECLARE Long CreateProcess IN WIN32API ;
String pszAppName, String pszCmdLine, ;
Long lpProcessAttr, Long lpThreadAttr, ;
Long bInheritHandles, Long dwCreationFlags, ;
Long lpEnvironment, String pszCurDir, ;
String lpStartupInfo, String @ lpProcInfo
DECLARE Long CloseHandle IN WIN32API Long hObject
DECLARE Long WaitForSingleObject IN WIN32API ;
Long hHandle, Long dwMilliseconds
DECLARE Long GetProcessHeap IN WIN32API
DECLARE Long HeapAlloc IN WIN32API ;
Long hHeap, Long dwFlags, Long dwBytes
DECLARE Long HeapFree IN WIN32API ;
Long hHeap, Long dwFlags, Long lpMem
DECLARE Long GetLastError IN WIN32API
This.pcNewDesktop = HeapAlloc( GetProcessHeap(), 8, LEN(This.NewDesktopName)+1 )
IF ( 0 == This.pcNewDesktop )
MESSAGEBOX(
SYS( 2600, This.pcNewDesktop, LEN(This.NewDesktopName), This.NewDesktopName )
PROCEDURE Run
------------------------------------------------------------------------
功能: 在新建桌面中运行指定的程序
入口: tcExeFile - 要执行的 exe 文件
tiTimeout - 等待执行时间(单位 ms, 0 代表一直等待到它终止并退出)
------------------------------------------------------------------------
LPARAMETERS tcExeFile, tiTimeout
RETURN .F.
IF ( PCOUNT() & 2 ) OR (
m.tiTimeout = -1
This.ErrMsg =
IF This.SwitchToNewDesktop()
This.StartProcess( m.tcExeFile, m.tiTimeout )
IF !EMPTY( This.ErrMsg )
MESSAGEBOX( This.ErrMsg, 16,
HIDDEN PROCEDURE SwitchToNewDesktop
#define DESKTOP_SWITCHDESKTOP
#define GENERIC_ALL
*!* 保存当前线程所在的桌面句柄
This.hOldDesktop = GetThreadDesktop( _vfp.ThreadId )
*!* 保存当前用户输入线程的桌面句柄
This.hOldInput = OpenInputDesktop( 0, 0, DESKTOP_SWITCHDESKTOP )
*!* 创建新桌面
This.hNewDesktop = CreateDesktop( This.NewDesktopName, 0, 0, 0, GENERIC_ALL, 0 )
IF ( 0 == This.hNewDesktop )
This.ErrMsg =
RETURN .F.
*!* 切换当前线程到新建桌面中
SetThreadDesktop( This.hNewDesktop )
IF ( 0 == SwitchDesktop( This.hNewDesktop ))
This.ErrMsg =
RETURN .F.
HIDDEN PROCEDURE StartProcess
LPARAMETERS tcExeFile, tiTimeout
typedef struct _PROCESS_INFORMATION {
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION
typedef struct _STARTUPINFO {
LPTSTR lpR
LPTSTR lpD
LPTSTR lpT
DWORD dwX;
DWORD dwY;
DWORD dwXS
DWORD dwYS
DWORD dwXCountC
DWORD dwYCountC
DWORD dwFillA
WORD wShowW
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdI
HANDLE hStdO
HANDLE hStdE
} STARTUPINFO
LOCAL cSI, cPI, hProcess
IF ( m.tiTimeout &= 0 )
m.tiTimeout = -1
m.cSI = BINTOC( 0,
+ BINTOC( This.pcNewDesktop,
m.cSI = BINTOC( LEN( m.cSI )+4,
m.cPI = REPLICATE( CHR(0), 4*4 )
IF ( 0 == CreateProcess( ;
m.tcExeFile,
This.ErrMsg =
m.hProcess = CTOBIN( LEFT( m.cPI, 4 ),
*!* 等待此进程终止
WaitForSingleObject( m.hProcess, m.tiTimeout )
*!* CloseHandle( m.hProcess )
This.ClearUp()
HIDDEN PROCEDURE ClearUp
IF ( 0 != This.hOldInput )
SwitchDesktop( This.hOldInput )
&& 切换回默认桌面
This.hOldInput = 0
IF ( 0 != This.hOldDesktop )
SetThreadDesktop( This.hOldDesktop )
&& 回复原线程桌面
This.hOldDesktop = 0
IF ( 0 != This.hNewDesktop )
CloseDesktop( This.hNewDesktop )
&& 关闭新建的桌面
This.hNewDesktop = 0
PROCEDURE Init
This.api_decl()
PROCEDURE Destroy
IF ( 0 != This.pcNewDesktop )
HeapFree( GetProcessHeap(), 0, This.pcNewDesktop )
This.pcNewDesktop = 0
进一步的,我们可以检查并限制我们的程序只能在新桌面中运行,这样可以最大程度的保护它的运行不受用户切换任务的干扰。
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 delphi 屏蔽热键 的文章

 

随机推荐