Q&A

  • 왜 핫키를 누르면 버튼클릭을 못하나요???


안녕하세요

이젠 저도 전역적 핫키는 지겹습니다. 하지만 왜 안되는 걸까요.

밑에 소스에서 FAtom이면

Edit1.text := ...

이런것을 버튼클릭으로 바꾸고 싶은데

Button1Click(Sender);

이렇게 쓰면 에러가 납니다.



또 핫키 등록이 잘 않되는 이유가 뭔가요.

윈도우에서 사용하는 핫키는 레지스트리에 입력이 않되나요?

제가 Alt_Space를 넣으니깐 곧바로 에러가 나더군요. 레지스트리에 입력 않된다고.

윈도우즈에서 사용하는 모든 핫키를 바꿔버리고 싶은데 방법이 없을까요?



가려쳐 주세요.



unit Unit1;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;



type

TForm1 = class(TForm)

Edit1: TEdit;

Button1: TButton;

Button2: TButton;

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

FAtom, FBtom : TAtom;

{ Private declarations }

protected

procedure WMHotKey(var msg: TWMHotKey); message WM_HotKey;

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.WMHotKey(var Msg: TWMHotKey);

begin

if Msg.HotKey = FAtom then

Edit1.text:= 'Left'

else if Msg.HotKey = FBtom then

EDIT1.text:= 'Right'

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

FAtom := GlobalAddAtom('HotKey Test');

RegisterHotKey(Handle, FAtom, MOD_Alt, VK_F1);

if RegisterHotKey(Handle, FAtom, MOD_ALT, VK_F1) = False then

ShowMessage('HotKey Registration Failed');



FBtom := GlobalAddAtom('HotKey Test');

RegisterHotKey(Handle, FBtom, MOD_Shift, VK_F1);

if RegisterHotKey(Handle, FBtom, MOD_SHIFT, VK_F1) = False then

ShowMessage('HotKey Registration Failed');

end;



procedure TForm1.FormDestroy(Sender: TObject);

begin

UnRegisterHotKey(Handle, GlobalDeleteAtom(FAtom));

UnRegisterHotKey(Handle, GlobalDeleteAtom(FBtom));

end;

1  COMMENTS
  • Profile
    최용일 2000.04.25 06:32
    안녕하세요. 최용일입니다.



    소스를 보니까 많은 부분을 잘못하셨네요.



    Edit1.text := ...

    이런것을 버튼클릭으로 바꾸고 싶은데

    Button1Click(Sender);



    위의 곳은 Button1Click(Sender);은 어느 부분에서 이렇게 해주셨는지 만약 WMHotKey메



    소드에서 해주었다면 당연히 에러가 나겠죠. Sender가 뭔지 알수 없으니까... 그럴땐



    Button1Click(Self); 이렇게 해주셔야 합니다.



    또 Gloval Atom은 전역적으로 유일해야 합니다. 아래 소스에서는 두개의 Atom값이 똑같



    이 'HotKey Test' 이던데 이러면 맨 처음만든 Atom값을 이용하지만 핫키는 나중에 등록



    된것을 사용합니다. 그러므로 WMHotKey에서 둘중 어느것을 눌렸는지 판단을 할 수 없게



    되버리죠. 두개의 Atom에 다른 문자열을 사용하세요.



    아래처럼 두번씩 등록하실 필요는 없습니다. 한번만 하세요.



    RegisterHotKey(Handle, FBtom, MOD_Shift, VK_F1);

    if RegisterHotKey(Handle, FBtom, MOD_SHIFT, VK_F1) = False then

    ======>

    if RegisterHotKey(Handle, FBtom, MOD_SHIFT, VK_F1) = False then



    ^^ 항상 즐코하세요.



    mad wrote:

    >

    > 안녕하세요

    > 이젠 저도 전역적 핫키는 지겹습니다. 하지만 왜 안되는 걸까요.

    > 밑에 소스에서 FAtom이면

    > Edit1.text := ...

    > 이런것을 버튼클릭으로 바꾸고 싶은데

    > Button1Click(Sender);

    > 이렇게 쓰면 에러가 납니다.

    >

    > 또 핫키 등록이 잘 않되는 이유가 뭔가요.

    > 윈도우에서 사용하는 핫키는 레지스트리에 입력이 않되나요?

    > 제가 Alt_Space를 넣으니깐 곧바로 에러가 나더군요. 레지스트리에 입력 않된다고.

    > 윈도우즈에서 사용하는 모든 핫키를 바꿔버리고 싶은데 방법이 없을까요?

    >

    > 가려쳐 주세요.

    >

    > unit Unit1;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls;

    >

    > type

    > TForm1 = class(TForm)

    > Edit1: TEdit;

    > Button1: TButton;

    > Button2: TButton;

    > procedure FormCreate(Sender: TObject);

    > procedure FormDestroy(Sender: TObject);

    > procedure Button1Click(Sender: TObject);

    > procedure Button2Click(Sender: TObject);

    > private

    > FAtom, FBtom : TAtom;

    > { Private declarations }

    > protected

    > procedure WMHotKey(var msg: TWMHotKey); message WM_HotKey;

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.WMHotKey(var Msg: TWMHotKey);

    > begin

    > if Msg.HotKey = FAtom then

    > Edit1.text:= 'Left'

    > else if Msg.HotKey = FBtom then

    > EDIT1.text:= 'Right'

    > end;

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    > FAtom := GlobalAddAtom('HotKey Test');

    > RegisterHotKey(Handle, FAtom, MOD_Alt, VK_F1);

    > if RegisterHotKey(Handle, FAtom, MOD_ALT, VK_F1) = False then

    > ShowMessage('HotKey Registration Failed');

    >

    > FBtom := GlobalAddAtom('HotKey Test');

    > RegisterHotKey(Handle, FBtom, MOD_Shift, VK_F1);

    > if RegisterHotKey(Handle, FBtom, MOD_SHIFT, VK_F1) = False then

    > ShowMessage('HotKey Registration Failed');

    > end;

    >

    > procedure TForm1.FormDestroy(Sender: TObject);

    > begin

    > UnRegisterHotKey(Handle, GlobalDeleteAtom(FAtom));

    > UnRegisterHotKey(Handle, GlobalDeleteAtom(FBtom));

    > end;