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

Вниз

Использование гарячих клавиш.   Найти похожие ветки 

 
Thespian   (2004-02-05 12:37) [0]

Доброе время суток, мастера!!!
Я делаю небольшую программку, которая реагирует должна реагировать на нажатие каких-либо клавиш.
Т.е. если пользователь нажмёт (в любом приложении) клавишу "К", то моя программа должна сработать.
Делов том, что сначала я использовал VCL + стандартные функции WinAPI (см.ниже) и всё работало прекрасно. Затем захотелось уменьшить размер программы и я перешёл на чистый WinAPI.
И вот какая странность получается:
 Отлавливание гарячих клавиш от полноэкранного приложения не происходит, хотя с использованием VCL всё работало нормально.
 
 Код функций WinAPI по отлавливанию гарячих клавиш в обоих слючаях одинаков.

Вот куски кода (в обоих режимах они одинаковы):

Var
 hk1, hk2, hk3: integer;

Procedure SetHotKeys(Handle: THandle);
Begin
 hk1:=GlobalAddAtom("hotkeyT");
 RegisterHotKey(handle, hk1, 0, 84);
 hk2:=GlobalAddAtom("hotkeyY");
 RegisterHotKey(handle, hk2, 0, 89);
End;

Procedure UnSetHotKeys(Handle: THandle);
Begin
 UnRegisterHotKey(handle, hk1);
 UnRegisterHotKey(handle, hk2);
End;

Procedure ParseHotKey(Key: integer);
Begin
 Case Key Of
   84: HK1Proc;
   89: HK2Proc;
 End;
End;
-------------------------------------------
Function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer;
{функция окна}
stdcall; export;
Var
 x, y: smallint;
 a: pointer;
Begin
 Result:=0;
 Case uMsg Of
   WM_HOTKEY:
     Begin
       a:=@lParam;
       Asm
         mov edx, dword ptr a
         mov ax, [edx+2]
         mov x, ax
       End;
       ParseHotKey(x);
     End;
 End;
 If Result=0 Then
   Result:=DefWindowProc(hWnd, uMsg, wParam, lParam);
End;

Может кто сталкивался?
Заранее, спасибо.


 
Rouse_ ©   (2004-02-05 13:37) [1]

Вот это:
a:=@lParam;
     Asm
       mov edx, dword ptr a
       mov ax, [edx+2]
       mov x, ax
     End;


можешь заменить на
Х := lParam shr 16;

и попробуй убрать условие If Result=0 Then

export; - ИМХО лишнее

ЗЫ: Желательно привести код создания окна...


 
Thespian   (2004-02-06 00:10) [2]

Program myKey;

Uses
 Windows,
 Messages,
 shellapi,
 design In"design.pas",
 prg_data In"prg_data.pas";

Const
 wWidth=180;
 wHeigth=120;
Var
 hWnd, Desk: THandle;
 WndClass: TWndClass;
 Msg: TMsg;
 Rect: TRect;
 BCActive: boolean=false;

 {$R *.res}

Function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer; stdcall;
Var
 x: smallint;
Begin
 Result:=0;
 Case uMsg Of
   WM_HOTKEY:
     Begin
      x:=lParam shr 16;
       if ParseHotKey(x) then
         RepaintBk;
     End;
   WM_KeyDown:
     Begin
       If wParam=27 Then
       Begin
         UnSetHotKeys(hWnd);
         halt(0);
       End;
     End;
   WM_Paint:
     begin
     RepaintBk;
     Result:=DefWindowProc(hWnd, uMsg, wParam, lParam);
     end;
   WM_DESTROY:
     Begin
       UnSetHotKeys(hWnd);
       halt(0);
     End;
     Else
       Result:=DefWindowProc(hWnd, uMsg, wParam, lParam);
 End;
End;

Begin
 FillChar(WndClass, SizeOf(WndClass), 0);
 With WndClass Do
 Begin
   hInstance:=SysInit.hInstance;
   lpszClassName:=sClassName;
   lpfnWndProc:=@WindowProc;
   hbrBackground:=GetStockObject(LTGRAY_BRUSH);
 End;
 RegisterClass(WndClass);
 Desk:=GetDesktopWindow;
 GetWindowRect(Desk, Rect);
 hWnd:=CreateWindow(sClassName, sWndCaption, WS_POPUP Or WS_GROUP Or
   WS_VISIBLE,
   Round((Rect.BottomRight.X-wWidth)/2), Round((Rect.BottomRight.Y-wHeigth)/2),
   wWidth, wHeigth, 0, 0, hInstance, Nil);
 If hWnd=0 Then
 Begin
   MessageBox(0, "Initialisation failed", Nil, ID_OK);
   Exit;
 End;
 SetHotKeys(hWnd);
 GetStatus;
 SetTimer(hWnd, 1, 500, @GetStatus);
 ShowWindow(hWnd, SW_normal);
 While GetMessage(Msg, HWnd, 0, 0) Do
 Begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
 End;
 UnSetHotKeys(hWnd);
 Halt(Msg.wParam);
End.



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

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

Наверх




Память: 0.48 MB
Время: 0.031 c
6-1079593460
Vovanx
2004-03-18 10:04
2004.04.11
Есть ли смысл использовать IdTCPServer?


7-1079501839
Zyb
2004-03-17 08:37
2004.04.11
Запуск закрытие приложения


4-1078654631
GrayFace
2004-03-07 13:17
2004.04.11
Как получать и изменять тексты кнопок OK , Cancel и т.д.


14-1081963226
Yermek
2004-04-14 21:20
2004.04.11
СРОЧНО!!! - Техничекая документация


6-1076050157
alex_old
2004-02-06 09:49
2004.04.11
Как сделать ловушку для определенного сообщения в локалке