一个简单的问题:我在主菜单定义快捷键无效

myxfang 2001-06-27 11:52:48
我在MDiform定义一个菜单项目是caption=F1 系统维护 shorcut=F1
但是运行时按键无效
我总共定义F1..F9但是没有一个可以成功(定义Ctrl+A等也不行)
还有其他办法定义?
谢谢!
...全文
460 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
weenyboy 2001-06-28
  • 打赏
  • 举报
回复
窗体文件


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
weenyboy 2001-06-28
  • 打赏
  • 举报
回复
对不起,上面的代码有一处小小错误,不过你应该能够找出来
下面是完整代码 delphi 5 + w2k测试通过

unit Unit1;

interface

uses
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.
wonderxin 2001-06-28
  • 打赏
  • 举报
回复

//to weenyboy(小公子(戒除游戏,多多罐水)):
//我的如下,但下拉菜单没弹出来,请指教!

unit Unit1;

interface

uses
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.
wonderxin 2001-06-28
  • 打赏
  • 举报
回复

to weenyboy(小公子(戒除游戏,多多罐水)):

能不能把你的单元文件贴来看看?谢谢!
myxfang 2001-06-28
  • 打赏
  • 举报
回复
up
myxfang 2001-06-28
  • 打赏
  • 举报
回复
告诉你一个方案:
能不能模拟按f10键,好像是perform(),不知如何使用?
或者如何把f1转成f10键?
weenyboy 2001-06-28
  • 打赏
  • 举报
回复
绝对正确,百试不爽
wonderxin 2001-06-28
  • 打赏
  • 举报
回复

好像下拉菜单没弹出来呢^&^
wonderxin 2001-06-28
  • 打赏
  • 举报
回复
//
weenyboy 2001-06-28
  • 打赏
  • 举报
回复
定义热键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;
mysine 2001-06-28
  • 打赏
  • 举报
回复
当然可以了。
捕捉全局热键
调用API函数
或是设置个钩子不难办到。
myxfang 2001-06-28
  • 打赏
  • 举报
回复
高手:
能不能在主菜单按f1弹出下拉菜单?快,我要加分!如果分数不够,我可再加
myxfang 2001-06-28
  • 打赏
  • 举报
回复
非常感谢 weenyboy(小公子(戒除游戏,多多罐水)) 我给你满分
感谢wonderxin(颜鑫的忠实崇拜者★★★★★) 的关注,分不多,下次再分给你
myxfang 2001-06-28
  • 打赏
  • 举报
回复
up
weenyboy 2001-06-28
  • 打赏
  • 举报
回复
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;
myxfang 2001-06-28
  • 打赏
  • 举报
回复
是form
wonderxin 2001-06-28
  • 打赏
  • 举报
回复
菜单属于非客户区,不会响应onkeypress
myxfang 2001-06-28
  • 打赏
  • 举报
回复
我不希望在菜单上有其他快捷键,其实是这样的菜单:
F1 进货管理 F2 销货管理 F3 系统维护

能不能
F1 = 按F10键+回车键
F2 = 按F10键+右移键+回车键
F3 = 按F10键+右移键+右移键+回车键
.
.
.
对了form 不会发生onkeypress事件(keypreview:=true)?


wonderxin 2001-06-28
  • 打赏
  • 举报
回复

原来是wparam啊~~haha~~~果然好用

谢过!

需要分吗?请到这里走一趟:http://www.csdn.net/expert/topic/174/174046.shtm
wonderxin 2001-06-27
  • 打赏
  • 举报
回复

有这种设置方法吗?

还是这样吧:&File--------按alt+f将弹出下拉菜单(windows的标准做法,我想你不会愿意打破这种规则吧:)
加载更多回复(17)

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