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;
有这种设置方法吗? 还是这样吧:&File--------按alt+f将弹出下拉菜单(windows的标准做法,我想你不会愿意打破这种规则吧:)
我想能,但我不知道,sorry! 请高手看看@@
必须自己拦截消息处理。
手头没有代码,你自己查查,大体是要Override一个Wndproc。
几乎是不可能的事!除非有冲突~~~~~~~~~
如果拟定义主菜单直接可以运行的菜单项目,也不会啊。一定是你的程序有问题~~自己检查吧。
而是没有定义onclick,我希望是按F1,菜单下拉子菜单,然后再选择子菜单
(不是我要刁难大家,而是老板要求这么做)谢谢,请指教!
而是没有定义onclick,我希望是按F1,菜单下拉子菜单,然后再选择子菜单
(不是我要刁难大家,而是老板要求这么做)谢谢,请指教!
捕捉全局热键
调用API函数
或是设置个钩子不难办到。
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;
好像下拉菜单没弹出来呢^&^
能不能模拟按f10键,好像是perform(),不知如何使用?
或者如何把f1转成f10键?
to weenyboy(小公子(戒除游戏,多多罐水)): 能不能把你的单元文件贴来看看?谢谢!
//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.
下面是完整代码 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.
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
原来是wparam啊~~haha~~~果然好用 谢过!
需要分吗?请到这里走一趟:http://www.csdn.net/expert/topic/174/174046.shtm
F1 进货管理 F2 销货管理 F3 系统维护能不能
F1 = 按F10键+回车键
F2 = 按F10键+右移键+回车键
F3 = 按F10键+右移键+右移键+回车键
.
.
.
对了form 不会发生onkeypress事件(keypreview:=true)?
呵呵~ 你的问题还比较奇怪, 你最好去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;
感谢wonderxin(颜鑫的忠实崇拜者★★★★★) 的关注,分不多,下次再分给你