Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];

Вниз

Как в KOL (без MCK) создать глобальную горячую клавишу   Найти похожие ветки 

 
Grademax   (2006-10-10 12:52) [0]

Как в KOL (без использования MCK) создать глобальную горячую клавишу. Причем без использования hock"a. В общем нужно, чтобы всё это было бы в одном файле (.dpr).

Есть пример на Win API, хотелось бы тоже самое но в KOL.
----------------------------------------------------------
Program main;
uses windows, messages;
const hotkey1 = 1001;//константа для идентификации горячей клавиши
var
  wc : TWndClassex;
  mainwnd : THandle;
  mesg : TMsg;
{==============================================================================}
Function WindowProc(wnd:hwnd; msg : integer; wparam:wparam; lparam:lparam):lresult; stdcall;
//var ncode, ctrlid : word;
begin
    case msg of
         wm_hotkey :begin
                    //обработчик события нажатия на зарегистрированную горячую клавишу
                    if wparam=hotkey1 then messagebox(wnd, "Вы нажали на win+n", "", mb_ok);
                    end;

         wm_destroy:begin
                    unregisterhotkey(mainwnd, hotkey1);//уничтожение созданной ранее горячей клавиши
                    postquitmessage(0);
                    result:=0;
                    end

                    else result:=defwindowproc(wnd,msg,wparam,lparam);
    end;
end;//of windowproc
{==============================================================================}
BEGIN
    wc.cbsize:=sizeof(wc);
    wc.style:=cs_hredraw or cs_vredraw;
    wc.lpfnwndproc:=@windowproc;
    wc.cbclsextra:=0;
    wc.cbwndextra:=dlgwindowextra;
    wc.hinstance:=hinstance;
    wc.hicon:=loadicon(0,idi_application);
    wc.hcursor:=loadcursor(0,idc_arrow);
    wc.hbrbackground:=color_btnface+1;
    wc.lpszmenuname:=nil;
    wc.lpszclassname:="hotkeycatcher_class";

    RegisterClassex(wc);

    mainwnd:= createwindow("hotkeycatcher_class", "Пример глобальной горячей клавиши нажмите Win+n",
    ws_overlappedwindow, cw_usedefault, cw_usedefault, cw_usedefault, cw_usedefault,
    0, 0,hinstance,nil);

    //$4e – шестнадцатеричный код клавиши с символом n
    if not registerhotkey(mainwnd,hotkey1,mod_win, $4e) then
    messagebox(mainwnd, "Не удалось зарегистрировать горячую клавишу", "", mb_ok);

    showwindow(mainwnd,sw_show);

    while getmessage(mesg,0,0,0) do begin
          if mainwnd<>0 then
             if isdialogmessage(mainwnd,mesg) then continue;

          TranslateMessage(mesg);
          DispatchMessage(mesg);
    end;
END.


 
mdw ©   (2006-10-10 14:03) [1]

...
 private
   HK: ATOM;
....

procedure TMainForm.KOLForm1FormCreate(Sender: PObj);
begin
   HK:= GlobalAddAtom("MyHotKey");
   RegisterHotKey(Applet.Handle, HK, MOD_CONTROL, Ord("H"));
end;

procedure TMainForm.KOLForm1Close(Sender: PObj; var Accept: Boolean);
begin
   UnregisterHotKey(Applet.Handle, HK);
   GlobalDeleteAtom(HK);;
end;

function TMainForm.KOLApplet1Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
begin
   Result:= False;
   if Msg.message = WM_HOTKEY then begin
     if (Msg.wParam = HK) then begin
       ShowMessage("HotKey");
       Result:= True;
     end;
   end;
end;


 
Grademax   (2006-10-11 08:28) [2]

Горячая клавиша по прежнему не работает... Что не так???

unit Unit1;

interface

{$IFDEF KOL_MCK}
uses Windows, Messages, KOL {$IFNDEF KOL_MCK}, mirror, Classes, Controls, mckControls, mckObjs, Graphics {$ENDIF (place your units here->)};
{$ELSE}
{$I uses.inc}
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;
{$ENDIF}

