我想用箭头键当自定义的快捷键,但是一按箭头键,窗口的控件的焦点就改变了,我不想改变焦点

解决方案 »

  1.   

    试试处理OnKeyDown事件,if Key in [37..40] then
      Key := 0;
      

  2.   

    通过箭头键,在Edit之间切换:
    procedure TSetStore1Frm.Edit4KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if ((Key = vk_Return) or (Key = vk_Down)) then
      begin
        Edit5.SetFocus;
      end;
      if (Key = vk_Up) then
      begin
        Edit3.SetFocus;
      end;
    end;
     
      

  3.   

    用钩子吧,参考,参考下面,只要勾住方向键时,做你的处理就行
    全局键盘钩子(WH_KEYBOARD) 
      

  4.   

    这个我以前弄过,在一般的OnKeyDown之类的事件里截取消息一般是不行的,因为在这之前系统的主消息循环已经先处理过了,所以才会出现焦点切换的问题。,我的方法是:
    1.先放一个“ApplicationEvents”到你的窗口界面上
    2.在“ApplicationEvents”的OnMessage事件里写关于方向键的代码
    如:  if (msg.wParam=17)  and  (msg.message=WM_KEYDOWN) then//256:
      begin
        bIsCTRl:=True;
      end;
      if (msg.wParam=17)  and  (msg.message=WM_KEYUP) then
      begin
        bIsCTRl:=False;
      end;
      if bIsCTRl and  (msg.message=WM_KEYDOWN) then
      begin
        if Msg.wParam in [VK_UP, VK_LEFT, VK_DOWN, VK_RIGHT] then
        begin
          PrintRect := Bounds(0, 0, PaintBoxDraw.Width, WarningY);
          case Msg.wParam of
            VK_LEFT:
              .......
            VK_Right:
              .......
            VK_Up:
              .......
            VK_Down:        
              .......以上代码是我自己写的(我截取的不全), 我的程序里面还处理了CTRL按键消息所以有个bIsCTRl的变量
    代码仅供参考