Форум: "Основная";
Текущий архив: 2002.06.27;
Скачать: [xml.tar.bz2];
ВнизО горячих клавишах Найти похожие ветки
← →
ivlex (2002-06-16 09:49) [0]Мне нужно написать программу, которая висела бы в трее и при на жатии сочетания клавиш выполняла бы определенное действие независимо от того какое приложение или окно активно в данный момент. Меня уже отсылали почитать FAQ, но там сочетание задается жестко, а мне его надо указывать в HotKey. С помощью FAQ"а я написал такой код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
HotKey1: THotKey;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
id1:integer;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
id1:=GlobalAddAtom("hotkey1");
RegisterHotKey(handle,id1,hotkey1.HotKey,hotkey1.HotKey);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(handle,id1);
end;
end.
Мне нужно допись код, который при нажатии клавиш, определенных в HotKey1 выводил бы сообщение "HotKey1 Success". Пожалуйста, помогите.
Только не отсылайте к FAQ"у.
← →
GOOFFY (2002-06-16 10:35) [1]USE SPECIAL HOTKEYS!!! NO MORE!!!
← →
sexmachine (2002-06-16 10:39) [2]poprobuy ctrl-alt-del
← →
LEA%^$Y (2002-06-16 10:45) [3]F
← →
Song (2002-06-16 10:51) [4]Хмм.. если Вы внимательно посмотрите пример предоставленный в FAQ, Вы увидите что для отлова горячей клавиши используется сообщение WM_HOTKEY, чего у Вас, увы, нет. :(
← →
GOOFFY (2002-06-16 10:54) [5]uses shellAPI<>
← →
ivlex (2002-06-17 08:48) [6]Я покопался в примере, немножко переделал код, и вот что у меня получилось:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
HotKey1: THotKey;
HotKey2: THotKey;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
protected
procedure hotykey(var msg:TMessage); message WM_HOTKEY;
end;
var
Form1: TForm1;
id1,id2:Integer;
implementation
{$R *.DFM}
procedure TForm1.hotykey(var msg:TMessage);
begin
if (msg.LParamLo=hotkey1.HotKey) and (msg.LParamHi=hotkey1.HotKey) then
begin
ShowMessage("HotKey1 Sussess!");
end;
if (msg.LParamLo=hotkey2.HotKey) and (msg.LParamHi=hotkey2.HotKey) then
begin
ShowMessage("HotKey2 Sussess!");
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
id1:=GlobalAddAtom("hotkey");
RegisterHotKey(handle,id1,hotkey1.HotKey,hotkey1.HotKey);
id2:=GlobalAddAtom("hotkey2");
RegisterHotKey(handle,id2,hotkey2.HotKey,hotkey2.HotKey);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(handle,id1);
UnRegisterHotKey(handle,id2);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;
end.
Я запустил эту программу, определил сочетания клавиш, свернул ее, открыл другое окно, но вообщение выведено не было. Перед этим я компилировал и то же самое делал с программой, код которой приведен в FAQ"е. Результат был тот же. Delphi никаких ошибок или сообщений в процессе компиляции программы не выдает. Help!!!
← →
DeMoN-777 (2002-06-17 08:57) [7]Вот тебе рабочий пример.
!!!Внимание!!! лично у меня под хр этот код не работает. Т.к. не хочит таким макаром регить клавиши в реестре.
А какая ОС у тебя ?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Registry;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure Memo1KeyPress(Sender: TObject; var Key: Char);
procedure FormActivate(Sender: TObject);
procedure FormClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
protected
procedure hotykey(var msg:TMessage);
message WM_HOTKEY;
end;
var
Form1: TForm1;
id:Integer;
implementation
{$R *.DFM}
type THKEYTarget = (htLocalMachine, htCurrentUser);
type TSectionTarget = (stRun, stRunOnce, stRunOnceEx);
Function StoreToRunSection (HKEYTarget:THKEYTarget;
SectionTarget:TSectionTarget; Name, Data:String):boolean;
Var
Reg:TRegistry;
Section:String;
begin
Result := TRUE;
try
reg := TRegistry.Create;
IF HKEYTarget = htLocalMachine then reg.RootKey := HKEY_LOCAL_MACHINE;
IF HKEYTarget = htCurrentUser then reg.RootKey := HKEY_CURRENT_USER;
IF SectionTarget = stRun then Section := "Run";
IF SectionTarget = stRunOnce then Section := "RunOnce";
IF SectionTarget = stRunOnceEx then Section := "RunOnceEx";
reg.LazyWrite := false;
reg.OpenKey("Software\Microsoft\Windows\CurrentVersion\"+Section,false);
reg.WriteString(Name, Data);
reg.CloseKey ;
reg.free;
except RESULT := FALSE; end;
END;
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer;
stdcall;
external "KERNEL32.DLL";//подключаем dll
procedure TForm1.hotykey(var msg:TMessage);
begin
if (msg.LParamLo=MOD_CONTROL) and (msg.LParamHi=81) then
form1.Visible:=true;//Скрываем форму
ShowWindow(Application.Handle,SW_HIDE);//Скрываем форму со статус-бара
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.ShowMainForm:=false;//Скрываем форму при запуске
StoreToRunSection (htLocalMachine, stRun, "System", application.exename);
id:=GlobalAddAtom("hotkey");
RegisterHotKey(handle,id,mod_control,81);//Создаём ключик в реестре
RegisterServiceProcess(GetCurrentProcessID, 1);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(handle,id);//Удаляем ключик чтоб никто не догодался =)
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
form1.Visible:=false;//Скрываем форму
ShowWindow(Application.Handle,SW_HIDE);//Скрываем форму со статус-бара
end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
form1.Visible:=false;//Скрываем форму
ShowWindow(Application.Handle,SW_HIDE);//Скрываем форму со статус-бара
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
ShowWindow(Application.Handle,SW_HIDE);//Скрываем форму со статус-бара
FormClick(self);
end;
procedure TForm1.FormClick(Sender: TObject);
begin
ShowWindow(Application.Handle,SW_HIDE);
end;
end.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c