Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.27;
Скачать: CL | DM;

Вниз

О горячих клавишах   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
3-88772
Ron
2002-06-02 15:02
2002.06.27
TTable


14-89039
Злой, не скажу кто, причина известна
2002-05-26 11:26
2002.06.27
В мире полно лохов


1-88862
Glooker
2002-06-17 21:36
2002.06.27
Дата создания


8-88957
Lider
2002-02-14 22:52
2002.06.27
Вывод картинки (TImage) на видео (TMediaPlayer)


4-89084
San188
2002-04-29 02:06
2002.06.27
Перезагрузка компа