Что такое код translateaccelerator

Содержание

Создание акселераторов в runtime посредством CreateAcceleratorTable() или ошибочна ли документация с MSDN

На этом форуме и в интернете уже есть обсуждения похожей проблемы, однако, ни в одном из них не затрагивается суть (как я её вижу), проблемы. Собственно, в чём суть: открыв эту статью, узнаём, что акселератор можно создать двумя способами: используя ресурсы приложения, или непосредственно в runtime, используя структуру ACCEL и функцию CreateAcceleratorTable().

Начнём с первого способа. Используя ResEdit, создаём файл ресурсов со следующим кодом:

После этого, запустив приложение, нажимаем клавиши Ctrl+A и наблюдаем ожидаемый вызов MessageBox’а.

Теперь переходим ко второму способу. Структура ACCEL в указанной статье имеет следующее определение:

После чего запускаем приложение и с растопыренными глазами смотрим, что при нажатии клавиш Ctrl+A уже ничего не происходит, даже не отсылается WM_COMMAND.

Чудеса? Нет, конечно!
После неудачной попытки создать акселератор в runtime, ищем в заголовочных файлах определение структуры ACCEL:

И находим ещё одно определение этой структуры, о котором на MSDN и слова не сказано, даже в статье об этой структуре. Естественно, второе определение неактивно из-за препроцессорного условия.

Руководствуясь смекалкой, переопределяем структуру ACCEL:

Запускаем приложение и уже с чуть менее растопыренными глазами наблюдаем ожидаемое от приложения поведение – вызов MessageBox’a по нажатию Ctrl+A. Говорить могу только за себя. На других компьютерах это приложение не тестировал. И, собственно, вопрос: может ли кто-нибудь прокомментировать моё данное наблюдение и, если необходимо, указать на допущенные мною ошибки, приведшие к такому стечению обстоятельств?

Я использовал Microsoft Visual Studio 2010 Express, OS – Windows 7 Домашняя расширенная, x64.

ВИДЕОКУРС
выпущен 4 ноября!

Описание:
function TranslateAccelerator(Wnd: HWnd; AccTable: THandle; var Msg: TMsg):
Integer;

Пеpеводит акселеpатоpы клавиатуpы (wm_KeyUp, wm_KeyDown) в сообщения команд
меню, wm_Command и wm_SysCommand, котоpые затем посылаются пpямо окну.

Паpаметpы:
Wnd: Идентификатоp окна.
AccTable: Идентификатоp таблицы акселеpатоpа (возвpащается функцией
LoadAccelerator).
Msg: Инфоpмация TMsg, считанная из GetMessage или PeekMessage.

Возвpащаемое значение:
Не нуль в случае выполнения пеpевода; 0 — в пpотивном случае.

Why are there Unicode and ANSI versions of the CreateAcceleratorTable and TranslateAccelerator functions?

As far as I can see neither the CreateAcceleratorTable function nor the TranslateAccelerator functions handle string or character data so I’m wondering why they come in both Unicode and ANSI versions? This is the ACCEL data structure.

1 Answer 1

CreateAcceleratorTable does handle character data.

key
Type: WORD

The accelerator key. This member can be either a virtual-key code or a character code.

A character code can be more than just a ASCII char. Out of the ASCII range, its meaning depends on whether it is ANSI or Unicode.

Why would a character code be more than ASCII? Isn’t our keyboard only has ASCII characters anyway? Well, here is my guessing. Imagine that on Japanese Windows where ANSI defaults to Shift-JIS, a Japan user that uses Kana Input (where a keystroke can directly type out あ/い/う/え. ) press an accelerator key of those Kana, like Ctrl+あ .

As for the TranslateAccelerator , since that an accelerator can be non-ASCII, there is a need too, to translate the key code of WM_KEYDOWN , WM_SYSKEYDOWN , WM_CHAR , and WM_SYSCHAR , to Unicode before passing to the internal implementation.

The following code are excerpt from the leaked Windows 2000 source code.

Source code of RtlMBMessageWParamCharToWCS can be found here.

Что такое код translateaccelerator

Translates accelerator keystrokes intended for the container’s frame while an object is active in place.

Syntax

Parameters

A pointer to the MSG structure that contains the keystroke message.

The command identifier value corresponding to the keystroke in the container-provided accelerator table. Containers should use this value instead of translating again.

Return value

This method returns S_OK on success. Other possible return values include the following.

The keystroke was not used.

The specified pointer is invalid.

An unexpected error occurred.

Remarks

Notes to Callers

The IOleInPlaceFrame::TranslateAccelerator method is called indirectly by OleTranslateAccelerator when a keystroke accelerator intended for the container (frame) is received.

Notes to Implementers

The container application should perform its usual accelerator processing, or use wID directly, and then return, indicating whether the keystroke accelerator was processed. If the container is an MDI application and the TranslateAccelerator function fails, the container can call the TranslateMDISysAccel function, just as it does for its usual message processing.

In-place objects should be given first chance at translating accelerator messages. However, because objects implemented by DLL object applications do not have their own message pump, they receive their messages from the container’s message queue. To ensure that the object has first chance at translating messages, a container should always call IOleInPlaceFrame::TranslateAccelerator before doing its own accelerator translation. Conversely, an executable object application should call OleTranslateAccelerator after calling TranslateAccelerator, calling TranslateMessage and DispatchMessage only if both translation functions fail.

You should define accelerator tables for containers so they will work properly with object applications that do their own accelerator keystroke translations. Tables should be defined as follows.

This is the most common way to describe keyboard accelerators. Failure to do so can result in keystrokes being lost or sent to the wrong object during an in-place session.

Requirements

Minimum supported client

Windows 2000 Professional [desktop apps only]

Minimum supported server

Windows 2000 Server [desktop apps only]

IID_IOleInPlaceFrame is defined as 00000116-0000-0000-C000-000000000046

Почему существует Unicode и ANSI версии функций CreateAcceleratorTable и TranslateAccelerator?

December 2020

58 раз

Насколько я могу видеть ни CreateAcceleratorTable функции , ни TranslateAccelerator функции обработки данных строк или символов , так что я задаюсь вопросом , почему они приходят в обоих Unicode и ANSI версии? Это УСКОР структура данных.

1 ответы

CreateAcceleratorTable does handle character data.

key
Type: WORD

The accelerator key. This member can be either a virtual-key code or a character code.

A character code can be more than just a ASCII char. Out of the ASCII range, its meaning depends on whether it is ANSI or Unicode.

