Форум: "WinAPI";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
Внизнеработают HotKey Найти похожие ветки
← →
Shift (2003-07-20 13:25) [0]немогу понять почему неработают HotKey
вот исходник:
program HotKey;
uses Windows, Messages, ShellApi;
const
ClsName : PChar = "ClsName";
cPLAY = 40045;
var
pWnd : HWnd;
hwndWA : HWnd;
pMsg : TMsg;
WndCls : TWndClass;
WA_Play : Integer;
function WndProc(wnd:HWND;message:UInt;wParam:DWORD;lParam:longint):longint;stdcall;
begin
Result:=0;
case message of
WM_CLOSE : PostQuitMessage(0);
WM_CREATE : begin
WA_Play := GlobalAddAtom("WAPause");
RegisterHotKey( pWnd, WA_Play, mod_control, 96);
end;
WM_DESTROY : begin
UnRegisterHotKey( pWnd, WA_Play);
end;
WM_HOTKEY : begin
hwndWA := FindWindow("Winamp v1.x", nil);
If (hwndWA<>0) or (wPram=MOD_CONTROL) then
begin
if lPram=96 then SendMessage( hwndWA, WM_COMMAND, cPLAY, 0);
end;
end;
else Result:=DefWindowProc(Wnd,message,wParam,lParam);
end;
end;
begin
FillChar(WndCls,SizeOf(WndCls),0);
with WndCls do
begin
lpfnWndProc := @WndProc;
( WndCls)немогу понять почему неработают HotKey
вот исходник:
program HotKey;
uses Windows, Messages, ShellApi;
const
ClsName : PChar = "ClsName";
cPLAY = 40045;
var
pWnd : HWnd;
hwndWA : HWnd;
pMsg : TMsg;
WndCls : TWndClass;
WA_Play : Integer;
function WndProc(wnd:HWND;message:UInt;wParam:DWORD;lParam:longint):longint;stdcall;
begin
Result:=0;
case message of
WM_CLOSE : PostQuitMessage(0);
WM_CREATE : begin
WA_Play := GlobalAddAtom("WAPause");
RegisterHotKey( pWnd, WA_Play, mod_control, 96);
end;
WM_DESTROY : begin
UnRegisterHotKey( pWnd, WA_Play);
end;
WM_HOTKEY : begin
hwndWA := FindWindow("Winamp v1.x", nil);
If (hwndWA<>0) or (wPram=MOD_CONTROL) then
begin
if lPram=96 then SendMessage( hwndWA, WM_COMMAND, cPLAY, 0);
end;
end;
else Result:=DefWindowProc(Wnd,message,wParam,lParam);
end;
end;
begin
FillChar(WndCls,SizeOf(WndCls),0);
with WndCls do
begin
lpfnWndProc := @WndProc;
lpszClassName := ClsName;
end;
WndCls.hInstance := hInstance;
RegisterClass(WndCls);
pWnd := CreateWindow(WndCls.lpszClassName,nil,0,0,0,0,0,0,0,HInstance,nil);
if pWnd = 0 then Halt;
while GetMessage(pMsg,0,0,0) do DispatchMessage(pMsg);
end.
← →
Rouse_ (2003-07-20 14:19) [1]Мдаа... уж.
Ошибка на ошибке и ошибкой погоняет.
К примеру:
RegisterHotKey( pWnd, WA_Play, mod_control, 96);
Здесь pWnd все еще равно нулю
If (hwndWA<>0) or (wPram=MOD_CONTROL) then
Вы думаете это верное условие? Либо окно Ампа найдено, либо нажат Ctrl? Странная логика.
К томуже WParam содержит идентификатор горячей клавиши, в данном случае он будет равен WA_Play
if lPram=96 then
С чего Вы взяли что это верно?
Да к томуже нет такой переменной lPram а есть lP Aram, как и нет переменной wPram
Короче вот держите, специально для вас правильно написанный пример:
program Demo_APIWindow;
uses
windows,
messages;
const
cPLAY = 40045;
var
wc : TWndClassEx;
Wnd : HWND;
Msg : TMsg;
idhot1: Integer;
Err: Boolean;
hwndWA: HWND;
function WindowProc(wnd : HWND; Msg : Integer; WParam : WParam; LParam : Longint): Longint; stdcall;
Begin
Result := 0;
case msg of
wm_destroy :
Begin
postquitmessage(0);
exit;
Result:=0;
End;
WM_QUIT :
Begin
postquitmessage(0);
exit;
Result:=0;
End;
WM_HOTKEY:
begin
if WParam = idhot1 then
begin
hwndWA := FindWindow("Winamp v1.x", nil);
If (hwndWA<>0) then
begin
SendMessage( hwndWA, WM_COMMAND, cPLAY, 0);
end;
end;
end;
else
Result := DefWindowProc(wnd, msg, wparam, lparam);
end;
End;
begin
wc.cbSize := sizeof(wc);
wc.style := cs_hredraw or cs_vredraw;
wc.lpfnWndProc := @WindowProc;
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
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 := "Hot key example";
RegisterClassEx(wc);
Wnd := CreateWindow("Hot key example", "Hot key example for Shift", ws_overlapped or WS_SYSMENU, 100, 150, 360, 200, 0, 0, Hinstance, nil);
Err := False;
idhot1:=GlobalAddAtom("Hot key example Atom");
Err := RegisterHotKey(Wnd, idhot1, MOD_CONTROL, 96); // Горячая клавиша Ctrl+Nupad(0)
if not Err then Halt;
ShowWindow(Wnd, CmdShow); // - Окно видно
//ShowWindow(Wnd, SW_HIDE); // - Окна не видно
While GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
( Msg)Мдаа... уж.
Ошибка на ошибке и ошибкой погоняет.
К примеру:
RegisterHotKey( pWnd, WA_Play, mod_control, 96);
Здесь pWnd все еще равно нулю
If (hwndWA<>0) or (wPram=MOD_CONTROL) then
Вы думаете это верное условие? Либо окно Ампа найдено, либо нажат Ctrl? Странная логика.
К томуже WParam содержит идентификатор горячей клавиши, в данном случае он будет равен WA_Play
if lPram=96 then
С чего Вы взяли что это верно?
Да к томуже нет такой переменной lPram а есть lP Aram, как и нет переменной wPram
Короче вот держите, специально для вас правильно написанный пример:
program Demo_APIWindow;
uses
windows,
messages;
const
cPLAY = 40045;
var
wc : TWndClassEx;
Wnd : HWND;
Msg : TMsg;
idhot1: Integer;
Err: Boolean;
hwndWA: HWND;
function WindowProc(wnd : HWND; Msg : Integer; WParam : WParam; LParam : Longint): Longint; stdcall;
Begin
Result := 0;
case msg of
wm_destroy :
Begin
postquitmessage(0);
exit;
Result:=0;
End;
WM_QUIT :
Begin
postquitmessage(0);
exit;
Result:=0;
End;
WM_HOTKEY:
begin
if WParam = idhot1 then
begin
hwndWA := FindWindow("Winamp v1.x", nil);
If (hwndWA<>0) then
begin
SendMessage( hwndWA, WM_COMMAND, cPLAY, 0);
end;
end;
end;
else
Result := DefWindowProc(wnd, msg, wparam, lparam);
end;
End;
begin
wc.cbSize := sizeof(wc);
wc.style := cs_hredraw or cs_vredraw;
wc.lpfnWndProc := @WindowProc;
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
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 := "Hot key example";
RegisterClassEx(wc);
Wnd := CreateWindow("Hot key example", "Hot key example for Shift", ws_overlapped or WS_SYSMENU, 100, 150, 360, 200, 0, 0, Hinstance, nil);
Err := False;
idhot1:=GlobalAddAtom("Hot key example Atom");
Err := RegisterHotKey(Wnd, idhot1, MOD_CONTROL, 96); // Горячая клавиша Ctrl+Nupad(0)
if not Err then Halt;
ShowWindow(Wnd, CmdShow); // - Окно видно
//ShowWindow(Wnd, SW_HIDE); // - Окна не видно
While GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
Желаю успехов
← →
Shift (2003-07-20 14:47) [2]Спасибо!!!!!!!!!!!!!!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c