Как подключить акселератор в приложении основаном на диалоге

Тема в разделе "WASM.BEGINNERS", создана пользователем mikityak, 16 сен 2007.

  1. mikityak

    mikityak Забанен

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    160
    Есть проект в котором основное окно "диалог"
    в ево системное меню дополняетса еще одно..

    ;************************
    .IF uMsg == WM_INITDIALOG
    ;************************

    mov hSysDlgMenu, FUNC(GetSystemMenu,hDlgMain,FALSE)
    invoke AppendMenu,hSysDlgMenu,MF_SEPARATOR,FALSE,NULL
    invoke AppendMenu,hSysDlgMenu,MF_STRING,IDM_RESET,addr szReset

    нажав ево оно чистит список..

    ;****************************
    .ELSEIF uMsg == WM_SYSCOMMAND
    ;****************************
    .if wParam == IDM_RESET
    invoke SendMessage,hCBO1,CB_RESETCONTENT,NULL,NULL
    jmp reset

    ну вот какая проблемма я не хочу постояно заходить в менню а хочу
    назначить клавишу быстрого запуска, наприммер "F5" как ето зделать
    в проекте в котором только одно окно я не знаю..
    В "Microsoft Visual Studio 6.0" визард создает штото подобное но для
    создания окна используетса "CreateWindow" а у миння только "DialogBoxParam"

    и вот я не знаю куда впаять "hAccelTable" который я нашол в исходнике визарда..

    HACCEL hAccelTable;
    hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MY555);

    я имел ввиду што у миння не исользуетса подобный код:

    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

    если кто поннял дайте ответ (канешно ето для MASM32)
    вот исходник если што http://slil.ru/24861651/96000503/WinHide.zip
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    invoke RegisterHotKey, hDlg, 0C000h, NULL, VK_F5 - после создания диалога и получения его хэндла.


    при нажатии F5 в callback на адрес hDlg придёт сообщение WM_HOTKEY, с wParam, установленым в 0C000h.
     
  3. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    cresta
    В msdn написано, что с WM_HOTKEY могут приходить IDHOT_SNAPDESKTOP и IDHOT_SNAPWINDOW. Для этого нужно использовать RegisterHotKey? Окно через CreateWindowEx.
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Не уверен, что правильно понял вопрос...
    Если ты хочешь ловить IDHOT_SNAPDESKTOP и IDHOT_SNAPWINDOW, то регистрировать RegisterHotKey придётся, ибо без RegisterHotKey сообщения WM_HOTKEY (и соответственно IDHOT_SNAPDESKTOP и IDHOT_SNAPWINDOW в качестве wParam при нём) в оконную процедуру не приходят. А как добиться, чтобы wParam был равен указаным константам - не знаю.
     
  5. mikityak

    mikityak Забанен

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    160
    Люди а почему не сохранняетса ни одна страница етих форумов в какой я уже не пробывал формат запакован или так ошыпка страницу нельзя сохранить или ето только у миння !!!
    А г да спасиба за ответы !!!
     
  6. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    cresta
    Спасибо, Вы все правильно поняли.
    Можно регистрируя с RegisterHotKey, но тогда не понятно зачем эти константы вообще нужны.
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    dr_dred

    Я имел ввиду, что непонятно, при каких условиях система посылает WM_HOTKEY с wParam равными IDHOT_SNAPDESKTOP или IDHOT_SNAPWINDOW, если их специально не оговаривать при регистрации. Я во всяком случае потыкал во все клавиши, но так и не увидел этих констант, чтобы они передавались в wParam.
    Ну а если самому их указывать при регистрации, то конечно, они придут.
    Но чем они в таком случае отличаются от любых других чисел - непонятно, и какой смысл присваивать им специальное обозначение - тоже неясно.
     
  8. mikityak

    mikityak Забанен

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    160
    Работает..

    Код (Text):
    1.     ;************************
    2.     .IF uMsg == WM_INITDIALOG
    3.     ;************************
    4.     invoke RegisterHotKey,hDlgMain,0C000h,NULL,VK_F5
    5.  
    6.     ;*************************
    7.     .ELSEIF uMsg == WM_HOTKEY
    8.     ;*************************
    9.     .if wParam == 0C000h
    10.         invoke MessageBeep,MB_OK
    11.     .endif
    п.с
    правда не сосвсем поннятен второй аргумент id..

    BOOL RegisterHotKey(HWND hWnd,
    int id,
    UINT fsModifiers,
    UINT vk);

    id
    [in] Определяет идентификатор горячего ключа.
    Никакой другой горячий ключ на вызове резьбы
    не должен иметь тот же идентификатор.
    Приложение должно определить величину в
    дипазоне 0x0000 через 0xBFFF.
    Динамическая связь коллективной библиотеки () DLL
    должна определить величину в дипазоне 0xC000 через 0xFFFF
    ( дипазон возвратился функцией GlobalAddAtom).
    Для того, чтобы избегать конфликтов с горячими-ключевыми
    идентификаторами определенными другим коллективным DLLs,
    DLL должно использовать функцию GlobalAddAtom,
    чтобы получить горячий-ключевой идентификатор.

    И ещё в системном меню етого диалога есть етот пункт с
    текстом "Reset" и теперь если нажать на "F5" будет
    выполнина таже процедура (ет поннятно) но у миння вопрос
    а как показать в етом пункте менню што мол можно уже просто
    нажать горячую клавишу "F5" и мол ето будет тоже самое, мне
    што нада тупо написать текст "Reset F5" или есть какойто
    метод програмно ето зделать.. Я помню когда работаеш с
    редактором "меню" он ети горячие клавишы ставит в пункте менню
    красива, так сказать под ленейку..
     
  9. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Ты сделал глобальную горячую клавишу (зарегистрировал ее в системе с помощью RegisterHotKey).
    Теперь действие по F5 будет работать даже когда окно скрыто.

    Для твоих целий лучше всетаки разобратся с TranslateAccelerator
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    mikityak

    Если у тебя есть редактор меню, то в нем наверняка можно указать любую клавишу для итема меню.
    Делаешь меню, которое аналогично системному, и указываешь в нем для итема Reset горячую клавишу F5. А при запуске программы удаляешь пункты системного меню, и на их место втыкаешь своё меню с клавишей F5.
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    GMax
    Для использования TranslateAccelerator нужно не использовать DialogBoxParam. Это вечная проблема. В таких случаях можно поискать по форуму или обрабатывать WM_KEYDOWN самостоятельно.

    mikityak
    Если в редакторе меню все же нет кнопочки для назначения горячей клавиши, делай типа следующего:
    "Reset\tF5"
    \t поставит tab.
     
  12. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    http://wasm.ru/forum/viewtopic.php?id=10429
     
  13. _mikityak

    _mikityak New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2007
    Сообщения:
    2
    KeSqueer

    В место \т поставил 9

    Код (Text):
    1. szReset db "Reset", 9, 0
    [​IMG]