Форум: "Начинающим";
Текущий архив: 2010.10.31;
Скачать: [xml.tar.bz2];
ВнизНазначение горячих клавиш для окна созданного на 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.061 c