问一个小问题,关于屏蔽键盘按键的问题。在线等待!多谢! 在键盘的左下角第2个键不是有一个“开始菜单”键吗?按一下那个键就会弹出开始菜单.我想实现的功能是:我运行一个Project1.exe,点一下按钮,然后再按"开始菜单"键,弹不出开始菜单, 请问怎么实现? 多谢!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 unit Unit3;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Controls, Forms, Dialogs, StdCtrls; {按键消息的结构,Delphi中没有。 注意:这个结构在Windows NT 4 sp3以上系统 中才能使用}type tagKBDLLHOOKSTRUCT = packed record vkCode: DWORD; //虚拟键值 scanCode: DWORD; //扫描码值(没有用过) {一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是 根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。} flags: DWORD; time: DWORD; //消息时间戳 dwExtraInfo: DWORD; //和消息相关的扩展信息 end; KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT; PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; //这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义const WH_KEYBOARD_LL = 13; //定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下const LLKHF_ALTDOWN = $20; //----声明各个函数-------------function LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;procedure hookstar; //设置钩子procedure hookend;var hhkLowLevelKybd: HHOOK;implementation { 功能:低级键盘钩子的回调函数,在里面过滤消息 参数:nCode 是Hook的标志 WParam 表示消息的类型 LParam 是一个指向我们在上面定义的哪个结构KBDLLHOOKSTRUCT的指针 返回值:如果不是0的话windows就把这个消息丢掉,程序就不会再收到这个消息了。 }function LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;var fEatKeystroke: BOOL; p: PKBDLLHOOKSTRUCT;begin Result := 0; fEatKeystroke := FALSE; p := PKBDLLHOOKSTRUCT(lParam); //nCode值为HC_ACTION时表示WParam和LParam参数包涵了按键消息 if (nCode = HC_ACTION) then begin //拦截按键消息并测试是否是Ctrl+Esc、Alt+Tab、和Alt+Esc功能键。 case wParam of WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP: fEatKeystroke := ((p.vkCode = VK_TAB) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or // Alt+Tab ((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or // (p.vkCode = VK_Lwin) or (p.vkCode = VK_Rwin) or (p.vkCode = VK_apps) or //上面是屏蔽WIN按键 //((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN) and (P.vkCode = VK_Delete)) or ((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0)) or ((p.vkCode = VK_F4) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or ((p.vkCode = VK_SPACE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or (((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN and p.flags) and (P.vkCode = VK_Delete))) //AND (p.flags = true) ; end; end; if fEatKeystroke = True then Result := 1; if nCode <> 0 then Result := CallNextHookEx(0, nCode, wParam, lParam);end; //----------------------回调函数结束-----------------------------------------procedure hookstar; //设置钩子begin //设置键盘钩子 if hhkLowLevelKybd = 0 then begin hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0); if hhkLowLevelKybd <> 0 then //MessageBox(0, '键盘钩子设置成功!', '提示', MB_OK) else MessageBox(0, '键盘钩子设置失败!', '提示', MB_OK); end else //MessageBox(Handle, '键盘钩子已设置!', '提示', MB_OK);end; //---------------------设置钩子完成-----------------procedure hookend; //卸载键盘钩子begin if hhkLowLevelKybd <> 0 then if UnhookWindowsHookEx(hhkLowLevelKybd) <> False then begin //MessageBox(0, '系统热键恢复使用!', '提示', MB_OK); hhkLowLevelKybd := 0; end else //MessageBox(Handle, '键盘钩子卸载失败!', '提示', MB_OK) else //MessageBox(Handle, '没有发现键盘钩子!', '提示', MB_OK);end; //-------------卸载键盘钩子完成-------------------------end. 再来个屏蔽CTRL+ALT+DEL的-------------正想要,上次给了200分结贴了也没得到答案,我需要能在xp系统下屏蔽的。 [email protected]-----------最好给个完整的工程给我, 我用过钩子程序。要看完整的例子才看得懂。 :) 为何DLL 在调用进反回整数不会报错,而反回字符串就会报错 关于删除Listview某行数据的问题 DLEPHI 预编译指令 判断字符串问题 delphi重大发现???? 在delphi6中使用PrintRange 枚举! 显示问题???? 高手请救命。如何得到FTP服务器上的目录列表及文件名(300分) 寻找深圳mm,up有分 好里有delphi6.0中文版下载? ■■ 关于使用VCLSkin融合窗体的问题? delphi 数据包 date:Sun, 04 Jan 2009 07:18:12 GMT
unit Unit3;
interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
Dialogs, StdCtrls;
{按键消息的结构,Delphi中没有。
注意:这个结构在Windows NT 4 sp3以上系统
中才能使用}
type
tagKBDLLHOOKSTRUCT = packed record
vkCode: DWORD; //虚拟键值
scanCode: DWORD; //扫描码值(没有用过)
{一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是
根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。}
flags: DWORD;
time: DWORD; //消息时间戳
dwExtraInfo: DWORD; //和消息相关的扩展信息
end;
KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; //这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义
const WH_KEYBOARD_LL = 13;
//定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下
const LLKHF_ALTDOWN = $20;
//----声明各个函数-------------
function LowLevelKeyboardProc(nCode: Integer;
WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
procedure hookstar; //设置钩子
procedure hookend;
var
hhkLowLevelKybd: HHOOK;
implementation
{
功能:低级键盘钩子的回调函数,在里面过滤消息
参数:nCode 是Hook的标志
WParam 表示消息的类型
LParam 是一个指向我们在上面定义的哪个结构KBDLLHOOKSTRUCT的指针
返回值:如果不是0的话windows就把这个消息丢掉,程序就不会再收到这个消息了。
}function LowLevelKeyboardProc(nCode: Integer;
WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
fEatKeystroke: BOOL;
p: PKBDLLHOOKSTRUCT;
begin
Result := 0;
fEatKeystroke := FALSE;
p := PKBDLLHOOKSTRUCT(lParam);
//nCode值为HC_ACTION时表示WParam和LParam参数包涵了按键消息
if (nCode = HC_ACTION) then
begin
//拦截按键消息并测试是否是Ctrl+Esc、Alt+Tab、和Alt+Esc功能键。
case wParam of
WM_KEYDOWN,
WM_SYSKEYDOWN,
WM_KEYUP,
WM_SYSKEYUP:
fEatKeystroke :=
((p.vkCode = VK_TAB) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or // Alt+Tab
((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or //
(p.vkCode = VK_Lwin) or (p.vkCode = VK_Rwin) or (p.vkCode = VK_apps) or //上面是屏蔽WIN按键
//((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN) and (P.vkCode = VK_Delete)) or
((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0)) or
((p.vkCode = VK_F4) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
((p.vkCode = VK_SPACE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
(((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN and p.flags) and (P.vkCode = VK_Delete))) //AND (p.flags = true) ;
end;
end; if fEatKeystroke = True then
Result := 1;
if nCode <> 0 then
Result := CallNextHookEx(0, nCode, wParam, lParam);
end;
//----------------------回调函数结束-----------------------------------------procedure hookstar; //设置钩子
begin
//设置键盘钩子
if hhkLowLevelKybd = 0 then
begin
hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL,
LowLevelKeyboardProc,
Hinstance,
0);
if hhkLowLevelKybd <> 0 then
//MessageBox(0, '键盘钩子设置成功!', '提示', MB_OK)
else
MessageBox(0, '键盘钩子设置失败!', '提示', MB_OK);
end
else
//MessageBox(Handle, '键盘钩子已设置!', '提示', MB_OK);
end;
//---------------------设置钩子完成-----------------procedure hookend; //卸载键盘钩子
begin
if hhkLowLevelKybd <> 0 then
if UnhookWindowsHookEx(hhkLowLevelKybd) <> False then
begin
//MessageBox(0, '系统热键恢复使用!', '提示', MB_OK);
hhkLowLevelKybd := 0;
end
else
//MessageBox(Handle, '键盘钩子卸载失败!', '提示', MB_OK)
else
//MessageBox(Handle, '没有发现键盘钩子!', '提示', MB_OK);
end;
//-------------卸载键盘钩子完成-------------------------end.
-------------
正想要,上次给了200分结贴了也没得到答案,我需要能在xp系统下屏蔽的。
-----------
最好给个完整的工程给我, 我用过钩子程序。要看完整的例子才看得懂。 :)