type
 {$IFDEF KOL_MCK}
 {$I MCKfakeClasses.inc}
 {$IFDEF KOLCLASSES} TForm1 = class; PForm1 = TForm1; {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
 {$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
   Form: PControl;
 {$ELSE not_KOL_MCK}
 TForm1 = class(TForm)
 {$ENDIF KOL_MCK}
   KOLProject1: TKOLProject;
   KOLForm1: TKOLForm;
   procedure KOLForm1Close(Sender: PObj; var Accept: Boolean);
   procedure KOLForm1FormCreate(Sender: PObj);
   function  KOLApplet1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;

 private
   { Private declarations }
   HK: ATOM;
 public
   { Public declarations }
 end;

var
 Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;

{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}

implementation

{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}

{$IFDEF KOL_MCK}
{$I Unit1_1.inc}
{$ENDIF}

procedure TForm1.KOLForm1Close(Sender: PObj; var Accept: Boolean);
begin
  UnregisterHotKey(Applet.Handle, HK);
  GlobalDeleteAtom(HK);;
end;

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
    HK:= GlobalAddAtom("MyHotKey");
    RegisterHotKey(Applet.Handle, HK, MOD_CONTROL, Ord("H"));
end;

function TForm1.KOLApplet1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
  Result:= False;
  if Msg.message = WM_HOTKEY then begin
    if (Msg.wParam = HK) then begin
      ShowMessage("HotKey");
      Result:= True;
    end;
  end;
end;

end.


 
MTsv DN ©   (2006-10-11 08:59) [3]

> Как в KOL (без использования MCK)
Здесь Вы пишите одно...

> [2]
А здесь другое... Вы определитесь...

> Горячая клавиша по прежнему не работает... Что не так???
Что Ctrl+H не работает??? У меня ВСЕ ПАШЕТ!!!
Единственное:
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
  HK:= GlobalAddAtom("MyHotKey");
  RegisterHotKey(Applet.Handle, HK, MOD_CONTROL, Ord("H"));
end;

procedure TForm1.KOLForm1Close(Sender: PObj; var Accept: Boolean);
begin
  UnregisterHotKey(Applet.Handle, HK);
  GlobalDeleteAtom(HK);;
end;

function TForm1.KOLForm1Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
begin
  Result:= False;
  if Msg.message = WM_HOTKEY then begin
    if (Msg.wParam = HK) then begin
      ShowMessage("HotKey");
      Result:= True;
    end;
  end;
end;

Не Applet, а Form...


 
Grademax   (2006-10-11 10:43) [4]

Всё исправил... НЕ РАБОТАЕТ!!! Перепроверил... Работать должна, но ... НЕ РАБОТАЕТ!!! вроде бы и ошибок нет и EXE файл создается, но не ловится Ctrl+H.

Люди, может кто выложит рабочий файл на чистом KOL???


 
mdw ©   (2006-10-11 12:07) [5]

Послал на мыло


 
Thaddy   (2006-10-11 12:39) [6]

This code works.
GlobalAddAtom is only necessary when you have this code in a DLL.

{
program Project1;
uses
 Kol,
 unit1 in "Unit1.pas";

begin
 NewForm1( Form1, nil);
 Run(Form1.form);
end.
}
unit unit1;

interface
uses
 Windows, Messages, Kol;

type

PForm1=^TForm1;
TForm1=object(Tobj)
 Form:pControl;
public
 function DoMessage(var Msg:Tmsg;var Rslt:integer):boolean;
end;

procedure NewForm1( var Result: PForm1; AParent: PControl );

var
 Form1:pForm1;

implementation

procedure NewForm1( var Result: PForm1; AParent: PControl );
begin
 New(Result,Create);
 with Result^ do
 begin
   Form:= NewForm(AParent,"KOLForm").SetSize(600,400).centeronparent.Tabulate;
   Applet:=Form;
   Form.OnMessage:=DoMessage;
   Form.Add2AutoFree(Result);
   RegisterHotkey(form.Handle,1000,MOD_CONTROL,Ord("H"));
 end;
end;

function TForm1.DoMessage(var Msg:TMsg;var Rslt:integer):Boolean;
begin
 Result:=false;
 case msg.message of
 WM_HOTKEY:
   begin
     Result := true;
     msgOk("Ctrl-H!");
   end;
 WM_DESTROY:
   UnRegisterHotKey(form.Handle,1000);
 end;
end;

end.


 
Thaddy   (2006-10-11 12:45) [7]

code works, but small correction:

 WM_HOTKEY:
 if msg.wParam = 1000 then  //!!


 
Grademax   (2006-10-11 13:02) [8]

УРА! Поверить не могу! Заработало!!! :)
Спасибо ВСЕМ! Спасли!


 
Thaddy   (2006-10-11 13:15) [9]

Alternatively the other hotkey approach.
This code will activate application if not focused or execute the procedure when the application has focus. This is unrelated to registerhotkey method:

{
program Project1;
uses
 Kol,
 unit1 in "Unit1.pas";

begin
 NewForm1( Form1, nil);
 Run(Form1.form);
end.
}
unit unit1;

interface
uses
 Windows, Messages, Kol;
// Redeclared because missing from Delphi 5
Const
 HOTKEYF_CONTROL = $0002;

type

PForm1=^TForm1;
TForm1=object(Tobj)
 Form:pControl;
public
 function DoMessage(var Msg:Tmsg;var Rslt:integer):boolean;
end;

procedure NewForm1( var Result: PForm1; AParent: PControl );

var
 Form1:pForm1;

implementation

procedure NewForm1( var Result: PForm1; AParent: PControl );
begin
 New(Result,Create);
 with Result^ do
 begin
   Form:= NewForm(AParent,"KOLForm").SetSize(600,400).centeronparent.Tabulate;
   Applet:=Form;
   Form.OnMessage:=DoMessage;
   Form.Add2AutoFree(Result);
   form.perform(WM_SETHOTKEY,MakeWord(Ord("H"),HOTKEYF_CONTROL),0);
 end;
end;

function TForm1.DoMessage(var Msg:TMsg;var Rslt:integer):Boolean;
begin
 Result:=false;
 if (msg.message = WM_SYSCOMMAND) and
       (msg.wparam = SC_HOTKEY) then
               MsgOk("Alternative Hotkey");
end;

end.


 
Grademax   (2006-10-13 05:39) [10]

Хотя всё предложенное выше и работает (причем очень успешно), решил собрать всё в один файл (*.dpr), так сказать для чистоты эксперемента. :)

