Форум: "WinAPI";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизИспользование гарячих клавиш. Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.042 c