Why would a character code be more than ASCII? Isn’t our keyboard only has ASCII characters anyway? Well, here is my guessing. Imagine that on Japanese Windows where ANSI defaults to Shift-JIS, a Japan user that uses Kana Input (where a keystroke can directly type out あ/い/う/え. ) press an accelerator key of those Kana, like Ctrl+あ .

As for the TranslateAccelerator , since that an accelerator can be non-ASCII, there is a need too, to translate the key code of WM_KEYDOWN , WM_SYSKEYDOWN , WM_CHAR , and WM_SYSCHAR , to Unicode before passing to the internal implementation.

The following code are excerpt from the leaked Windows 2000 source code.

Source code of RtlMBMessageWParamCharToWCS can be found here.

Как TranslateAccelerator знает о модификаторе CTRL или SHIFT?

Я работаю в программе, которая использует клавиши Accelerator для пользовательских горячих клавиш, и все отлично работает. Пользователь может устанавливать горячие клавиши с помощью SHIFT, CTRL или ALT. Я знаю, что использование ALT генерирует WM_SYSKEYDOWN, а не WM_KEYDOWN, поэтому это довольно очевидно, когда ALT удерживается.

TranslateAccelerator принимает только дескриптор окна, дескриптор таблицы ускорения и одно сообщение KEYDOWN. Итак, мой вопрос: если пользователь нажимает CTRL + T, то как TranslateAccelerator знает, что клавиша CTRL была нажата?

Я знаю, что CTRL генерирует отдельную команду KEYDOWN, и я специально отфильтровал их (не переходите к TranslateAccelerator), чтобы проверить теорию, но TranslateAccelerator все еще работает.

Что такое код translateaccelerator

Processes accelerator keys for menu commands. The function translates a WM_KEYDOWN or WM_SYSKEYDOWN message to a WM_COMMAND or WM_SYSCOMMAND message (if there is an entry for the key in the specified accelerator table) and then sends the WM_COMMAND or WM_SYSCOMMAND message directly to the specified window procedure. TranslateAccelerator does not return until the window procedure has processed the message.

Syntax

Parameters

Type: HWND

A handle to the window whose messages are to be translated.

Type: HACCEL

A handle to the accelerator table. The accelerator table must have been loaded by a call to the LoadAccelerators function or created by a call to the CreateAcceleratorTable function.

Type: LPMSG

A pointer to an MSG structure that contains message information retrieved from the calling thread’s message queue using the GetMessage or PeekMessage function.

Return value

Type: int

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

To differentiate the message that this function sends from messages sent by menus or controls, the high-order word of the wParam parameter of the WM_COMMAND or WM_SYSCOMMAND message contains the value 1.

Accelerator key combinations used to select items from the window menu are translated into WM_SYSCOMMAND messages; all other accelerator key combinations are translated into WM_COMMAND messages.

When TranslateAccelerator returns a nonzero value and the message is translated, the application should not use the TranslateMessage function to process the message again.

An accelerator need not correspond to a menu command.

If the accelerator command corresponds to a menu item, the application is sent WM_INITMENU and WM_INITMENUPOPUP messages, as if the user were trying to display the menu. However, these messages are not sent if any of the following conditions exist:

  • The window is disabled.
  • The accelerator key combination does not correspond to an item on the window menu and the window is minimized.
  • A mouse capture is in effect. For information about mouse capture, see the SetCapture function.

If the specified window is the active window and no window has the keyboard focus (which is generally the case if the window is minimized), TranslateAccelerator translates WM_SYSKEYUP and WM_SYSKEYDOWN messages instead of WM_KEYUP and WM_KEYDOWN messages.

If an accelerator keystroke occurs that corresponds to a menu item when the window that owns the menu is minimized, TranslateAccelerator does not send a WM_COMMAND message. However, if an accelerator keystroke occurs that does not match any of the items in the window’s menu or in the window menu, the function sends a WM_COMMAND message, even if the window is minimized.

Examples

Requirements

Minimum supported client

Windows 2000 Professional [desktop apps only]

Minimum supported server

Windows 2000 Server [desktop apps only]

Unicode and ANSI names

TranslateAcceleratorW (Unicode) and TranslateAcceleratorA (ANSI)

Win32 API. Быстрые клавиши

Written on 18 Февраля 2007 . Posted in Win32

ОГЛАВЛЕНИЕ

Об ускорителях клавиатуры

Акселераторы тесно связаны с меню — оба обеспечивают пользователю доступ к набору команд управления прикладной программой. Как правило, пользователи полагаются на меню прикладной программы, чтобы изучить набор команд, а затем переключаются на использование акселераторов, поскольку становятся более опытными в обращении с приложением. Акселераторы предоставляют быстрее прямой доступ к большему количеству команд, чем это делает меню. Как минимум, прикладная программа должна предусмотреть акселераторы для наиболее часто используемых команд. Хотя акселераторы обычно генерируют команды, которые существуют, такие как пункты меню, они также могут создавать и команды, которые не имеют подобных эквивалентных пунктов меню.

Таблицы клавиш-ускорителей

Таблица клавиш – ускорителей (accelerator table) состоит из массива структур ACCEL, каждая из которых определяет конкретный акселератор. Каждая структура ACCEL включает в себя следующую информацию:

  1. Комбинацию нажатия клавиши — ускорителя.
  2. Идентификатор акселератора.
  3. Различные флажки. Эти флажки включают в себя и тот, который определяет, должен ли Windows предоставлять визуальную обратную связь, когда акселератор использован, высвечивая соответствующий пункт меню, если он есть в наличии.

Чтобы обрабатывать нажатия клавиш — акселераторов для данного потока, разработчик должен вызвать функцию TranslateAccelerator в цикле сообщения, связанном с очередью сообщений потока. Функция TranslateAccelerator контролирует ввод с клавиатуры в очереди сообщений, проверяя комбинации клавиш, которые соответствуют элементу в таблицах клавиш — ускорителей. Когда TranslateAccelerator находит соответствие, она переводит ввод с клавиатуры (то есть сообщения WM_KEYUP и WM_KEYDOWN) в сообщение WM_COMMAND или WM_SYSCOMMAND, а затем отправляет сообщение оконной процедуре определяемого окна.

Сообщение WM_COMMAND включает в себя идентификатор клавиши-ускорителя, которая заставила TranslateAccelerator сгенерировать сообщение. Оконная процедура проверяет идентификатор, чтобы определить источник сообщения, а затем соответственно обрабатывает сообщение.

