要为菜单项写onclick事件,按快捷键是将执行该事件

解决方案 »

  1.   

       
      有这种设置方法吗?  还是这样吧:&File--------按alt+f将弹出下拉菜单(windows的标准做法,我想你不会愿意打破这种规则吧:)
      

  2.   


      我想能,但我不知道,sorry!  请高手看看@@
      

  3.   

    MDI窗体和一般穿体的消息处理不太一样。在主穿体里你就得不到Keydown处理。
    必须自己拦截消息处理。
    手头没有代码,你自己查查,大体是要Override一个Wndproc。
      

  4.   

    >>我在主菜单定义快捷键无效
    几乎是不可能的事!除非有冲突~~~~~~~~~
    如果拟定义主菜单直接可以运行的菜单项目,也不会啊。一定是你的程序有问题~~自己检查吧。
      

  5.   

    我的意思不是不能执行onclick()
    而是没有定义onclick,我希望是按F1,菜单下拉子菜单,然后再选择子菜单
    (不是我要刁难大家,而是老板要求这么做)谢谢,请指教!
      

  6.   

    我的意思不是不能执行onclick()
    而是没有定义onclick,我希望是按F1,菜单下拉子菜单,然后再选择子菜单
    (不是我要刁难大家,而是老板要求这么做)谢谢,请指教! 
      

  7.   

    你定义的菜单是主菜单吗?或者是Form的PopupMenu吗?如果不是,嘿嘿...!
      

  8.   

    当然可以了。
    捕捉全局热键
    调用API函数
    或是设置个钩子不难办到。
      

  9.   

    定义热键f2-f9,在热键处理中向窗体发消息来模拟打开主菜单formcreate:
      RegisterHotKey(Handle, 1001, 0, vk_F2)formdestroy:
      UnregisterHotKey(Handle, 1001);procedure HotProc(var Message: TMessage); Message WM_HotKey;
    begin
      case Message.Msg of
        1001: begin
          PostMessage(Handle, WM_KEYDOWN, vk_F10, 0);
          PostMessage(Handle, WM_KEYUP, vk_F10, 0);
          PostMessage(Handle, WM_KEYDOWN, Ord('F'), 0);  //比如使用(&File)菜单
          PostMessage(Handle, WM_KEYUP, Ord('F'), 0);
        end;
    end;
      

  10.   


      好像下拉菜单没弹出来呢^&^
      

  11.   

    告诉你一个方案:
    能不能模拟按f10键,好像是perform(),不知如何使用?
    或者如何把f1转成f10键?
      

  12.   


    to  weenyboy(小公子(戒除游戏,多多罐水)):    能不能把你的单元文件贴来看看?谢谢!
      

  13.   


    //to  weenyboy(小公子(戒除游戏,多多罐水)):
    //我的如下,但下拉菜单没弹出来,请指教!unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus;type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        file1: TMenuItem;
        asdf1: TMenuItem;
        sdf1: TMenuItem;
        gfe1: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
      procedure HotProc(var Message: TMessage); Message WM_HotKey;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
    RegisterHotKey(Handle, 1001, 0, vk_F10)
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
    UnregisterHotKey(Handle, 1001);
    end;procedure TForm1.HotProc(var Message: TMessage);
    //var handle:hwnd;
    begin
      case Message.Msg of
        1001: begin
          PostMessage(Handle, WM_KEYDOWN, vk_F10, 0);
          PostMessage(Handle, WM_KEYUP, vk_F10, 0);
          PostMessage(Handle, WM_KEYDOWN, texttoshortcut('alt+f'), 0);  //比如使用(&File)菜单
          PostMessage(Handle, WM_KEYUP, texttoshortcut('alt+f'), 0);
        end;
    end;
    //即使完全按你的,效果也一样(按f10时,只是file被按下,而没有弹出菜单)end;
    end.
      

  14.   

    对不起,上面的代码有一处小小错误,不过你应该能够找出来
    下面是完整代码  delphi 5 + w2k测试通过unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus, StdCtrls;type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        File1: TMenuItem;
        Edit1: TMenuItem;
        mmNew: TMenuItem;
        mmOpen: TMenuItem;
        mmCopy: TMenuItem;
        mmPast: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        procedure HotKeyProc(var Message: TMessage); Message WM_HOTKEY;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
      RegisterHotKey(Handle, 1001, 0, VK_F1);
      RegisterHotKey(Handle, 1002, 0, VK_F2);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      UnregisterHotKey(Handle, 1001);
      UnregisterHotKey(Handle, 1002);
    end;procedure TForm1.HotKeyProc(var Message: TMessage);
    const
      Arr: Array[1001..1002] of Word =
        (Ord('F'),Ord('E'));
    begin
      PostMessage(Handle, WM_KEYDOWN, vk_F10, 0);
      PostMessage(Handle, WM_KEYUP, vk_F10, 0);
      PostMessage(Handle, WM_KEYDOWN, Arr[Message.WParam], 0);
      PostMessage(Handle, WM_KEYUP, Arr[Message.WParam], 0);
    end;end.
      

  15.   

    窗体文件
    object Form1: TForm1
      Left = 189
      Top = 103
      Width = 544
      Height = 375
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      Menu = MainMenu1
      OldCreateOrder = False
      OnCreate = FormCreate
      OnDestroy = FormDestroy
      PixelsPerInch = 96
      TextHeight = 13
      object MainMenu1: TMainMenu
        Left = 152
        Top = 48
        object File1: TMenuItem
          Caption = '&File(F1)'
          object mmNew: TMenuItem
            Caption = 'New'
          end
          object mmOpen: TMenuItem
            Caption = 'Open'
          end
        end
        object Edit1: TMenuItem
          Caption = '&Edit(F2)'
          object mmCopy: TMenuItem
            Caption = 'Copy'
          end
          object mmPast: TMenuItem
            Caption = 'Past'
          end
        end
      end
    end
      

  16.   


      原来是wparam啊~~haha~~~果然好用  谢过!
      
      需要分吗?请到这里走一趟:http://www.csdn.net/expert/topic/174/174046.shtm
      

  17.   

    我不希望在菜单上有其他快捷键,其实是这样的菜单:
    F1 进货管理  F2 销货管理  F3 系统维护能不能
    F1 = 按F10键+回车键
    F2 = 按F10键+右移键+回车键
    F3 = 按F10键+右移键+右移键+回车键
    .
    .
    .
    对了form 不会发生onkeypress事件(keypreview:=true)?
      

  18.   

    菜单属于非客户区,不会响应onkeypress
      

  19.   

    to wonderxin(颜鑫的忠实崇拜者★★★★★)
      呵呵~ 你的问题还比较奇怪, 你最好去yahoo搜索一下可能会好很多to myxfang(小方)  》自己变通一下就可以了嘛,既然知道方法,为什么不能解决呢?procedure TForm1.FormCreate(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 1001 to 1009 do
        RegisterHotKey(Handle, i, 0, VK_F1 + i - 1001);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 1001 to 1009 do
        UnregisterHotKey(Handle, i);
    end;procedure TForm1.HotKeyProc(var Message: TMessage);
    var
      i: Integer;
    begin
      PostMessage(Handle, WM_KEYDOWN, vk_F10, 0);
      PostMessage(Handle, WM_KEYUP, vk_F10, 0);
      for i := 1002 to Message.WParam do
      begin
        PostMessage(Handle, WM_KEYDOWN, vk_Right, 0);
        PostMessage(Handle, WM_KEYUP, vk_Right, 0);
      end;
      PostMessage(Handle, WM_KEYDOWN, vk_Return, 0);
      PostMessage(Handle, WM_KEYUP, vk_Return, 0);
    end;
      

  20.   

    非常感谢 weenyboy(小公子(戒除游戏,多多罐水)) 我给你满分
    感谢wonderxin(颜鑫的忠实崇拜者★★★★★) 的关注,分不多,下次再分给你