我想屏蔽系统默认的TAB键的功能来在我的组件中重新定义它,请高手指点。
解决方案 »
- Delphi中捕获了一个滚动条滚动的 消息,如何判断滚动条的方向
- 无线电数据发送格式问题?
- 谁有Wingdows优化大师的愿码?
- 使用TIdftp控件,出现错误:error message:list index out of bounds(0)
- 一个复制文件夹的问题!
- 请问什么是UML
- delphi dbexpress控件的sqlquery组件
- 我控制面板中的程序有些卸载不了啦。怎么办
- 关于SQL的初级问题,分数全部给第一个正确解决问题的朋友。
- 怎样建立一个删除视图的存储过程?
- 谁能帮我解决这个问题,要多少分给多少分!!!!
- 在用delphi 的quickrep做报表时preview不能显示数据????
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids;type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
procedure WMGetDlgCode(var msgIn: TWMGetDlgCode); message WM_GETDLGCODE;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.WMGetDlgCode;
begin
inherited;
msgIn.Result := msgIn.Result or DLGC_WANTTAB;
end;procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_TAB then
ShowMessage('Tab');
end;end.
1.{屏蔽}
var temp:integer;
begin
SystemParametersInfo(SPI_Screensaverrunning,1,@temp,0);
end;2.{恢复}
var temp:integer;
begin
SystemParametersInfo(SPI_Screensaverrunning,0,@temp,0);
end; //w2000
首先需要安装钩子:HHOOK SetWindowsHookEx(int iHookCode,HOOKPROC lpfn,HINSTANCE hModule,DWORD dwThreadId);其中,第一个参数是钩子的类型;第二个参数是钩子函数的地址;第三个参数是包含钩子函数的模块句柄;第四个参数指定监视的线程。如果指定确定的线程,即为线程专用钩子;如果指定为空,即为全局钩子。其中,全局钩子函数必须包含在DLL(动态链接库)中,而线程专用钩子还可以包含在可执行文件中。得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它。钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的进一步传递。下面是实现底层键盘钩子的部分源代码:LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam, LPARAM lParam){ BOOL fEatKeystroke = FALSE; If (nCode == HC_ACTION) { switch (wParam) { case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: PKBDLLHOOKSTRUCT p =(PKBDLLHOOKSTRUCT) lParam; fEatKeystroke =((p->vkCode ==VK_TAB) && ((p->flags & LLKHF_ALTDOWN)!= 0)) ||((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||((p->vkCode == VK_ESCAPE) &&((GetKeyState(VK_CONTROL) & 0x8000) != 0)); break;} }return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam)); } int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int){ //安装底层键盘钩子HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,hinstExe, 0); MessageBox(NULL,TEXT(“Alt+Esc, Ctrl+Esc, and Alt+Tab are now disabled.”),TEXT(“Click \u8220“Ok\u8221” to terminate this application and re-enable these keys.”),TEXT(“Disable Low-Level Keys”), MB_OK); UnhookWindowsHookEx(hhkLowLevelKybd); return(0);
}
请问有没有简单一些的办法,比如API函数可以实现屏蔽
procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
实现
procedure TForm1.CMDialogKey(var Message: TCMDialogKey);
begin
if message.CharCode=VK_TAB then
Showmessage('VK_TAB')
else
inherited;
end;
CM_DIALOGKEY消息是在TCustomForm中声明并实现了对VK_TAB的处理,只要在Tcustomform中改写就行了,具体是什么消息从源码中可以看出. TCMDialogKey = TWMKey;