В Windows таблицы клавиш-ускорителей существуют на двух различных уровнях. Windows поддерживает единственную, на системном уровне таблицу клавиш-ускорителей, которая применяется всеми прикладными программами. Прикладная программа не может изменить системную таблицу акселераторов. За описанием клавиш — ускорителей, предусмотренных системной таблицей акселераторов, обратитесь к статье Предназначения нажатий клавиш — ускорителей.

Windows поддерживает также и таблицы клавиш – ускорителей для каждой прикладной программы. Приложение может определять любое число таблиц акселераторов для использования своими собственными окнами. Уникальный 32-разрядный дескриптор (HACCEL) идентифицирует каждую таблицу. Однако только одна таблица клавиш – ускорителей одновременно может быть активна для данного потока. Дескриптор таблицы клавиш — ускорителей, передаваемый в функцию TranslateAccelerator, определяет, какая таблица акселераторов является активной для потока. Активная таблица акселераторов может быть переопределена в любое время, при помощи передачи соответствующего дескриптора таблицы клавиш-ускорителей в TranslateAccelerator.

Создание таблиц клавиш ускорителей

Требуются несколько шагов, чтобы создать таблицу клавиш-ускорителей для прикладной программы. Сначала используется транслятор ресурса, чтобы создать ресурсы таблиц акселераторов и добавить их к исполняемому файлу приложения. Во время запуска программы, функция LoadAccelerators используется, чтобы загрузить таблицу клавиш-ускорителей в память и получить ее дескриптор. Этот дескриптор передается в функцию TranslateAccelerator, чтобы активизировать таблицу клавиш-ускорителей.

Таблица акселераторов также может быть создана для приложения и во время выполнения программы, при помощи передачи массива структур ACCEL в функцию CreateAcceleratorTable. Этот метод поддерживает определяемые пользователем акселераторы в прикладной программе. Подобно функции LoadAccelerators, CreateAcceleratorTable возвращает дескриптор таблицы клавиш-ускорителей, который может быть передан в TranslateAccelerator, чтобы привести в действие таблицу акселераторов.

Windows автоматически разрушает таблицы клавиш-ускорителей, загруженные LoadAccelerators. Таблица акселераторов, созданная CreateAcceleratorTable должна быть разрушена до того, как прикладная программа закроется; иначе, таблица продолжает существовать в памяти и после того, как приложение закрылась. Таблица клавиш-ускорителей разрушается, при помощи вызова функцию DestroyAcceleratorTable.

Существующая таблица клавиш-ускорителей может быть скопирована и модифицирована. Существующая таблица клавиш-ускорителей копируется, при помощи использования функции CopyAcceleratorTable. После того, как копия модифицирована, дескриптор новой таблицы акселераторов извлекается при помощи вызова CreateAcceleratorTable. В конечном итоге, дескриптор отправляется в TranslateAccelerator, чтобы активизировать новую таблицу.

Присваивание нажатий клавиш — ускорителей

Чтобы определить клавишу — ускоритель, может быть использован код символа ASCII или код виртуальной клавиши. Код символа ASCII делает клавишу — ускоритель чувствительной к регистру. Символ ASCII «C» может определять акселератор как ALT+c, а не ALT+C. Однако чувствительные к регистру клавиши — акселераторы могут быть сложными для использования. Например, клавиша — акселератор ALT+C будет сгенерирована, если клавиша CAPS LOCK или SHIFT — нажата, но не в случае, если нажаты обе.

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

Избегайте клавиш — ускорителей, которые находятся в противоречии с мнемоникой меню прикладной программы, потому что клавиша — ускоритель отменяет мнемонический символ, что может запутать пользователя. Для получения дополнительной информации о меню, см. статью Меню.

Если прикладная программа определяет клавишу — ускоритель, которая также определена в системной таблице акселераторов, определяемая программой клавиша — ускоритель отменяет системный акселератор, но только в пределах контекста прикладной программы. Как угодно избегайте этой практики, потому что она препятствует системной клавише — ускорителю в выполнении ее стандартной роли в интерфейсе пользователя Windows. Акселераторы системного уровня описаны в ниже следующем списке:

  • ALT+ESC — Переключает в следующее приложение (для Windows версии 3.1). Переключает приложения на панели задач в Windows 95 и выше.
  • ALT+F4 — Закрывает приложение или окно.
  • ALT+HYPHEN — Открывает Системное меню для окна документа.
  • ALT+PRINT SCREEN — Копирует изображение активного окна в буфер обмена.
  • ALT+SPACEBAR — Открывает Системное меню для окна приложения.
  • ALT+TAB — Переключает в следующее приложение.
  • CTRL+ESC — Переключает список задач (для Windows версии 3.1) Эквивалентно нажатию кнопки Пуск (для Windows 95 и выше).
  • CTRL+F4 — Закрывает активную группу или окно документа.
  • F1 — Если у приложения имеется Справка (Help), запускает Справку.
  • PRINT SCREEN — Копирует изображения экрана в буфер обмена.
  • SHIFT+ALT+TAB — Переключает в предыдущее приложение. Пользователь должен нажать и удерживать нажатыми кнопки ALT+SHIFT до нажатия кнопки TAB.

Клавиши — ускорители и меню

Использование клавиши – ускорителя является тем же самым действием, что и выбор пункта меню: оба действия заставляют Windows отправлять сообщение WM_COMMAND или WM_SYSCOMMAND в соответствующую оконную процедуру. Сообщение WM_COMMAND включает в себя идентификатор, который оконная процедура проверяет, чтобы определить источник сообщения. Если сообщение WM_COMMAND создал акселератор, то идентификатор – для этой клавиши — ускорителя. Точно так же, если сообщение WM_COMMAND создал пункт меню, то идентификатор — этого пункта меню. Поскольку акселератор предусматривает ярлык для выбора команды из меню, прикладная программа обычно присваивает тот же самый идентификатор и для клавиши — ускорителя и соответствующему пункту меню.

Приложение обрабатывает сообщение WM_COMMAND клавиши — ускорителя точно таким же самым способом, что и соответствующее сообщение WM_COMMAND пункта меню. Однако, сообщение WM_COMMAND содержит флажок, который определяет, создано ли сообщение клавишей — ускорителем или пунктом меню, в случае, если это акселераторы, они должны быть обработаны по-другому из соответствующих им пунктов меню. Сообщение WM_SYSCOMMAND не содержит этот флажок.

