我想屏蔽系统默认的TAB键的功能来在我的组件中重新定义它,请高手指点。

解决方案 »

  1.   

    unit TrappingTabs;interfaceuses
      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.
      

  2.   

    //w98
    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);  
    }
      

  3.   

    这么复杂?!
    请问有没有简单一些的办法,比如API函数可以实现屏蔽
      

  4.   

    在Tform类中声明
    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;
      

  5.   

    如果要对整个系统有效采用 Hook ;上面的代码稍稍改一下即可
      

  6.   


    CM_DIALOGKEY消息是在TCustomForm中声明并实现了对VK_TAB的处理,只要在Tcustomform中改写就行了,具体是什么消息从源码中可以看出.  TCMDialogKey = TWMKey;
      

  7.   

    我是开发了一个报表组件,想实现Tab键移动选择单元格。组件继承TWinControl。我试过上面的方法,好像行不通。
      

  8.   

    CM_DIALOGKEY消息是delphi封装的消息,专门用来处理tab和方向键切换焦点控键的消息
      

  9.   

    可以用 Form 的 onkeydown捕捉tab,onkeypress不可以