Соответственно опять "наступил на грабли".
Хотя сие творение тоже "работает", но чрезвычайно глюковато, причем на столько, что работой вообще сложно назвать.

Для справки:
БОльшую часть своих программ пишу именно в такой форме, может привычка, может люблю сложности, но так или иначе оно мне больше нравится и греет душу :) (Так сказать близок мне этот литературный стиль, когда всё в одном файле за исключением отдельных контролов и модулей с часто используемыми функциями) :) :)

{---------------------------------------------------------------------------}
Program Proba;
uses Windows, Messages, Kol;
Const
 HOTKEYF_CONTROL = $0002;
var W:PControl;
{---------------------------------------------------------------------------}
function CtrlKeyDown : boolean;
begin
    result:=(Word(GetKeyState(VK_CONTROL)) and $8000)<>0;
end;
{---------------------------------------------------------------------------}
function DoMessage( var Msg: TMsg; var Reslt: Integer ): Boolean;
begin
Result:=False;
{ if (msg.message = WM_SYSCOMMAND) and
      (msg.wparam = SC_HOTKEY) then
              MsgOk("Alternative Hotkey");}
if (getasynckeystate(ord("A"))<>0)and(CtrlKeyDown=True) then MsgOk("123");
end;
{---------------------------------------------------------------------------}
Procedure StartForm;
begin
    W := NewForm( Applet, "Press Ctrl+A" ).SetSize( 350, 200 );
    W.CenterOnParent;

//??????????????????????????
    W.OnMessage := TOnMessage( MakeMethod( @W, @DoMessage));
    W.Add2AutoFree(nil);
    W.perform(WM_SETHOTKEY,MakeWord(Ord("A"),HOTKEYF_CONTROL),0);
//??????????????????????????

    Run( W );
end;
{---------------------------------------------------------------------------}
begin
    StartForm;
end.
{---------------------------------------------------------------------------}


 
Thaddy   (2006-10-13 10:45) [11]

That code should not work!

try:

Function DoMessage(Dummy:Pointer;Var Msg: TMsg; Var Reslt: Integer): Boolean;


You forgot that Makemethod can only work on normal procedures that take care of the hidden self-pointer that an object method expects.
(See KOL documentation and this forum (many, many times explained :) )


 
Grademax   (2006-10-13 10:56) [12]

Спасибо, Thaddy. Убедил! Пойду начну менять привычки... :)


 
Barloggg   (2007-02-09 14:16) [13]

скопировал код из [9]
А как среагировать на горячую клавишу не активируя при этом приложение?
а то получается приходится нажимать дважды...


 
Barloggg   (2007-02-09 14:57) [14]

скопировал код из [6]
работает.
как насчет инструкций?

Как я понял код клавиши задается так:
RegisterHotkey(form.Handle,1000,MOD_CONTROL,Ord("H"));
а как назначить код клавиши, скажем F1?


 
Barloggg   (2007-02-09 15:00) [15]

да и еще, а как пользоваться компонентом KolHotKey?
и что он вообще делает?


 
mdw ©   (2007-02-09 15:37) [16]


> А как среагировать на горячую клавишу не активируя при этом
> приложение?а то получается приходится нажимать дважды...

Это как????


> как назначить код клавиши, скажем F1?

RegisterHotkey(form.Handle, 1000, 0, VK_F1);


> да и еще, а как пользоваться компонентом KolHotKey?и что
> он вообще делает?

Примерно также и тоже что и HotKey в VCL.


 
Barloggg   (2007-02-12 10:16) [17]


> > А как среагировать на горячую клавишу не активируя при
> этом
> > приложение?а то получается приходится нажимать дважды.
> ..
>
> Это как????

это я про код в [9].


> > да и еще, а как пользоваться компонентом KolHotKey?и что
> > он вообще делает?
>
> Примерно также и тоже что и HotKey в VCL.


а глобальные он может создавать? неплохо бы пример про него создать или урок.


 
mdw ©   (2007-02-12 13:55) [18]

Пример прислать?


 
Моторокер   (2007-03-17 00:50) [19]

Всё работает, но клавиши блокируются.
Есть возможность не блокировать их?
Отправка сообщения в активную программу вызывает зацикливание.

Только через хуки?



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.061 c
2-1190627006
misha_gr
2007-09-24 13:43
2007.10.21
TClientDataSet.Locate


2-1190903883
F@T@L_Err0r
2007-09-27 18:38
2007.10.21
пуск +D


6-1171203227
Grol
2007-02-11 17:13
2007.10.21
Узнать инфу о компах в сети!


15-1190382611
ElectriC
2007-09-21 17:50
2007.10.21
Point n Grafik


2-1190627331
АндрейК
2007-09-24 13:48
2007.10.21
множественный выбор в DBGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский