如何使主窗口响应KeyDown事件?(50分)

  • 主题发起人 主题发起人 redsky.l
  • 开始时间 开始时间
R

redsky.l

Unregistered / Unconfirmed
GUEST, unregistred user!
主窗口创建时的焦点在哪????
为何窗体不能响应KeyDown事件???
MDI窗体就是事多!
 
设置主窗体的KeyPreview属性为True;
 
:-(,没用!
 
activecontrol:=mainform;
 
To:张剑波
Project Project1.exe raised exception class EInvalidOperation with
message 'Cannot focus a disabled or invisible windows'.Process stopped.

 
你有一个窗体的STYLE属性设为了STAYONTOP。
 
To only you: 没有!!
 
你有的窗体或控件的visible设为false,而在程序中有对他们进行焦点操作。
看看autocreate的窗体有那些?
 
还是单步吧
 
各位:
为了这个问题,我做了两个FORM,一个FORM1为主FORM,一个FORM2 为子FORM。
两个FORM上未放任何控件!!
在FORM1的FormKeyDown加上一句:showmessage('Hello');
运行,按任何键无反应,在showmessage('Hello');设置中断,进行跟踪,程序根本
不进入FormKeyDown中,也就是说,主窗口不跟本就不响应FormKeyDown这个事件。

再说一句哪怕就一个窗口,不放任何控件,只要你把它的FormStyle属性设置为sMDIForm,
它都不会响应FormKeyDown事件(其上TEDIT获得焦点时可以)。Why?????

如何解决????



 
没错,是有这问题,在子窗体中相应KeyDown.
 
连消息过程都不能处理。唉
 
有在MDI子窗口中触发MDI父窗口成功的实例吗?
怎么我觉得不行?消息应该不是通过父窗口传递给子窗口的吧。
所以KeyPrevew没有作用。试试看Parent, not Owner
 
我以为是个简单问题所以给了50分,看来错了!

我找到个控件:HotKeyManager,他可抓取KeyDown和KeyUp 事件,并将其传送至Edit中,
主窗口中也能实现!只是没有原码:-( ,用它我可以实现我想要的功能。

也就是说要使主窗口响应KeyDown事件是可能的,只是不知道如何实现!!不知哪位大
侠能够解决!
 
MDI窗口就没有输入焦点。不知道你说的HotKeyManager实验是不是MDI窗口下做的。
 
TO kusanagi:对呀没错! 此控件一个很特别的功能就是,当窗口失去焦点时也能获得
键值,比如按F1键,EDIT中显示:F1。(同一可执行程序,但有两个以上窗体时)

大家下载看看:<a href="http://lancewood.163.net/HotKeyManager.dcu">HotKeyManager.dcu</a>
 
用Application中的onMessage挂接消息处理函数吧。
例子,按大写A键显示‘Hello,World!’。

*****************************************************************
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
//procedure mykeydown(var message:twmkey);message wm_keydown;
procedure AppMessage(var Msg: TMsg; var Handled: Boolean);

public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}



procedure TForm1.FormCreate(Sender: TObject);
begin
application.OnMessage:=appmessage;
end;

procedure tform1.AppMessage(var Msg: TMsg; var Handled: Boolean);

begin
if msg.message=wm_keydown then
if msg.wParam=65 then
begin
//showmessage(inttostr(msg.wparam));
showmessage('Hello,World!');
handled:=true;
end;
end;

end.
 
多人接受答案了。
 
后退
顶部