Идентификатор определяет, генерирует ли клавиша — ускоритель сообщение WM_SYSCOMMAND или WM_COMMAND. Если идентификатор имеет то же самое значение, что и пункт меню в Системном меню, акселератор создает сообщение WM_SYSCOMMAND. В противном случае, клавиша — ускоритель генерирует сообщение WM_COMMAND.

Если клавиша — ускоритель имеет тот же самый идентификатор, что и пункт меню, а пункт меню недоступен или заблокирован, акселератор блокируется и не генерирует сообщение WM_SYSCOMMAND или WM_COMMAND. Клавиша – ускоритель также не генерирует сообщение команды, если соответствующее окно свернуто.

Когда пользователь использует клавишу — ускоритель, которая соответствует пункту меню, оконная процедура принимает сообщения WM_INITMENU и WM_INITMENUPOPUP, как если бы пользователь выбрал пункт меню. За информацией относительно того, как обрабатывать эти сообщения, обратитесь к статье. Меню.

Клавиша — ускоритель, которая соответствует пункту меню, должна быть включена в текст пункта меню.

Использование клавиш-ускорителей клавиатуры

Использование ресурса таблицы клавиш-ускорителей
Использование таблицы клавиш-ускорителей, созданной во время прогона программы

Использование ресурса таблицы клавиш-ускорителей

Наиболее общий способ добавления поддержки клавиши — ускорителя к прикладной программе на базе Windows состоит в том, чтобы включить ресурс таблицы акселераторов в исполняемый файл прикладной программы, а затем загрузить ресурс во время прогона программы. Шаги, вовлекающие в использование ресурса таблицы клавиш-ускорителей следующие:

  1. Создайте таблицу клавиш-ускорителей в файле определения ресурса. Компилируйте его и добавьте итоговый ресурс к исполняемому файлу вашей прикладной программы.
  2. Включите вызов функции LoadAccelerators, чтобы загрузить ресурс таблицы клавиш-ускорителей и примите дескриптор таблицы клавиш-ускорителей.
  3. Добавьте функцию TranslateAccelerator к циклу сообщения, связанному с таблицей клавиш-ускорителей.
  4. Организуйте обработку создаваемого сообщения WM_COMMAND, когда пользователь использует клавишу — ускоритель.

Создание ресурса таблицы клавиш-ускорителей

Вы создаете ресурс таблицы клавиш-ускорителей, используя оператор ACCELERATORS в файле определения ресурса вашей прикладной программы. Вы должны присвоить имя или идентификатор ресурсу таблицы клавиш-ускорителей, желательно не похожий на идентификатор или имя какого-либо другого ресурса. Windows использует этот идентификатор, чтобы загрузить ресурс во время прогона программы.

Каждая клавиша — ускоритель, которую Вы определяете, требует отдельного элемента в таблице клавиш-ускорителей. В каждом элементе, Вы определяете нажатие клавиши (или код символа ASCII или код виртуальной клавиши), который создает клавишу — ускоритель и ее идентификатор. Вы должны также определить, должно ли нажатие клавиши быть использовано в некоторой комбинации с клавишами ALT, SHIFT или CTRL. Для получения дополнительной информации о виртуальных клавишах, см. статью Ввод с клавиатуры.

Нажатие клавиши ASCII определяется или заключением символа ASCII в двойные кавычки или при помощи использования целочисленного значения символа в комбинации с флажком ASCII. Следующие примеры показывают, как определять клавиши — ускорители ASCII.

Нажатие клавиши с виртуальным кодом определяется, по-другому и зависит от того, является ли нажатая клавиша алфавитно-цифровой клавишей или не алфавитно-цифровой. Для алфавитно-цифровой клавиши, символ клавиши или число, заключается в двойные кавычки, объединяется с флажком VIRTKEY. Для не алфавитно-цифровой клавиши, виртуальный Windows код для заданной клавиши объединяется с флажком VIRTKEY. Следующие примеры показывают, как определить клавиши — ускорители с кодом виртуальной клавиши.

Следующий пример показывает ресурс таблицы клавиш-ускорителей, который определяет клавиши — ускорители для операций с файлами. Название ресурса — FileAccel.

Если Вы хотите, чтобы пользователь нажимал клавиши ALT, SHIFT или CTRL в некоторой комбинации с нажатием клавиши — ускорителя, установите флажки ALT, SHIFT и CONTROL в определении клавиши — ускорителя. Ниже следуют — некоторые примеры.

По умолчанию, когда клавиша — ускоритель соответствует пункту меню, Windows подсвечивает пункт меню. Вы можете использовать флажок NOINVERT, чтобы воспрепятствовать подсвечиванию для индивидуальной клавиши — ускорителя. Следующий пример показывает, как использовать флажок NOINVERT.

Чтобы определить клавиши — ускорители, которые соответствуют пунктам меню в вашей прикладной программе, клавиши — ускорители включают в текст пунктов меню. Следующий пример показывает, как включить клавиши — ускорители в текст пункта меню в файле определения ресурса.

Загрузка ресурса таблицы клавиш-ускорителей

Прикладная программа загружает ресурс таблицы клавиш-ускорителей при помощи вызова функции LoadAccelerators и определения дескриптора экземпляра прикладной программы, исполняемый файл которого содержит ресурс и название или идентификатор ресурса. Функция LoadAccelerators загружает заданную таблицу акселераторов в память и возвращает ее дескриптор.

Прикладная программа может загрузить ресурс таблицы клавиш-ускорителей в любое время. Обычно, однопоточная прикладная программа загружает свою таблицу акселераторов перед вводом своего главного цикла сообщений. Прикладная программа, которая использует многопоточность обычно, загружает ресурс таблицы клавиш-ускорителей для потока перед вводом цикла сообщений для этого потока. Прикладная программа или поток могут также использовать многочисленные таблицы клавиш-ускорителей, каждая из которых связана с конкретным окном в прикладной программе. Такая прикладная программа должна загружать таблицу клавиш-ускорителей для окна, каждый раз, когда пользователь активизирует окно. Для получения дополнительной информации о потоках, см. статью Процессы и Потоки.

Вызов функции TranslateAccelerator

Чтобы обрабатывать клавиши — ускорители, цикл сообщения прикладной программы (или потока) должен содержать вызов функции TranslateAccelerator. TranslateAccelerator сравнивает нажатия клавиши с таблицей клавиш-ускорителей и, если она находит соответствие, переводит нажатия клавиш в сообщения WM_COMMAND (или WM_SYSCOMMAND). Затем функция отправляет сообщение оконной процедуре. Параметры функции TranslateAccelerator включают в себя дескриптор окна, которое должно принять сообщения WM_COMMAND, дескриптор таблицы клавиш-ускорителей, использованной трансляции клавиш — ускорителей и указатель на структуру MSG, содержащую сообщение из очереди. Следующий пример показывает, как вызвать TranslateAccelerator изнутри цикла сообщения.

