<!--CodeS-->
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FOldProc: Pointer;
FNewProc: Pointer;
procedure NewWndProc( var Message: TMessage );
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SetWindowLong(Handle, GWL_WNDPROC, LongInt(FOldProc));
FreeObjectInstance(FNewProc);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FOldProc := Pointer(GetWindowLong(Handle, GWL_WNDPROC));
//각각의 클래스마다 서로 다른 윈도 프로시저를 정의할 수 있도록
FNewProc := MakeObjectInstance(NewWndProc);
SetWindowLong(Handle, GWL_WNDPROC, LongInt(FNewProc));
end;
procedure TForm1.NewWndProc(var Message: TMessage);
begin
With Message do
begin
case Message.Msg of
WM_KEYDOWN :
begin
Caption :=
Format('%d, %d',
[
WParam,
LParam
]);
end;
end;
Result := CallWindowProc( FOldProc, Handle, Msg, WParam, LParam );
end;
end;
end.
<!--CodeE-->
KeyDown 메세지 발생시 LParam 값을 알기 위해서
위와같이 작성을 했는데
문제없이 잘 돌아갑니다.
지금은 달랑 폼만 있는 상태인데
폼위에 버튼이라든지, 그리드를 올려놨을때는
NewWndProc 에서 아무런 반응이 없습니다.
폼 속성중 KeyPreview 를 설정 해도 마찬가지 반응입니다.
ㅡㅜ....
조은 방법이 없을까요?
많은 조언 바랍니다.
위 방법말고 keydown 시 LParam 값을 알수 있는 다른 방법이 있따면
알려주십시요