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

Вниз

Как в 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 вся ветка

Текущий архив: 2007.10.21;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
15-1190632245
aap21
2007-09-24 15:10
2007.10.21
Visio 2003 DrawingControl


2-1190909885
_@_@_
2007-09-27 20:18
2007.10.21
Как в Memo отловить перенос строки.


2-1190878907
Makavelli
2007-09-27 11:41
2007.10.21
Помогите


15-1190111223
Галинка
2007-09-18 14:27
2007.10.21
Массивы переменной длины в Си


2-1190789736
l_v
2007-09-26 10:55
2007.10.21
ServerSocket