Обработка сообщений WM_COMMAND

Когда используется клавиша — ускоритель, окно, определенное в функции TranslateAccelerator принимает сообщение WM_SYSCOMMAND или WM_COMMAND. Младшее слово параметра wParam содержит идентификатор акселератора. Оконная процедура проверяет идентификатор, чтобы решить, какой источник посылает сообщение WM_COMMAND и соответственно обрабатывает сообщение.

Как правило, если клавиша — ускоритель соответствует пункту меню в прикладной программе, ей и пункту меню назначается один и тот же идентификатор. Если Вам нужно знать, было ли данное сообщение WM_COMMAND создано акселератором или пунктом меню, Вы можете проверить старшее слово параметра wParam. Если сообщение генерировала клавиша — ускоритель, старшее слово равно 1; если сообщение создал пункт меню, старшее слово — 0.

Уничтожение ресурса таблицы клавиш-ускорителей

Windows автоматически уничтожает ресурсы таблиц клавиш-ускорителей, загруженных функцией LoadAccelerators, путем удаления ресурса из памяти после того, как прикладная программа закроется.

Создание клавиш — ускорителей для атрибутов шрифта

Пример в этом разделе показывает, как исполнить следующие задачи:

  1. Создать ресурс таблицы клавиш-ускорителей.
  2. Загрузить таблицу акселераторов во время прогона программы.
  3. Преобразовать клавиши — ускорители в цикле сообщений.
  4. Обработать сообщения WM_COMMAND, сгенерированные акселераторами.

Эти задачи демонстрируются применительно к прикладной программе, которая включает в себя меню Символ (Character) и соответствующие клавиши — ускорители, которые позволяют пользователю выбирать атрибуты текущего шрифта.

Нижеследующая часть файла определения ресурса определяет меню Character и связанную с ним таблицу клавиш-ускорителей.

Обратите внимание!, что пункты меню показывают нажатие клавиши — ускорителя и то, что каждый акселератор имеет тот же самый идентификатор, что и связанный с ним пункт меню.

Следующий раздел исходного файла приложения показывает как реализовать акселератор:

Использование таблицы клавиш-ускорителей, созданной во время прогона программы

Win32 прикладной программный интерфейс (API) позволяет Вам создавать таблицы клавиш-ускорителей во время прогона программы. Шаги, включенные в создание и использование таблицы акселераторов во время прогона программы следующие:

Определение клавиш — ускорителей при помощи заполнения массива структур ACCEL, а затем создание таблицы клавиш-ускорителей, посредством передачи массива в функцию CreateAcceleratorTable.

Активизация таблицы клавиш-ускорителей и обработка сообщений WM_COMMAND, сгенерированных акселераторами.

Уничтожение таблицы клавиш-ускорителей прежде, чем прикладная программа закроется.

Создание таблицы клавиш-ускорителей

Первым шагом в создании таблицы клавиш-ускорителей во время прогона программы является заполнение массива структур ACCEL. Каждая структура в массиве определяет клавишу — ускоритель в таблице. Определение акселераторов включает в себя их флажки, их клавиши и их идентификаторы. Структура ACCEL имеет следующую форму.

Вы определяете нажатие клавиши — ускорителя, при помощи установки кода буквы ASCII или кода виртуальной клавиши в члене key структуры ACCEL. Если Вы определяете код виртуальной клавиши, Вы должны сначала включить флажок FVIRTKEY в члене fVirt; иначе, Windows поймет код как код буквы ASCII. Вы можете включить флажок FCONTROL, FALT или FSHIFT, или все три, чтобы комбинировать с нажатиями клавиш клавиши CTRL, ALT или SHIFT.

Чтобы создать таблицу клавиш-ускорителей, пошлите адрес массива структур ACCEL в функцию CreateAcceleratorTable. CreateAcceleratorTable создает таблицу клавиш-ускорителей и возвращает ее дескриптор.

Обработка клавиш-ускорителей

Процесс загрузки и вызова клавиш — ускорителей, предусмотренных их таблицей, созданной во время прогона программы, аналогичен обработке этих клавиш, предусмотренных ресурсом таблицы клавиш-ускорителей. Для получения дополнительной информации, см. со статьи Загрузка ресурса таблицы клавиш-ускорителей до статьи Обработка сообщения WM_COMMAND.

Разрушение таблицы клавиш-ускорителей

Перед тем, как прикладной программе закрыться, она должна уничтожить таблицы клавиш-ускорителей, созданные во время прогона программы. Вы можете уничтожить таблицу клавиш-ускорителей и удалить ее из памяти, путем посылки дескриптора таблицы в функцию DestroyAcceleratorTable.

Создание доступных для редактирования пользователем клавиш — ускорителей

Этот пример показывает, как создать диалоговое окно, которое позволяет пользователю изменять клавишу — ускоритель, связанную с пунктом меню. Диалоговое окно состоит из комбинированного блока содержащего пункты меню, комбинированного блока, содержащего названия клавиш и окошек для флажка «галочка» для выбора клавиш CTRL, ALT и SHIFT.

Следующий пример показывает, как диалоговое окно определяется в файле определения ресурса.

Диалоговое окно использует массив определяемых программой структур VKEY, каждая из которых содержит текстовую строку о нажатии клавиши и текстовую строку о клавише — ускорителе. Когда диалоговое окно создается, оно анализирует массив и добавляет текстовую строку о каждом нажатии клавиши в комбинированный блок Выбор Нажатия клавиши (Select Keystroke). Когда пользователь щелкает по кнопке Ok, блок диалога ищет текстовую строку о выбранном нажатии клавиши и извлекает данные соответствующие текстовой строке о клавише — ускорителе. Диалоговое окно приобщает текстовую строку о клавише — ускорителе к тексту пункта меню, который выбрал пользователь. Следующий пример показывает массив структур VKEY:

Процедура инициализации диалогового окна заполняет комбинированные блоки Элемент Выбора (Select Item) и Выбор Нажатия клавиши (Select Keystroke). После того, как пользователь выберет пункт меню и связанную клавишу — ускоритель, блок диалога проверяет элементы управления в диалоговом окне, чтобы получить пользовательский выбор, модифицирует текст пункта меню, а затем создает новую таблицу клавиш-ускорителей , которая содержит определенную пользователем новую клавишу — ускоритель. Следующий пример показывает эту процедуру диалогового окна.

