Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-71935
Basja
2003-09-02 15:16
2003.09.22
Тест кончился. про FTP клиенты


1-71582
scorpi
2003-09-10 09:15
2003.09.22
Форму на первый план


14-71871
Skier
2003-09-02 16:33
2003.09.22
Есть ли переводы ошибок ?


4-72013
Prov
2003-07-21 10:26
2003.09.22
Загрузить текст


8-71765
tv
2003-05-23 13:25
2003.09.22
TCanvas





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский