热键(下划线)和快捷键失效的原因找到啦!但由此引出一个问题!(20分)

  • 主题发起人 主题发起人 qweasd
  • 开始时间 开始时间
Q

qweasd

Unregistered / Unconfirmed
GUEST, unregistred user!
前两天我用别的帐号发篇贴子,问热键下划线不显示和快捷键失效的问题!
现在原因找到了,热键下划线不显示确实是系统问题,重新系统后好了,(估计是升级到IE6.0所至)。
快捷键失效的原因是这样的:
我在form1上设了一个“全屏”按钮,来调用一个全屏窗口,但我想通过按“ESC”键来关闭全屏窗口
却不行,有一位朋友说是什么东西(忘了)拦截了此消息,所以收不到,所以按下“ESC”键后无效。
然后他给我了一段代码来解决此问题,代码如下:
procedure MyOnMessage(var MSG: TMSG;
var Handle: Boolean);
procedure TFullScreenForm.MyOnMessage(var MSG: TMSG;
var Handle: Boolean);
begin
if ((msg.message=WM_KEYUP) or (msg.message=WM_KEYDOWN))
and (msg.wParam=VK_Escape) then
begin
Handle:=true;
Close;
end;
end;

procedure TFullScreenForm.FormCreate(Sender: TObject);
begin
Height:=Screen.Height;
Width:=Screen.Width;
Application.OnMessage:=MyOnMessage;
end;

用这段代码后,可以按“ESC”键来关闭全屏窗口了,但我终于发现快捷键无效的原因就是这段代码引起的。
所以现在我还希望大家能给我一个解决“ESC”的办法,使“ESC”键可以关闭全屏窗口,但又不使快捷键失效。
拜托各位了!只有20分了,不好意思。
 
procedure TFullScreenForm.MyOnMessage(var MSG: TMSG;
var Handle: Boolean);
begin
Handle := False;
//加上这句试试
if ((msg.message=WM_KEYUP) or (msg.message=WM_KEYDOWN))
and (msg.wParam=VK_Escape) then
begin
Handle:=true;
Close;
end;
end;
 
为窗体添加CM_DIALOGKEY消息处理过程,即可解决你的问题,(也可以参加TButton的CMDialogKey过程处理代码),如下:
procedure CMDialogKey(var Message: TCMDialogKey);
message CM_DIALOGKEY;
procedure TForm2.CMDialogKey(var Message: TCMDialogKey);
begin
if Message.CharCode = VK_ESCAPE then
Close;
end;

 
这个问题再简单不过了,如果是笨人也有笨方法,那就加一个Esc的快捷键不就得了
 
消息处理后要使用inherited
if ((msg.message=WM_KEYUP) or (msg.message=WM_KEYDOWN))
and (msg.wParam=VK_Escape) then
begin
Handle:=true;
Close;
end else
inherited;
让它处理其他的消息
 
靠,一帮人都在使用OnMessage,要知道,PostMessage函数发出的消息都要调用它,所以他被
调用是很频繁的,试想如果在这里代码很长的话,那程序的运行速度可想而知了。
建议:除非万不得已就不要用他,而且代码一定要短。
 
楼上诸位,你们的方法我全试过了,都不行啊!
还是造成快捷键无效啊。
怎么办?
 
你把你的方法删调啊,你不信,单独建立一个工程,用我的方法,肯定行,我的很多项目都是
这么做的,怎么可能呢?
 
是你使用快捷键的方法不对,通常使用快捷键同过主菜单来设定快捷键,或者向Windows注册一
个快捷键
 
//通常使用快捷键同过主菜单来设定快捷键,
是什么意思?不明白。
我就是在需要设快捷键的菜单项的shortcut属性里设的,这样做应该可以啊。
 
也就时说设主菜单的菜单项的shortcut属性或者设TActionList的TAction的ShortCut属性。
不知你是怎么设的?有没有把MyOnMessage的代码删掉?检查一下你的Form的Menu属性有没有
关联到主菜单。如果都不是这些原因的话,那肯定是你其他代码出了问题,那你应该找找其
他原因。
 
//检查一下你的Form的Menu属性有没有关联到主菜单。
关联了。
我这么设的,比如有File,View:
1、File——Open Ctrl+O——Exit
2、View——Full F11
其中Open的快捷键就是在Open的ShortCut属性里选的;
Full的快捷键就是在Full的ShortCut属性里选的。
这些快捷键都有效,但只要加了上面我以前那些代码,快捷键都无效了,但ESC有用。
加了你的代码,(注销了我那些代码),结果是快捷键都有效,ESC退出全屏窗口无效。
不知怎么回事。
 
我那只是试例代码,你应该在TFullScreenForm中加上CM_DIALOGKEY消息的处理方法,如下:

type
TFullScreenForm = class(TForm)
private
{ Private declarations }
public
procedure CMDialogKey(var Message: TCMDialogKey);
message CM_DIALOGKEY;
end;

var
FullScreenForm: TFullScreenForm;
implementation
{$R *.dfm}
{ TFullScreenForm }
procedure TFullScreenForm.CMDialogKey(var Message: TCMDialogKey);
begin
if Message.CharCode = VK_ESCAPE then
Close;
end;
 
我是这样写的,一模一样,
但ESC就是无效?
 
谁来救救我啊?
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部