Справочник по ускорителям клавиатуры

Следующие функции, структуры и сообщения связаны с ускорителями клавиатуры.

Функции ускорителей клавиатуры

Следующие функции, используются с клавишами — ускорителями.

  • CopyAcceleratorTable
  • CreateAcceleratorTable
  • DestroyAcceleratorTable
  • LoadAccelerators
  • TranslateAccelerator

Фунция CopyAcceleratorTable

Функция CopyAcceleratorTable копирует заданную таблицу клавиш-ускорителей. Эта функция используется, чтобы получить данные таблицы клавиш-ускорителей, которые соответствует дескриптору этой таблицы, или определить размер данных этой таблицы.

Синтаксис

Параметры

Возвращаемые значения

Смотри также

Размещение и совместимость CopyAcceleratorTable

Функция CreateAcceleratorTable

Функция CreateAcceleratorTable создает таблицу клавиш-ускорителей.

Синтаксис

Параметры

Возвращаемые значения

Замечания

Смотри также

Размещение и совместимость CreateAcceleratorTable

Функция DestroyAcceleratorTable

Функция DestroyAcceleratorTable уничтожает таблицу клавиш-ускорителей. Прежде, чем прикладная программа закроется, она должно использовать эту функцию, чтобы уничтожить каждую таблицу клавиш-ускорителей, которые созданы при помощи использования функции CreateAcceleratorTable.

Синтаксис

Параметры

Возвращаемые значения

Смотри также

Размещение и совместимость DestroyAcceleratorTable

Функция LoadAccelerators

Функция LoadAccelerators загружает заданную таблицу клавиш-ускорителей.

Синтаксис

Параметры

hInstance
Идентифицирует экземпляр модуля, чей исполняемый файл содержит таблицу клавиш-ускорителей для загрузки.

lpTableName
Указывает на строку с символом нуля в конце, которая именует таблицу клавиш-ускорителей для загрузки. Альтернативно, этот параметр может определять, что идентификатор ресурса таблицы клавиш-ускорителей в младшем слове и нуль в старшем слове. Может быть использована макрокоманда MAKEINTRESOURCE, чтобы создать это значение.

Возвращаемые значения

Замечания

Смотри также

Размещение и совместимость LoadAccelerators

Функция TranslateAccelerator

Функция TranslateAccelerator обрабатывает клавиши — ускорители для команд меню. Функция транслирует сообщение WM_KEYDOWN или WM_SYSKEYDOWN в сообщение WM_COMMAND или WM_SYSCOMMAND (если имеется элемент для клавиши в заданной таблице клавиш-ускорителей), а затем передает сообщение WM_COMMAND или WM_SYSCOMMAND непосредственно соответствующей оконной процедуре. TranslateAccelerator не возвращает значения до тех пор, пока оконная процедура не обработает сообщение.

Синтаксис

Параметры

Возвращаемые значения

Замечания

Чтобы отличить сообщение, которые эта функция посылает, от сообщений, отправленных меню или элементами управления, старшее слово параметра wParam сообщения WM_COMMAND или WM_SYSCOMMAND, содержит значение 1.

Комбинации клавиш — ускорителей, используемые для выбра пунктов из меню окна, транслируются в сообщение WM_SYSCOMMAND; все другие комбинации клавиш — ускорителей транслируются в сообщения WM_COMMAND.

Когда TranslateAccelerator возвращает значение отличное от нуля, а сообщение оттранслировано, прикладная программа не должна использовать функцию TranslateMessage для того, чтобы обработать сообщение снова.

Клавише — ускорителю не обязательно надо соответствовать команде меню.

Если команда клавиши — ускорителя соответствует пункту меню, прикладная программа посылает сообщения WM_INITMENU и WM_INITMENUPOPUP, как будто пользователь попытался показать меню. Однако, эти сообщения не посылаются, если встречается какое-либо из следующих условий:

  • Окно заблокировано.
  • Пункт меню заблокирован.
  • Комбинация клавиши — ускорителя не соответствует элементу в меню окна и окно свернуто.

Фактически был произведен захват мыши. За информацией о захвате мыши, обратитесь в функцию SetCapture.

Если определяемое окно — активное окно, и никакое другое окно не имеет фокус клавиатуры (это обычно является случаем, если окно свернуто), TranslateAccelerator транслирует сообщения WM_SYSKEYUP и WM_SYSKEYDOWN вместо сообщений WM_KEYDOWN и WM_KEYUP.

Если происходит нажатие клавиши — ускорителя, которое соответствует пункту меню, когда окно, которое владеет меню, свернуто, TranslateAccelerator не отправляет сообщение WM_COMMAND. Однако, если происходит нажатие клавиши — ускорителя, которое не соответствует никакому из пунктов меню или меню окна, функция отправляет сообщение WM_COMMAND, даже если окно свернуто.

Смотри также

Размещение и совместимость TranslateAccelerator

Структуры ускорителя клавиатуры

Ниже следующая структура используется с клавишами — ускорителями.
ACCEL

Структура ACCEL

Структура ACCEL определяет клавишу — ускоритель, использованную в таблице клавиш-ускорителей.

Синтаксис

Члены структуры
fVirt
Устанавливает флажки клавиши — ускорителя. Этот член может быть комбинацией следующих значений:

  • FALT — Клавиша ALT должна удерживаться нажатой, когда нажимается клавиша — ускоритель.
  • FCONTROL — Клавиша CTRL должна удерживаться нажатой, когда нажимается клавиша — ускоритель.
  • FNOINVERT — Определяет, что никакой другой пункт меню верхнего уровня не выделяется, когда используется клавиша — ускоритель. Если этот флажок не установлен, пункт меню верхнего уровня будет выделен, если возможно, когда используется акселератор.
  • FSHIFT — Клавиша SHIFT должна удерживаться нажатой, когда нажимается клавиша — ускоритель.
  • FVIRTKEY — Член структуры key определяет код виртуальной клавиши. Если этот флажок не установлен, key воспринимает его, как определение кода буквы ASCII.

key
Определяет клавишу — ускоритель. Этот член может быть или код виртуальной клавиши или код буквы ASCII.
cmd
Определяет идентификатор клавиши — ускорителя. Это значение помещается в младшем слове параметра wParam сообщения WM_COMMAND или WM_SYSCOMMAND, когда нажимается клавиша — ускоритель.

