EdHillmann
asked on
Key Events in an MDI Frame form
We have an MDI Application. We'd like to trap key presses in the application when there are no children forms displayed/created. In other words, when only the MDI Frame form is displayed, we'd like to track the key press events to start a function.
I've added handlers to the Key* events (KeyPress, KeyDown and KeyUp) on the Frame form (FormStyle fsMDIForm). However, it never gets the events. I'm presuming that, by creating the form as a MDI frame, windows sends the key events to the active child form.
Is there a way to, when there is no active child form, to get these events sent to the frame window? I've tried to watch the HandleMessage procedure, but I wasn't having much luck.
Thanks
I've added handlers to the Key* events (KeyPress, KeyDown and KeyUp) on the Frame form (FormStyle fsMDIForm). However, it never gets the events. I'm presuming that, by creating the form as a MDI frame, windows sends the key events to the active child form.
Is there a way to, when there is no active child form, to get these events sent to the frame window? I've tried to watch the HandleMessage procedure, but I wasn't having much luck.
Thanks
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Did either of you ever get any problems using this? Once I added it to my app, I started getting errors like 'A WIN32 API function failed'? Any suggestions?
ASKER
Weird. I didn't get any errors like that. I'll clarify that I'm using D5, although I don't think there's anything specific to D5 in that.
Maybe first comment out the ShowMessage calls to see if that causes it. Just comment out the code and run, incrementally adding code back in to find the culprit?
Did you try this example, cause there's not much in it. Might be easier to find the nasty line.
Maybe first comment out the ShowMessage calls to see if that causes it. Just comment out the code and run, incrementally adding code back in to find the culprit?
Did you try this example, cause there's not much in it. Might be easier to find the nasty line.
Yeah, I tried the code. The problem is whenever I try to create more than one or two MDI child forms - it's like there's a memory leak?
Just rebooted my PC and the problem has mysteriously gone away. Sorry to bother you!
ASKER
Aahh, Windows. When all else fails, reboot! Have fun!
ASKER
That did the trick. Here's my successful test. This is with a form whose style is fsMDIForm....
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure MessageHandler(var Msg: TMsg; var Handled: Boolean);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.MessageHandler(var Msg: TMsg; var Handled: Boolean);
begin
if (Msg.message = wm_keydown) and (mdichildcount = 0) then begin
case Msg.wParam of
VK_F2: begin
ShowMessage('F2 Pressed!');
Handled := true;
end;
VK_F3: begin
ShowMessage('F3 Pressed!');
Handled := true;
end;
VK_TAB: begin
ShowMessage('Tab Pressed!');
Handled := true;
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MessageHandler;
end;
end.
Thanks!!