Что такое код translatemessage


Что такое код translatemessage

А можно ли обойтись без сабжа в главном цикле, если я не использую в программе ввода с клавиатуры?

Ежели у тебя в дополнительных потоках нет окошек — отчего бы и не отказаться?

вы бы привели код, что ли?.

что-такое главный цикл?
фиг знает, что вы имеете в виду под этим.

>>Суслик © (21.07.04 10:18) [2]

Подозреваю, что под ГЛАВНЫМ циклом подразумевается цикл выборки сообщений :)


> VMcL © (21.07.04 10:30) [3]

да это понятно
«главный» — наводит на мысль, что это про application.run.
тогда вообще ерунда какая-то

>>Суслик © (21.07.04 10:32) [4]

Почему Application.Run? Обычный цикл через GetMessage() и/или PeekMessage().


> VMcL © (21.07.04 11:39) [5]

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

В общем вопрос требует уточнения имхо

While GetMessage (messag, 0, 0, 0) do
begin
TranslateMessage (messag); //. Нужно ли
DispatchMessage (messag);
end;

в принципе да. Только зачем? Лудше озаботьсчя оптимизацией своих оконных процедур — эффективней будет..

Я так понял, что не надо изобретать велосипед, а идти протоптанной дорожкой. Но с другой стороны — а вдруг?

311 — PreTranslateMessage в MFC (CWinApp) / MFC шаг за шагом / Visual C++

Шаг 311 — PreTranslateMessage в MFC (CWinApp)

Куда попадают все сообщения ввода в программе на MFC? В класс CWinApp. Именно в нем в функции Run( ) есть обработка ввода.

Запускается петля обработки сообщений с помощью функций TranslateMessage() и DispatchMessage(). Так же во время простоя CWinApp вызывает функцию OnIdle(). Но перед тем как вызвать TranslateMessage() класс CWinApp вызывает PreTranslateMessage() для того, чтобы Вы сами могли добавить код. Общая схема обработки в MFC такая:

Функция PreTranslateMessage() виртуальная, то есть ее можно перегрузить:

Вот так например, вызвав Add Virtual Function:

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

TranslateMessage function

Translates virtual-key messages into character messages. The character messages are posted to the calling thread’s message queue, to be read the next time the thread calls the GetMessage or PeekMessage function.

Syntax

Parameters

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

Return Value

Type: Type: BOOL

If the message is translated (that is, a character message is posted to the thread’s message queue), the return value is nonzero.

Илон Маск рекомендует:  Функции баз данных sesam

If the message is WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP, the return value is nonzero, regardless of the translation.

If the message is not translated (that is, a character message is not posted to the thread’s message queue), the return value is zero.

Remarks

The TranslateMessage function does not modify the message pointed to by the lpMsg parameter.

WM_KEYDOWN and WM_KEYUP combinations produce a WM_CHAR or WM_DEADCHAR message. WM_SYSKEYDOWN and WM_SYSKEYUP combinations produce a WM_SYSCHAR or WM_SYSDEADCHAR message.

TranslateMessage produces WM_CHAR messages only for keys that are mapped to ASCII characters by the keyboard driver.


If applications process virtual-key messages for some other purpose, they should not call TranslateMessage. For instance, an application should not call TranslateMessage if the TranslateAccelerator function returns a nonzero value. Note that the application is responsible for retrieving and dispatching input messages to the dialog box. Most applications use the main message loop for this. However, to permit the user to move to and to select controls by using the keyboard, the application must call IsDialogMessage. For more information, see Dialog Box Keyboard Interface.

c# — Вызовите TranslateMessage из.NET в IMessageFilter

Я создаю игру в XNA и хочу реализовать правильную обработку ввода, которой XNA не хватает до смешного уровня. У меня есть класс, который реализует IMessageFilter для перехвата оконных сообщений и передачи их вместе с TranslateMessage поскольку обычный насос сообщений (но не XNA, конечно).

Часть, где я застрял/не знаю, как перейти от System.Windows.Forms.Message который IMessageFilter.PreFilterMessage(ref Message) предоставляет, struct tagMSG <. >который использует Windows API.

