Q&A

  • [질문] KeyDown, LParam
<!--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 값을 알수 있는 다른 방법이 있따면
알려주십시요







0  COMMENTS