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

Вниз

Назначение горячих клавиш для окна созданного на winapi   Найти похожие ветки 

 
Intranull   (2010-08-05 20:56) [0]

Приветствую.

Подскажите как обработать горячии клавиши в окне созданом на winapi.
Код примера назначения горячих клавиш который использую:


//В обработчике события OnCreate
//основной формы создаём горячую клавишу:

if not RegisterHotkey(Handle, 1, MOD_ALT or MOD_SHIFT, VK_F9) then
 ShowMessage("Unable to assign Alt-Shift-F9 as hotkey.");

//В событии OnClose удаляем горячую клавишу:
UnRegisterHotkey( Handle, 1 );

//Добавляем обработчик в форму для сообщения
//WM_HOTKEY:

private // в секции объявлений формы
 procedure WMHotkey( var msg: TWMHotkey ); message WM_HOTKEY;

procedure TForm1.WMHotkey( var msg: TWMHotkey );
begin
 if msg.hotkey = 1 then
 begin
   if IsIconic( Application.Handle ) then
     Application.Restore;
   BringToFront;
 end;
end;


Пытаюсь обработать так:


function MainWndProc(hWindow: HWND; Msg: UINT; wParam: wParam;
 lParam: lParam): LRESULT; stdcall; export;
begin
 Result := 0;
 case Msg of

   WM_HOTKEY:
     begin
          ShowMessage("1");
     end;

 else
   begin
     Result := DefWindowProc(hWindow, Msg, wParam, lParam);
     Exit;
   end;
 end;
end;


При создании окна:

window.lpfnWndProc := @MainWndProc;

После создания окна регистрирую горячие клавиши:

RegisterHotkey(WindowHandle, 1, MOD_ALT or MOD_SHIFT, VK_F9);

Где WindowHandle указатель на создаваемое окно

В итоге MainWndProc вообще не вызывается.

Может есть какой другой способ? Хуком не пойдет так как dll использовать нельзя - запрет заказчика.


 
KilkennyCat ©   (2010-08-05 21:13) [1]


> В итоге MainWndProc вообще не вызывается.

это как это?
может, она вызывается все-таки, только делает немного не то, что хочется, а?


 
Intranull   (2010-08-05 21:24) [2]

Ставил брекпоинт, до него на доходит управление.

Немного переделал:


function WindowProc(wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
 case msg of
   WM_Destroy:
     begin
       PostQuitMessage(0);
       Result := 0;
       Exit;
     end;

    WM_HOTKEY:
     begin
       ShowMessage("1");
     end;

 else
   Result := DefWindowProc(wnd, msg, wparam, lparam);
 end;
end;


Вот код создания окна:


var
 InParam: Variant;
 window: TWndClassEx;
 WindowHandle: HWND;
 iSize: integer;
begin
 window.cbSize := sizeof(window);
 window.style := CS_HREDRAW or CS_VREDRAW;
 window.lpfnWndProc := @WindowProc;
 window.cbClsExtra := 0;
 window.cbWndExtra := 0;
 window.hInstance := HInstance;
 window.hIcon := LoadIcon(0, IDI_APPLICATION);
 window.hCursor := LoadCursor(0, IDC_ARROW);
 window.hbrBackground := Color_BtnFace + 12;
 window.lpszMenuName := nil;
 window.lpszClassName := "Main_Window";
 RegisterClassEx(window);
 WindowHandle := CreateWindowEx(0, "Main_Window", "First_WinAPI_Program", WS_OVERLAPPEDWINDOW, 0, 0, 5000, 0, 0, 0, Hinstance, nil);


Думаю ошибка в создании окна, только где понять не могу.


 
Intranull   (2010-08-05 21:54) [3]

разобрался.


var
InParam: Variant;
window: TWndClassEx;
WindowHandle: HWND;


Нужно было выносить в глобальные переменные.

глупая ошибка.

Всем спасибо.


 
Leonid Troyanovsky ©   (2010-08-06 07:21) [4]


> Intranull   (05.08.10 21:54) [3]

> глупая ошибка.

И не одна.

--
Regards, LVT.



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.008 c
2-1281027372
Intranull
2010-08-05 20:56
2010.10.31
Назначение горячих клавиш для окна созданного на winapi


6-1200247318
zsergey
2008-01-13 21:01
2010.10.31
Как правильно написать socks-сервер?


2-1281117985
Игорь
2010-08-06 22:06
2010.10.31
Загрузка драйвера в Windows 7 x64


2-1280974168
Soi
2010-08-05 06:09
2010.10.31
Цикл.Сохранение в цикле предыдущего значения


2-1281091833
AlexDn
2010-08-06 14:50
2010.10.31
Графика и координаты