Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-89026
DenKop
2002-05-26 22:17
2002.06.27
Массовая рассылка.


1-88856
Vasya!
2002-06-17 18:32
2002.06.27
Где можно найти инфу, как юзать LISTVIEW?


8-88959
Диана
2002-02-15 16:47
2002.06.27
Звуковой фон. Как сделать?


1-88783
Dark Elf
2002-06-13 20:27
2002.06.27
Stack overflow


14-89017
OOPS!!
2002-05-23 15:25
2002.06.27
Photoshop, Winamp, CorelDraw, 3DStudio, Half-Life, Quake, ACDSEE.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский