Главная страница
    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.01 c
14-71891
TGrigory
2003-08-18 20:09
2003.09.22
На игле


9-71460
[Baradoo]
2003-03-20 22:22
2003.09.22
Как использовать DirectSound при создании таких эффектов как Echo


3-71471
АлеКс
2003-09-02 09:22
2003.09.22
ODBC


3-71479
Andrey V.
2003-09-02 09:23
2003.09.22
Может ли такое быть ???


6-71811
Sasha NT
2003-07-21 01:43
2003.09.22
Програмный разрыв соединения?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский