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

Вниз

неработают 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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.031 c
1-71594
slva
2003-09-09 18:00
2003.09.22
Русификация


7-71972
Ozone
2003-07-08 09:53
2003.09.22
Рисование на рабочем столе


6-71790
Blondin
2003-07-22 14:56
2003.09.22
Подтверждение получения письма


14-71954
Pindos
2003-09-02 13:36
2003.09.22
Подсчет времени и провдённого в Интернете


6-71805
MegaVolt
2003-07-21 15:56
2003.09.22
Почему процедура перестала выдавать имя компутера?