Теперь я могу использовать P/Invoke как таковой:

Но дело в том, что Message не содержит определения для time или POINT как требуется для Windows Message.

Мои вопросы заключаются в следующем:

  1. Могу ли я заполнить 0 для time , pointX и pointY и работать с TranslateMessage?
  2. Я видел другой код, который использует Marshal.StructureToPtr для копирования структуры Message и передачи этого непосредственно в TranslateMessage . Message содержит скрытые поля в правильном порядке размещения? Поскольку MSDN и Object Browser дают мне только свойства, и из них я должен заключить, что ему не хватает time и POINT и что порядок неправильный.

Итак, каков наилучший способ передать сообщение TranslateMessage чтобы он мог создать для меня столь необходимый WM_CHAR ?

    2 1
  • 28 июн 2020 2020-06-28 22:10:55
  • MicroVirus

1 ответ

Я решил проверить вопрос 2, написав простую программу, и это результаты:

В Win32 struct MSG составляет 28 байт, а Message — 20 байт. Message добавляет поле result , который является IntPtr , но не хватает time и POINT полей.

Используя либо struct MSG либо Message с Marshal.StructureToPtr + обнуление остальных 8 байтов дает одинаковые результаты. Оба имеют одинаковые hwnd , message , wparam и lparam а для остальных свойств — 0.

Вывод состоит в том, что в Message действительно содержатся первые несколько членов в правильном порядке, но поскольку он слишком мал, небезопасно напрямую использовать его. Однако отсутствие сбоя тестовой программы, использующей наивную реализацию, кажется, говорит о том, что TranslateMessage не рассматривает недостающие поля, но это предположение.

Илон Маск рекомендует:  Как написать add in или большие мучения с маленькой программой

Что касается вопроса 1, кажется, что он работает без проблем: TranslateMessage генерирует правильные сообщения WM_CHAR . Я предполагаю, что пока приложение не использует поля time или POINT оно должно работать.

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

Описание:
function TranslateMessage(var Msg: TMsg): Bool;

Пеpеводит комбинации wm_KeyDown/Up в wm_Char или wm_DeadChar и комбинации
wm_SysKeyDown/Up в wm_SysChar или wm_SysDeadChar и напpавляет символьное
сообщение в очеpедь
пpикладной задачи.

Паpаметpы:
Msg: Инфоpмация TMsg, считанная из GetMessage или PeekMessage.

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

TranslateMessage

Описание

function TranslateMessage(var Msg: TMsg): Bool;

Пеpеводит комбинации wm_KeyDown/Up в wm_Char или wm_DeadChar и комбинации wm_SysKeyDown/Up в wm_SysChar или wm_SysDeadChar и напpавляет символьное сообщение в очеpедь пpикладной задачи.

Паpаметpы

  • Msg: Инфоpмация TMsg, считанная из GetMessage или PeekMessage.

Возвpащаемое значение


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

Вызов TranslateMessage из .NET в IMessageFilter

Я создаю игру в XNA , и я ищу для осуществления правильного ввода-обработки, который XNA испытывает недостаток в смешную степень. У меня есть класс , который реализует IMessageFilter для перехвата сообщений окна и передавать их TranslateMessage как обычный насос сообщений будет (но не XNA, конечно).

Часть , где я застрял / неуверены в том , как идти от , System.Windows.Forms.Message что IMessageFilter.PreFilterMessage(ref Message) дает, в struct tagMSG <. >том , что Windows API использует.

Теперь я могу использовать P / Invoke, как, например:

Но дело в том , что Message не содержит определение для любой time или по POINT мере необходимости для сообщения Windows.

Мои вопросы заключаются в следующем:

  1. Могу ли я заполнить 0 для time , pointX и pointY и имеют TranslateMessage все еще работает должным образом?
  2. Я видел другой код , который использует , Marshal.StructureToPtr чтобы скопировать Message структуру и передать непосредственно TranslateMessage . Есть ли Message содержать скрытые поля в правильном порядке макета? Поскольку MSDN и обозреватель объектов только дать мне свойства, и из тех , которые я должен сделать вывод , что он отсутствует , time и POINT и что порядок является неправильным.

