안녕하세요
이젠 저도 전역적 핫키는 지겹습니다. 하지만 왜 안되는 걸까요.
밑에 소스에서 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;
소스를 보니까 많은 부분을 잘못하셨네요.
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;