Смотри также

Размещение и совместимость ACCEL

Сообщения ускорителей клавиатуры

Нижеследующие сообщения, используются с клавишами — ускорителями.
WM_COMMAND
WM_INITMENU
WM_INITMENUPOPUP
WM_MENUCHAR
WM_MENUSELECT
WM_SYSCHAR
WM_SYSCOMMAND

Сообщение WM_COMMAND

Сообщение WM_COMMAND отправляется тогда, когда пользователь выбирает командный элемент из меню, когда орган управления отправляет уведомительное сообщение в свое родительское окно, или когда транслируется нажатие клавиши — ускорителя.

Синтаксис

Параметры

Возвращаемые значения

Замечание
Нажатия клавиш — ускорителей, которые выбирают пункты меню окна, транслируются в сообщения WM_SYSCOMMAND.
Если происходит нажатие клавиши — ускорителя, которое соответствует пункту меню, когда окно, которое владеет меню, свернуто, сообщение WM_COMMAND не отправляется. Однако, если происходит нажатие клавиши — ускорителя, которое не соответствует какому-либо из пунктов меню или меню окна, сообщение WM_COMMAND отправляется, даже если окно свернуто.
Если прикладная программа включает разделитель меню, система отправляет сообщение WM_COMMAND с младшим словом параметра wParam установленным в нуль, когда пользователь выбирает разделитель.

Смотри также

Размещение и совместимость WM_COMMAND

Сообщение WM_INITMENU

Сообщение WM_INITMENU оправляется тогда, когда меню собирается стать активным. Это происходит тогда, когда пользователь щелкает по элементу на полосе меню или нажимает клавишу меню. Это позволяет прикладной программе модифицировать меню до того, как оно будет отображено на экране.

Синтаксис

Параметры

Возвращаемые значения

Замечания

Смотри также

Размещение и совместимость WM_INITMENU

Сообщение WM_INITMENUPOPUP

Сообщение WM_INITMENUPOPUP отправляется тогда, когда выскакивающее меню или подменю собирается стать активным. Это позволяет прикладной программе модифицировать меню перед его показом на экране без изменения меню полностью.

Синтаксис

Параметры

Возвращаемые значения

Смотри также

Размещение и совместимость WM_INITMENUPOPUP

Сообщение WM_MENUCHAR

Сообщение WM_MENUCHAR отправляется тогда, когда меню активизируется, а пользователь, нажимает клавишу, которая не соответствует какому-либо символу или клавише — ускорителю. Это сообщение отправляется окну, которое владеет меню.

Синтаксис

Параметры

  • MF_POPUP — Выскакивающее меню, подменю или контекстное меню
  • MF_SYSMENU — Меню окна (системное меню (System Menu) или меню Управления (Control menu)

hmenu
Значение lParam. Идентифицирует активное меню.

Возвращаемые значения

Замечания

Размещение и совместимость WM_MENUCHAR

Сообщение WM_MENUSELECT

Сообщение WM_MENUSELECT отправляется окну владельца меню, когда пользователь выбирает пункт меню.

Синтаксис

Параметры

hmenu
Значение lParam. Идентифицирует меню, по которому щелкнули мышью.

Возвращаемые значения

Замечания

Смотри также

Размещение и совместимость WM_MENUSELECT

Сообщение WM_SYSCHAR

Сообщение WM_SYSCHAR посылается окну с фокусом клавиатуры, когда транслируется сообщение WM_SYSKEYDOWN функцией TranslateMessage. Оно определяет код символа системы буквенных клавиш — то есть символ клавиши, которая была нажата, в то время, когда была нажата клавиша ALT.

Синтаксис

Параметры

Возвращаемые значения

Замечания

Когда контекстный код нулевой, сообщение может быть передано в функцию TranslateAccelerator, которая обработает его, как если бы это было стандартное клавишное сообщение вместо системного сообщения символьной клавиши. Это позволяет клавишам — ускорителям быть использованными активным окном, даже если активное окно не имеет фокуса клавиатуры.

Для усовершенствованных 101- и 102-клавишных клавиатур, дополнительными клавишами являются клавиши ALT и CTRL справа на главном разделе клавиатуры; INS, DEL, HOME, END, PAGE UP, PAGE DOWN и клавиши курсора в группах слева от цифровой клавиатуры; клавиша PRINT SCRN; клавиша BREAK; клавиша NUMLOCK; а также клавиши делитель (/) и ENTER в цифровой клавиатуре. Другие клавиатуры могут поддерживать бит дополнительных клавиш в параметре lKeyData.

Смотри также

Размещение и совместимость WM_SYSCHAR

Сообщение WM_SYSCOMMAND

Окно получает это сообщение, когда пользователь выбирает команду из меню окна (известное также как Системное меню или Меню управления) или когда пользователь выбирает кнопку Развернуть (Maximize) или кнопку Свернуть (Minimize).

Синтаксис

Параметры

xPos
Определяет горизонтальную позицию курсора, в экранной системе координат, если команда меню окна выбрана при помощи мыши. Иначе, xPos параметр не используется.
yPos
Определяет вертикальную позицию курсора, в экранной системе координат, если команда меню окна выбрана при помощи мыши. Этот параметр является – (минус) 1, если команда выбрана, с использованием клавиши — ускорителя системы, или нуль, если использовалась мнемоника.

Возвращаемые значения

Замечания

Функция DefWindowProc завершает запрос меню окна о предопределенных действиях, перечисленных в предыдущей таблице.
В сообщениях WM_SYSCOMMAND, четыре младших бита параметра uCmdType используются для внутренних потребностей Windows. Чтобы получить правильный результат при проверке значения uCmdType, прикладная программа должна объединить значение 0xFFF0 со значением uCmdType при помощи использования побитового оператора AND.

Пункты в меню окна могут быть изменены при помощи использования функций GetSystemMenu, AppendMenu, InsertMenu, ModifyMenu, InsertMenuItem и SetMenuItem. Прикладные программы, которые изменяют меню окна, должны обрабатывать сообщения WM_SYSCOMMAND.

Прикладная программа может выполнить любую команду системы в любое время, передавая сообщение WM_SYSCOMMAND в DefWindowProc. Любые сообщения WM_SYSCOMMAND, не обработанные программой должны быть переданы в DefWindowProc. Любые значения команд, добавленные приложением, должны быть обработаны прикладной программой и не могут быть переданы в DefWindowProc.
Клавиши-ускорители, которые определены для выбора пунктов из меню окна, транслируются в сообщения WM_SYSCOMMAND; все другие нажатия клавиш — ускорителей транслируются в сообщения WM_COMMAND.

Смотри также

Размещение и совместимость WM_SYSCOMMAND

TranslateAccelerator Возвращаемое значение

Петля сообщение, генерируемое мастер класса часто выглядит какTranslateAccelerator Возвращаемое значение

В то время как TranslateAccelerator документация говорит:
Если функция завершается успешно, возвращаемое значение равно нулю.
Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

В моих тестах, когда единственная причина, по которой Ошибка TranslateAccelerator не была обнаружена, для этого конкретного сообщения не найдено ускорителя, GetLastError возвращается 0 == ERROR_SUCCESS.

Мне просто интересно, есть ли какие-либо реальные условия, когда TranslateAccelerator терпит неудачу из-за какой-то другой причине, и сообщение должно не быть переведены & посланы?

ответ

Да. Сообщение может проходить через некоторый другой API фильтрации сообщений, такой как IsDialogMessage() .

Поскольку IsDialogMessage функция выполняет все необходимые перевод и диспетчеризацию сообщений, сообщение обрабатывается IsDialogMessage не должен быть передан в TranslateMessage или DispatchMessage функции.

Каковы бы ни были причины, по которым TranslateMessage может потерпеть неудачу . ну его вовсе не подразумевается (и, конечно, явно не указано), что сообщение не должно доставляться в DispatchMessage.

Настоящая проблема с предоставленным примером кода заключается в том, что в дополнение к 0 GetMessage может возвращать код ошибки -1. -1 означает, что вы не должны обрабатывать сообщение (поскольку нет сообщения — структура MSG, скорее всего, либо оставлена ​​неинициализированной, либо, возможно, имеет данные предыдущего сообщения). Если вы не можете что-то сделать, чтобы «исправить» неисправное условие, если GetMessage возвращает -1, как только он, вероятно, вернет -1 на последующие вызовы — правильная стратегия (вероятная) — выйти из цикла сообщений.

Кроме того, неинициализированная структура MSG, несомненно, могла бы стать возможной причиной для ошибки TranslateMessage и/или DispatchMessage.

Что такое код translateaccelerator

предыдущую страницу ? Вместо TWebBrowser»а использую TEmbeddedWB.
Причём нажатия клавиш на браузере не отлавливаютя в TForm при включённом KeyPreview. И как отловить нажатие этой клавиши вообще непонятно.

function TDMCChildForm.WebBrowserTranslateAccelerator(const lpMsg: PMsg;
const pguidCmdGroup: PGUID; const nCmdID: Cardinal): HRESULT;
type
PWMKey = ^TWMKey;
begin
if lpMsg.message = WM_KEYDOWN then
begin
if MainForm.ActionList.IsShortCut(PWMKey(LongInt(lpMsg) + sizeof(HWND))^) then
begin
Result := S_OK;
Exit;
end;
end;
Result := S_FALSE;
end;


> nikkie © (12.07.04 02:06) [1]

Кнопку бэкспэйс этот код не отслеживает. Некоторые кнопки отслеживае, а именно эту нет. :) Вот что делать ? Как сам Интернет Эксплорер определяет нажатие на неё ?