Итак, что это лучший способ , чтобы передать сообщение , TranslateMessage чтобы он мог создать те хотелось WM_CHAR «s для меня?

Я решил проверить вопрос 2, написав простую программу, и эти результаты:

В Win32 struct MSG составляет 28 байт и Message 20 байт. Message добавляет поле , result которое является IntPtr , но не хватает time и POINT полей.

Использование любого struct MSG или Message с Marshal.StructureToPtr + обнуления оставшиеся 8 байт дает те же результаты. Оба имеют одинаковые hwnd , message , wparam и lparam и как для остальных свойств равны 0.

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

Что касается вопроса 1, она , кажется, работает без проблем: TranslateMessage генерирует правильные WM_CHAR сообщения. Я предполагаю , что до тех пор , пока приложение не использует time или POINT поля , он должен работать.

Илон Маск рекомендует:  Интерпретация строковых выражений как функций

Why are “TranslateMessage” and “DispatchMessage” separate calls?

Most of the Win32 main loops I’ve seen are all structured like:

It was pointed out to me that MsgWaitForMultipleObjects may be used to add some variety to a main loop. But is there a scenario where doing something between GetMessage , TranslateMessage and DispatchMessage is actually useful?

4 Answers 4

The more traditional message loop looks like this:

It is a pretty big hint to what you’d want to do before dispatching the message: catch messages that ought to be intercepted and treated specially before the window sees them. Keyboard shortcuts are a classic example, they need to be detected no matter what window has the focus.

Any GUI class library exposes it with a virtual method named something like App.PreProcessMessage, a virtual function that can be overridden so your program can implement its own shortcuts and whatnot.

They are different beasts.

Translates virtual-key messages into character messages. The character messages are posted to the calling thread’s message queue, to be read the next time the thread calls the GetMessage or PeekMessage function. [. ] The TranslateMessage function does not modify the message pointed to by the lpMsg parameter.

DispatchMessage, on the other hand, dispatches a message to a window procedure.

So DispatchMessage does the actual work of processing the message. TranslateMessage MAY or MAY NOT post a new message to the thread queue. If the message is translated then a character message is posted to the thread’s message queue.

The TranslateMessage function does not modify the message pointed to by the lpMsg parameter.

They are separate calls so you, the programmer, can have a chance to avoid the message translation provided by TranslateMessage .

TranslateMessage

Описание: function TranslateMessage(var Msg: TMsg): Bool;

Пеpеводит комбинации wm_KeyDown/Up в wm_Char или wm_DeadChar и комбинации wm_SysKeyDown/Up в wm_SysChar или wm_SysDeadChar и напpавляет символьное сообщение в очеpедь пpикладной задачи.

Паpаметpы:

Msg: Инфоpмация TMsg, считанная из GetMessage или PeekMessage.

Возвpащаемое значение:

Не нуль в случае выполнения пеpевода; 0 — в пpотивном случае. функция находится в файле user32.dll

TranslateMessage()

Written on 11 Февраля 2007 .

Эта функция переводит сообщения формата виртуальных клавиш в сообщения символы.

lpMsg — это структура полученная в результате вызова функций GetMessage() или PeekMessage(). Функция вернет значение отличное от нуля в случае, если перевод произведен. Если сообщение типа WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, или WM_SYSKEYUP, то возвращаемое значение всегда отличное от нуля. Эта функция не изменяет структуру MSG, а добавляет новые сообщения. Вот так:

То есть эта функция на первом этапе производит обработку сообщений и создает сообщения более крупные по группе. Нам уже можно не анализировать, что нажата и отпущена клавиша, а просто можно обрабатывать сообщение «введена буква». Каждый процесс должен использовать эту функцию для обработки сообщений. Пример типичного использования:

Этот пример хоть и классический, но уже устаревший. Новая интерпретация его такая:

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL