![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Назначение горячих клавиш для окна созданного на winapi [D7, 2000, XP, 2003]
Intranull © (2010-08-05 20:56:00)Приветствую.
Подскажите как обработать горячии клавиши в окне созданом на 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 использовать нельзя - запрет заказчика.
Leonid Troyanovsky (2010-08-06 07:21:00) [1]
> Intranull (05.08.10 21:54) [3]
> глупая ошибка.
И не одна.
--
Regards, LVT.
Intranull (2010-08-05 21:54:00) [2]разобрался.
var
InParam: Variant;
window: TWndClassEx;
WindowHandle: HWND;
Нужно было выносить в глобальные переменные.
глупая ошибка.
Всем спасибо.
Intranull (2010-08-05 21:24:00) [3]Ставил брекпоинт, до него на доходит управление.
Немного переделал:
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);
Думаю ошибка в создании окна, только где понять не могу.
KilkennyCat (2010-08-05 21:13:00) [4]
> В итоге MainWndProc вообще не вызывается.
это как это?
может, она вызывается все-таки, только делает немного не то, что хочется, а?