Алекс А (15.07.04 1:37) [2]
Кнопку бэкспэйс этот код не отслеживает. Некоторые кнопки отслеживае, а именно эту нет

тем не менее, данные разведки показывают, что все отслеживается нормально.

Более того, если не обработать данное событие и не вернуть s_ok, то браузер автоматически по backspace возвращается на предыдущую страницу (если она есть).

В общем, код в студию.


> Piter © (15.07.04 02:47) [3]
> тем не менее, данные разведки показывают, что все отслеживается
> нормально.
>
> Более того, если не обработать данное событие и не вернуть
> s_ok, то браузер автоматически по backspace возвращается
> на предыдущую страницу (если она есть).

Ничего не возвращает. Ни с этим кодом, ни без этого кода, никак. По Альт и стрелкам — переходит. А по бэкспэйс — нет.


> В общем, код в студию.

Какой код ?
Код Интернет Эксплорера в Майкрософт.
Код embeddedwb на www.euromind.com/iedelphi

Алекс А (15.07.04 4:58) [4]

ТВОЙ блин код обработки TranslateAccelerator

именно BkSpace не передается браузером в TranslateAccelerator. можешь ловить его в Application.OnMessage.

ЗЫ это все опера дурацкие интерфейсные идеи навевает.
имхо совсем неочевидно, что BkSpace должен работать как «назад».
и уж тем более не очевидно, что Shift+BkSpace должно работать как «вперед».
Alt+влево/вправо логичнее гораздо выглядит.
а между прочим, надо еще проверять, где фокус находится — если в текстовом поле, то BkSpace должен стандартно работать.


> Piter © (15.07.04 14:19) [5]
> Алекс А (15.07.04 4:58) [4]
>
> ТВОЙ блин код обработки TranslateAccelerator

См. второй постинг в ветке.


> nikkie © (15.07.04 16:50) [6]
> Alt+влево/вправо логичнее гораздо выглядит.

Только требует двух рук.


> это все опера дурацкие интерфейсные идеи навевает.

Нет. Виноваты во всём Майкрософт, своим кривым и глючным браузером. Одни клавиши в одном месте обрабатываются, другие в другом, третьи в третьем. Чтоб извлечь картинки надо сорок тегов обработать. Уж сколько лет браузеру, не могут все дыры залатать. Козлы.

nikkie © (15.07.04 16:50) [6]
это все опера дурацкие интерфейсные идеи навевает.

ОПЕРА?! Она-то здесь при чем? Backspace — это было назад, по моему, в IE 3.x Об Опере еще никто не знал!


именно BkSpace не передается браузером в TranslateAccelerator

а у меня передается. может, ты просто фокус не установил на браузере? Ведь у браузера генерируется TranslateAccelerator только когда фокус на нем.


См. второй постинг в ветке

что, прямо такой же код и у тебя? :)
Интересно. Насколько понимаю, это вырезка из DMClient, очень интересно. У тебя тоже главная форма MainForm? :)
И на ней лежит ActionList? :)

Илон Маск рекомендует:  Sbrk увеличить сегмент данных
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Return code Description
S_FALSE
E_INVALIDARG
E_UNEXPECTED Winuser.h (include Windows.h)