Что такое код swapmousebutton

Что такое код swapmousebutton

Мы написали код для обработчика события MouseMove. Это событие возникает, как только курсор мыши достигает границ кнопки. В этом случае сразу же вычисляется местоположение другой кнопки, и курсор мыши автоматически перемещается в нужное место. Еще раз обратите внимание, что для вычисления координат кнопки мы используем метод PointToScreen, который конвертирует координаты из клиентской системы координат в экранную систему координат. Данный пример носит немного шутливый характер, но на самом деле этот пример можно использовать не только в качестве шутки. Иногда требуется автоматически перенаправить курсор мыши в нужное место. Давайте напишем универсальную процедуру, представленную в листинге 8.6.

Листинг 6.6. Универсальная процедура перемещения мыши

public void JumpToControl(Control ctrl) <

Перемещаем курсор мыши в нижнюю часть середины элемента

Point objPoint = Ctrl.PointToScreen(new Point(0, 0));

objPoint.X += Ctrl.Width / 2;

objPoint.Y += (Ctrl.Height / 4) * 3;

private void butYes Click(object sender, EventArgs e) <

Как видите, мы поместили созданную процедуру в событие click кнопки с надписью Да и указали элемент, на который должен переместиться указатель мыши. В нашем случае я разместил на форме для демонстрации примера элемент LinkLabel С именем inksite. Обратите внимание, что в нашей универсальной процедуре используется перемещение не в середину элемента управления, а на три четверти его высоты для большей изящности.

Point myPoint = butYes.PointToScreen(new Point(0, 0)); myPoint.X += butYes.W >

Меняем кнопки мыши местами

у вашей мыши имеются, как минимум, две кнопки. Если вы правша, то основная кнопка у вас левая, а правая кнопка служит для вызова контекстного меню. Но у левшей своя точка зрения на эти кнопки, и основная кнопка у них правая. Чтобы поменять настройки для кнопок мыши, пользователь должен зайти в Панель управления и в апплете Мышь установить желаемые настройки. Но вы можете программно изменить эти настройки (листинг 8.7) через вызов функции Windows API swapMouseButton.

[ Листин/8.7. Замена tcHonoK мы

[Dlllmport( user32.dll , EntryPoint = SwapMouseButton )] internal extern static int SwapMouseButton(int bSwap);

private void butSwapMouse Click(object sender, EventArgs e) <

Меняем кнопки мыши местами SwapMouseButton(1);

private void butRestoreMouse Click(object sender, EventArgs e) <

Восстанавливаем настройки мыши SwapMouseButton(0);

Чтобы убедиться, что кнопки мыши действительно поменялись, я расположил на форме текстовое поле, у которого по умолчанию имеется контекстное меню. Запустите проект и нажмите на кнопку с надписью Поменять местами. Теперь щелкните правой кнопкой на текстовом поле. Ничего не происходит? Так ведь правая кнопка теперь работает у вас как левая. Теперь щелкните на текстовом поле левой кнопкой — у вас появится контекстное меню. Замена кнопок местами носит глобальный характер и действует на все при-

Пример работы с указателями мыши вы найдете в папке TwoButtons на прилагаемом к книге компакт-диске.

Как узнать координаты мыши?

Обратите внимание, что в .NET Framework 2.0 кроме событий click и

Doubleclick ПОЯВИЛИСЬ НОВЫе события MouseClick И MouseDoubleClick, которые В отличие от старых событий позволяют получить координаты мыши в момент щелчка. Как их использовать, показано в листинге 8.8.

Листинг 8.8. Получение координат мыши в момент щелчка

private void Forml MouseClick(object sender, MouseEventArgs e) <

Вьшодим координаты мыши в заголовке формы this.Text = MouseClick: + е.Button.ToString() + + е.Location.ToStringО;

private void Forml MouseDoubleClick(object sender, MouseEventArgs e) <

Выводим координаты мыши в заголовке формы this.Text = MouseDoubleClick: + е.Button.ToString() + + е.Location.ToStringО;

Пример, в котором мы получаем координаты мыши, находится в папке MouseClick на прилагаемом диске.

Как преобразовать экранные координаты

в клиентские (для данного элемента) и наоборот?

Для преобразования координат точки используйте методы Control.PointToCiient (преобразовывает экранные координаты в клиент-

ложения. Если хотите вернуть старые настройки, то нажмите на кнопку Восстановить (догадайтесь, какой кнопкой надо сделать щелчок).

Пример замены кнопок мыши находится в папке AdvancedMouse на прилагаемом диске.

MQL4: Управление компьютером из советника

Иногда бывает необходимо программно нажать кнопку в стороннем приложении, считать текст с определенного компонента, запустить другой терминал, любую другую программу, открыть текстовый файл, выключить компьютер в определенное время, произвести еще какие-либо операции. Здесь нам поможет функция WinAPI — ShellExecute, которая находится в библиотеке shell32.dll и библиотека WinUser32.mqh. Как можно автоматизировать весь этот процесс — узнаем из нашего нового урока по программированию форекс роботов. Тема необычная, сильно расширит ваши навыки как программиста.

Более подробную информацию о функции ShellExecute вы можете получить в справке MSDN. Там же можно получить подробную информацию обо всех функциях, доступных из библиотеки WinUser32.mqh. Я же приведу краткое описание каждой из них:

  • ShellExecute — выполняет операцию с указанным файлом;
  • SendMessage — Отправляет указанное сообщение окну или окнам, ожидает ответа;
  • SendNotifyMessage – то же самое, но не ждет ответа;
  • PostMessage – помещает сообщение в поток, не дожидаясь ответа;
  • keybd_event – синтезирует нажатие заданной клавиши на клавиатуре;
  • mouse_event — синтезирует движение мыши и нажатия кнопок;
  • FindWindow — извлекает дескриптор окна верхнего уровня;
  • SetWindowText – помещает текст в название окна;
  • GetWindowText – считывает текст из названия окна;
  • GetWindowTextLength – считывает количество символов в названии окна;
  • GetWindow — извлекает дескриптор окна, которое имеет отношение к указанному окну;
  • GetParent — извлекает дескриптор указанного или родительского окна;
  • UpdateWindow – обновляет окно программы;
  • EnableWindow — включает или отключает ввод с клавиатуры и мыши в указанное окно или элемент управления;
  • DestroyWindow — деактивирует окно или убирает с него фокус клавиатуры;
  • ShowWindow — устанавливает состояние показа указанного окна;
  • SetActiveWindow — активирует окно;
  • AnimateWindow — позволяет создавать специальные эффекты при отображении или скрытии окон;
  • FlashWindow – заставляет мигнуть указанное окно один раз;
  • CloseWindow — минимизирует (но не закрывает) указанное окно;
  • MoveWindow — изменяет положение и размеры указанного окна;
  • SetWindowPos — изменяет размер и положение дочернего, всплывающего окна или окна верхнего уровня;
  • IsWindowVisible — определяет состояние видимости указанного окна;
  • IsIconic — определяет, является ли указанное окно свернутым;
  • IsZoomed — определяет, развернуто ли окно;
  • SetFocus — устанавливает фокус клавиатуры на указанное окно;
  • GetFocus — извлекает дескриптор окна, которое имеет фокус клавиатуры;
  • GetActiveWindow — получает дескриптор активного окна;
  • IsWindowEnabled — определяет, включено ли указанное окно для ввода с клавиатуры и мыши;
  • MessageBox — отображает модальное диалоговое окно, которое содержит системный значок, набор кнопок и краткое сообщение для конкретного приложения, такое, как информация о состоянии или об ошибке;
  • MessageBeep — воспроизводит звук с помощью системного динамика;
  • GetSystemMetrics — извлекает указанную метрику системы или параметр конфигурации системы;
  • ExitWindows — выход из системы интерактивного пользователя, выключение системы или выключение и перезагрузка системы;
  • SwapMouseButton — меняет или восстанавливает значение левой и правой кнопок мыши.

Что мы будем сегодня делать?

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

  • выключение или перезагрузка компьютера;
  • запуск другой программы из терминала (например, google chrome);
  • замена названия окна программы.

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

Запуск приложения

Первое, что нужно сделать – объявить функцию ShellExecuteW:

Затем в методе onStart() запустим нужную программу:

Бросим скрипт на любой график и у нас откроется указанная программа.
Теперь включим в наш скрипт библиотеку терминала WinUser32.mqh:

Теперь нам нужно найти хэндл окна запущенной программы. Это можно осуществить с помощью функции WinApi — FindWindowW.
В библиотеке терминала функция описана следующим образом:

Это означает, что в параметр string lpClassName необходимо ввести имя класса нашего приложения, а вместо параметра string lpWindowName имя окна программы — «Новая вкладка». Имя класса приложения можно узнать с помощью таких утилит как: Spy++, WinSight, WinInspector и другие. Скачаем и установим программу Spy++.

Утилита очень проста в использовании. Достаточно запустить программу, нажать кнопку с изображением бинокля и перетащить прицел на нужное нам окно, и мы сразу увидим его имя, класс и прочую информацию. В функции FindWindowW можно указывать и имя класса, и имя окна (или по отдельности). Нам достаточно будет указать только имя окна:

На экран выведена информация с хендлом найденного окна. Если хендл равен 0, значит, окно не найдено. Получив хендл главного окна, можно делать с приложением все, что нам заблагорассудится: искать нужное нам дочернее окно, считывать и передавать текст, программно нажимать кнопки и так далее.

Илон Маск рекомендует:  Что такое код mb_substitute_character

Добавим в наш код еще одну простую функцию SetWindowTextW. Она изменит текст окна на любой другой:

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

Чтобы выключить компьютер, введите следующую строку:

Чтобы перезагрузить компьютер, введите следующую строку:

Чтобы посмотреть параметры для различных версий Windows — пройдите по этой ссылке.

Заключение

В библиотеке WinUser32.mqh вы сможете также найти и много других интересных функций, которые позволят вам управлять сторонней программой прямо из советника, написанного на MQL4. Полный список функций WinApi вы можете найти на сайте MSDN.

Таким образом, вы можете полноценно управлять вашим компьютером из mql скрипта, автоматизировать все ваши действия по подготовке к торговле: открывать журналы сделок, новостные сайты при открытии терминала и так далее.

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

Используя SwapMouseButton (значение TRUE); чтобы кликнуть правой кнопкой мыши перетаскивание окна

Я должен как-то разрешить окно можно было перемещать с помощью правой опции нажмите перетаскивание. Я сделал это с помощью какого-то sneeky кода, который я не очень нравится, но она работает.

В настоящее время я улавливание сообщение WM_NCRBUTTONDOWN и устанавливая логическое значение, чтобы сказать, что я нахожусь в режиме перемещения, сбрасывая эту переменную, когда WM_NCRBUTTONUP принимается. В то время как в режиме движения я проверка WMNCMouseMove и перемещение формы самостоятельно. Поскольку это медленно идти в ногу с быстрыми движениями мыши я также установить таймер, чтобы сделать то же самое с помощью GetCursorPos.

Недавно я обнаружил функцию SwapMouseButton, и это именно то, что я хочу. Однако есть, но! Мне нужно поменять его условно и только тогда, когда пользователь имеет право щелкнул область ТИТРА окна.

Поэтому я поменять кнопки мыши раунд, когда я получаю WM_NCRBUTTONDOWN и сброс на WM_NCRBUTTONUP. Однако это будет работать на последующих кликах обеспечивших WM_NCRBUTTONUP никогда не сбросить его. Это, я думаю, потому что событие щелчка уже произошло так поздно, чтобы своп, который является, почему это работает для последующих ударов щелкните правой кнопкой мыши, но не правой кнопкой мыши и перетащить вызвавший замену мыши!

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

Вместо того , чтобы вручную отслеживать мышь или замену кнопок, есть более простой способ — в ответ WM_NCRBUTTONDOWN , просто поставить окно в режим перемещения изначально, отправив ему специальное WM_SYSCOMMAND сообщение, то он будет обрабатывать всю тяжелую работу перетаскивания для вас, например:

См Q114593 для получения более подробной информации.

Обновление: Я не смог WM_SYSCOMMAND работать с правой кнопкой мыши (он отлично работает , когда левой кнопкой мыши на дочерних элементов управления, хотя). Я думаю , что операционная система делает некоторые внутренне обработку , которая просто делает невозможным правильно работать. Так что я пошел с приближением перехвата движений мыши , чтобы переместить окно вручную, что делает его правильно работать с быстрыми движениями мыши без использования таймера с использованием SetCapture() вместо этого:

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

How do I use Rundll32 to swapmousebutton?

I’m repeating a question from another forum, as I’d like the same answer.

How do I pass boolean data from command prompt through rundll32.exe to a boolean type argument in a command running from user32.dll?

I’m trying to run this from CMD (the command prompt)

Where the asterisk is here is where the argument should go. I already ran it without an argument and it swapped my left and right mouse buttons (seems TRUE is the default entry for the boolean argument). Now I want to undo it. However I’ve tried each of these for passing FALSE in the argument, and none have worked (none set my mouse buttons back to normal).

Please help me pass the argument as needed. Thanks in advance.

migrated from superuser.com Jan 26 ’11 at 15:49

This question came from our site for computer enthusiasts and power users.

5 Answers 5

[. ] Rundll and Rundll32 programs do not allow you to call any exported function from any DLL. For example, you can not use these utility programs to call the Win32 API (Application Programming Interface) calls exported from the system DLLs. The programs only allow you to call functions from a DLL that are explicitly written to be called by them.

If you have the .NET Framework Runtime installed, it comes with compilers for several languages (for example, %SystemRoot%\Microsoft.NET\Framework64\v3.5\csc.exe for the v3.5 C# compiler on 64-bit systems). You can write a program in C#:

Thanks so much for the C# solution. It worked like a charm.

I made a slight alteration so that I could simply click on a desktop short-cut to toggle the primary mouse button, without passing in arguments. In case my approach helps someone else, here is that version:

There is hack, which can be used to configure the layout of the mouse for a left-handed user. Just run the following command:

Run this command to reconfigure the layout of the mouse for a left-handed user.

I am going to give you an explanation for this kind of behaviour:

Functions, which are called by rundll32.exe, have the following function prototype:

SwapMouseButton has the following function prototype:

SwapMouseButton uses the same calling convention (__stdcall) as every function called by rundll32.exe does.

If you call SwapMouseButton using rundll32.exe with an additional command-line, this command-line will be passed to this function as lpszCmdLine and will be ignored.

If you call that functions using rundll32, rundll32 automatically passes a valid window handle (HWND) as the first argument of the called function.

hwnd — window handle that should be used as the owner window for any windows your DLL creates

The function SwapMouseButton function called by rundll32 requires TRUE as the first argument in order to configure the layout of the mouse for a left-handed user. The valid window handle passed by rundll32.exe to SwapMouseButton within user32.dll is unequal to 0 and is defined as TRUE, when using a BOOL value.

You can find details on rundll32.exe and the prototype used by functions called by this executable here: INFO: Windows Rundll and Rundll32 Interface

You can find details about the function SwapMouseButton here: SwapMouseButton function (Windows)

Прочитайте онлайн СПРАВОЧНИК ПО WinAPI | SwapMouseButton

Описание: function SwapMouseButton(Swap: Bool): Bool

Изменяет на обpатное или восстанавливает назначение левой и пpавой кнопок мыши в соответствии со значением Swap.

Паpаметpы:

Swap: Не нуль, если нужно поменять местами назначение кнопок или нуль, если нужно восстановить исходные назначения.

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

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

Внимание!

Текст предназначен только для предварительного ознакомительного чтения.

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

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

Все права на исходные материалы принадлежат соответствующим
организациям и частным лицам.

Что такое код swapmousebutton

Reverses or restores the meaning of the left and right mouse buttons.

Syntax

Parameters

Type: BOOL

If this parameter is TRUE, the left button generates right-button messages and the right button generates left-button messages. If this parameter is FALSE, the buttons are restored to their original meanings.

Return value

Type: BOOL

If the meaning of the mouse buttons was reversed previously, before the function was called, the return value is nonzero.

If the meaning of the mouse buttons was not reversed, the return value is zero.

Remarks

Button swapping is provided as a convenience to people who use the mouse with their left hands. The SwapMouseButton function is usually called by Control Panel only. Although an application is free to call the function, the mouse is a shared resource and reversing the meaning of its buttons affects all applications.

Илон Маск рекомендует:  noindex в HTML

Requirements

Minimum supported client

Windows 2000 Professional [desktop apps only]

Что такое код swapmousebutton

This is a command line utility to switch primary and secondary mouse buttons. I regularly switch sides with my mouse to try and avoid repetitive posture related issues while working in front of the box. This gave me a build window command line story for switching mouse buttons without having to navigate to the mouse properties gui.

It uses a registry lookup to determine what mouse buttons setting is currently in place then a managed code api wrapper call to the win32 SwapMouseButton api to switch the setting to the opposite of whatever it currently is.

reg query «hkcu\Control Panel\Mouse» /v SwapMouseButtons

  • reg_sz = 0 = right handed mouse buttons setting is enabled
  • reg_sz = 1 = left handed mouse buttons setting is enabled

reg add «hkcu\Control Panel\Mouse» /v SwapMouseButtons /t reg_sz /d 0|1

  • this doesn’t apply setting until you signout and back in again presumably because that triggers mouse button settings lookup and initialization

Использование SwapMouseButton (TRUE); разрешить перетаскивание окна правой кнопкой мыши

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

В настоящее время я перехватываю сообщение WM_NCRBUTTONDOWN и устанавливаю логическое значение, чтобы сказать, что я нахожусь в режиме перемещения, сбрасывая эту переменную при получении WM_NCRBUTTONUP. В режиме перемещения я проверяю WMNCMouseMove и самостоятельно перемещаю форму. Поскольку медленное движение мышью идет медленно, я также установил таймер, чтобы сделать то же самое с помощью GetCursorPos.

Недавно я обнаружил функцию SwapMouseButton, и она делает именно то, что я хочу. Однако есть, но! Мне нужно поменять его условно и только тогда, когда пользователь щелкнул правой кнопкой мыши область CAPTION окна.

Поэтому я меняю кнопки мыши круглыми, когда получаю WM_NCRBUTTONDOWN и сбрасываю на WM_NCRBUTTONUP. Однако это будет работать при последующих щелчках, если WM_NCRBUTTONUP никогда не сбрасывает его. Я думаю, это потому, что событие щелчка уже произошло, так что это слишком поздно, чтобы поменять местами, поэтому оно работает для последующих щелчков правой кнопкой мыши, но не для щелчка правой кнопкой мыши и перетаскивания, которое вызвало переключение мыши!

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

Вместо того, чтобы вручную отслеживать мышь или менять кнопки, есть более простой способ — в ответ на WM_NCRBUTTONDOWN просто WM_NCRBUTTONDOWN окно в режим перемещения, отправив ему специальное сообщение WM_SYSCOMMAND , а затем оно выполнит всю сложную работу перетаскивания для Вы, например:

См. Q114593 для более подробной информации.

Обновление: я не смог заставить WM_SYSCOMMAND работать при щелчке правой кнопкой мыши (хотя он прекрасно работает при щелчке левой кнопкой мыши по дочерним элементам управления). Я думаю, что ОС выполняет некоторую внутреннюю обработку, которая просто делает невозможной правильную работу. Таким образом, я использовал метод перехвата движений мыши для перемещения окна вручную, заставляя его работать правильно с быстрыми движениями мыши без использования таймера, используя вместо этого SetCapture() :

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

Ввод данных с клавиатуры

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

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

Рисунок 2 — Модель ввода данных с клавиатуры

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

Поток может вызвать функцию GetFocus для определения, какое из окон в текущий момент времени имеет фокус ввода. Поток может поместить фокус ввода на одно из своих окон с помощью функции SetFocus. При изменении положения фокуса ввода, ОС посылает сообщение WM_KILLFOCUS тому окну, которое потеряло фокус ввода, а затем посылает сообщение WM_SETFOCUS тому окну, на которое перешел фокус ввода.

Концепция фокуса ввода связана с понятием активное окно. Активное окно — окно верхнего уровня, с которым работает пользователь. Окно, обладающее фокусом ввода является либо активным окном, либо порожденным окном активного окна. Чтобы пользователь мог определить, какое окно является активным, ОС выделяет заголовок окна (если он есть) или перемещает его на передний план.

Поток может выбрать активное окно с помощью функции SetActiveWindow. Для определения того, какое окно является активным — поток может использовать функцию GetActiveWindow. Обе эти функции в качестве входного (SetActiveWindow) и выходного (GetActiveWindow) параметра используют дескриптор окна.

Для блокировки ввода от клавиатуры и мыши используется функция BlockInput. В качестве входного параметра задается логическое значение, определяющее заблокировать ввод (если входной параметр имеет значение ИСТИНА) или разблокировать ввод (если входной параметр имеет значение ЛОЖЬ). Необходимо отметить, что разблокировать заблокированный ввод может успешно только тот поток, который и заблокировал ввод.

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

Когда пользователь нажимает на клавиши, оконная процедура окна, имеющего фокус ввода получает сообщения о нажатии клавиши. Сообщений о нажатии клавиш всего 4: WM_KEYDOWN (клавиша нажата), WM_KEYUP (клавиша отпущена), WM_SYSKEYDOWN (нажата системная клавиша) и WM_SYSKEYUP (системная клавиша отпущена). Обычно, оконная процедура игнорирует все сообщения о нажатии клавиши за исключением сообщения WM_KEYDOWN.

Когда оконная процедура получает сообщение WM_KEYDOWN, она должна обработать нажатие клавиши в соответствии со значением кода виртуальной клавиши. Код виртуальной клавиши находится в параметре wParam сообщения WM_KEYDOWN. Обычно, приложения обрабатывает только нажатия клавиш, сгенерированные несимвольными клавишами (т.е. функциональными клавишами, клавишами управления курсора и т.п.). В параметре lParam сообщения WM_KEYDOWN содержит дополнительную информацию (например, счетчик повторений, если пользователь нажал и удерживает клавишу). Любой поток, который получает символьный ввод от пользователя, должен включать функцию TranslateMessage в цикл обработки сообщений. Эта функция проверяет код виртуальной клавиши сообщения о нажатии клавиши и, если код соответствует какому-либо символу, помещает сообщение с символом в очередь сообщений. Сообщение с символом обрабатывается и удаляется в следующей итерации цикла обработки сообщений, параметр wParam этого сообщения содержит код символа.

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

Как уже говорилось выше, оконная процедура получает сообщение с символом после того, как функция TranslateMessage преобразует код виртуальной клавиши в код символа. Существует 4 типа сообщений с символами: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR и WM_SYSDEADCHAR.

Типичная оконная процедура игнорирует все сообщения с символами за исключением сообщения WM_CHAR. Это сообщение формируется функцией TranslateMessage когда пользователь нажимает одну и следующих клавиш:

· Любую символьную клавишу

Когда оконная процедура получает сообщение WM_CHAR, она должна проверить код символа и в зависимости от его значения определить, как обработать символ. Код символа передается в параметре wParam.

Илон Маск рекомендует:  Что такое код equalrect

Пример использования функции TranslateMessage можно обнаружить в приложении А.

1.2.4.1.2 Ввод данных с помощью «мыши»

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

Приложение получает данные от «мыши» в форме сообщений, посылаемых окну.

Когда пользователь двигает «мышью», ОС перемещает растровую картинку на экране, называемую курсором «мыши». Курсор «мыши» содержит точку размером в 1 пиксель, называемую hot-spot (дословно, «горячая точка«) — именно по координатам этой точки ОС определяет координату курсора. Когда происходит событие с манипулятором типа «мышь» (мышь двигается, нажимается клавиша мыши и т.п.) окну, которое содержит курсор мыши (точнее, горячую точку курсора мыши) посылается сообщение. Для получения сообщения от «мыши» окну не обязательно быть активным или иметь фокус ввода. Система обычно посылает сообщение от «мыши» тому окну, которое содержало горячую точку курсора во время свершения события. Приложение может изменить такой порядок вещей с помощью функции SetCapture. То есть функция SetCapture осуществляет захват ввода с помощью «мыши». В качестве входного параметра функция SetCapture получает дескриптор окна, созданного текущим потоком, которому будут пересылаться все сообщения от «мыши». В качестве выходного параметра функции SetCapture выступает дескриптор того окна, который захватывал ввод «мыши» непосредственно до настоящего момента.

Окно получает все сообщения мыши до тех пор, пока приложение не вызовет функцию ReleaseCapture (вызывается без входных параметров, в качестве выходного параметра выдает ненулевое значение в случае, если функция выполнилась успешно и 0 — в противном случае) или не определит для захвата другое окно. Необходимо отметить, что захват ввода «мыши» может осуществить лишь окно (или часть окна), находящееся на переднем плане.

Захват ввода «мыши» может быть полезен, если окно должно получить все сообщения от мыши, даже когда курсор перемещается за пределы окна. Например, приложения обычно отслеживают позицию курсора после того, как нажимается клавиша мыши и следят за курсором до тех пор, пока пользователь не отпустит клавишу «мыши». Если приложение не захватывает ввод «мыши» и пользователь отпускает клавишу «мыши» за пределами окна, окно не получит сообщения об отпускании клавиши «мыши».

Поток может использовать функцию GetCapture для определения того, какое из его окон захватило «мышь». Функция GetCapture вызывается без входных параметров, а в качестве выходного параметра выдает дескриптор окна, захватившего ввод «мыши» (если в результате выполнения функции формируется нулевое значение — значит, окна текущего потока не осуществляли захват ввода «мыши»).

Хотя «мышь» является важным устройством ввода, а для некоторых пользователей — основным устройством ввода, не все пользователи обязательно имеют «мышь». Приложение может определить наличие «мыши» в системе с помощью значения параметра SM_MOUSEPRESENT функции GetSystemMetrics. Функция GetSystemMetrics позволяет определить установки конфигурации системы. Сообщения и поименованные константы [4,5] имеют в своем составе буквы L, M и К для связи с соответствующими клавишами «мыши». Символ L свидетельствует о связи с левой клавишей мыши, R — правой, M — средней клавишей «мыши». Хотя Windows поддерживает и «мыши» с большим числом клавиш, большинство приложений используют в основном левую клавишу «мыши», а остальные — в меньшей степени (если вообще используют).

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

Приложение может определить количество кнопок на «мышке» с помощью значения параметра SM_CMOUSEBUTTONS функции GetSystemMetrics. Переназначать клавиши «мыши» можно с помощью функций SwapMouseButton в качестве входного параметра задается логическое значение: TRUE — левая и правая клавиши мыши меняются местами, FALSE — восстанавливается нормальное функционирование «мыши») или SystemParametersInfo (с помощь значения параметра SPI_SETMOUSEBUTTONSWAP — тип параметра логический, значения — аналогично что и у SwapMouseButton). Необходимо отметить, что поскольку «мышь» является разделяемым ресурсом — все изменения назначения клавиш «мыши» будут влиять на все приложения.

Мышь генерирует события всякий раз, когда пользователь двигает ею или нажимает и отпускает клавиши. ОС преобразует, эти события в сообщения и посылает их в очередь сообщений соответствующего потока. Если поток не успевает обрабатывать поступающие сообщения от «мыши», ОС сама уничтожает их оставляя лишь самое последнее сообщение «мыши».

Сообщения «мыши» делятся на 2 группы: сообщения от клиентской области и сообщения от неклиентской области. Обычно, приложение обрабатывает сообщения клиентской области и игнорирует сообщения неклиентской области.

Окно получает сообщения клиентской области когда события «мыши» происходят внутри клиентской области окна (или рабочая область окна — все пространство окна, за исключением границ окна, полос прокрутки, меню, панелей инструментов и т.п.). ОС посылает сообщение WM_MOUSEMOVEокну всякий раз, когда пользователь двигает мышь внутри клиентской области. ОС посылает одно из сообщение (таблица 10) всякий раз, когда пользователь нажимает или отпускает клавиши «мыши» внутри клиентской области.

Таблица 10 — Сообщения «мыши»

Сообщение Значение Код сообщения (16 с/с)
WM_LBUTTONDBLCLK Левая клавиша дважды нажата 0х0203
WM_LBUTTONDOWN Нажата левая клавиша 0х0201
WM_LBUTTONUP Левая клавиша отпущена 0х0202
WM_MBUTTONDBLCLK Средняя клавиша дважды нажата 0х0209
WM_MBUTTONDOWN Средняя клавиша нажата 0х0207
WM_MBUTTONUP Средняя клавиша отпущена 0х0208
WM_RBUTTONDBLCLK Правая клавиша дважды нажата 0х0206
WM_RBUTTONDOWN Правая клавиша нажата 0х0204
WM_RBUTTONUP Правая клавиша отпущена 0х0205

Каждое из перечисленных сообщений имеет 2 параметра. Параметр lParam сообщения клиентской области определяет координаты курсора «мыши»: младшее слово определяет кординату по X (горизонтальную координату), старше слово — координату по Y (вертикальную координату). Эти координат отсчитываются относительно клиентской области — левый верхний угол имеет координату (0,0). Параметр wParam содержит признаки, которые определяют статус других клавиш мыши и клавиш CTRL и SHIFT во время свершения события «мыши». В таблице приведены значения параметра wParam.

Таблица 11 — Значения параметра wParam сообщения «мыши»

Имя параметра Значение Код параметра
MK_CONTROL Клавиша CTRL нажата 0х0008
MK_LBUTTON Левая клавиша «мыши» нажата 0х0001
MK_MBUTTON Средняя клавиша «мыши» нажата 0х0010
MK_RBUTTON Правая клавиша «мыши» нажата 0х0002
MK_SHIFT Клавиша SHIFT нажата 0х0004

Неклиентская часть окна состоит из границы окна, строки меню, строки заголовка, полос прокрутки, меню окна, кнопок свертывания и развертывания окна.

ОС формирует сообщения неклиентской области, в основном для своих собственных нужд. Например, ОС использует сообщение неклиенсткой области, когда курсор указывает на границу окна для изменения его внешнего вида (обычно курсор в этот момент представляется двунаправленной стрелкой). Для того чтобы использовать сообщения «мыши» неклиентской области окна, оконная процедура должна обработать эти сообщения в процедуре DefWindowProc.

Для каждого сообщения «мыши» клиентской области есть и соответствующее сообщения для неклиентской области. Имена этих сообщений такие же, за исключением того, что для сообщений неклиентской области в имена вводятся символы NC (например, WM_NCLBUTTONDBLCLK — двойное нажатие левой клавиши мыши). Параметр lParam сообщений неклиентской области содержит координаты курсора относительно левого-верхнего угла экрана (а не клиентской части окна, как у сообщений клиентской области). Параметр wParam содержит значение, которое показывает, в какой части неклиентской области произошло событие.

Таблица 12 — Некоторые значение параметра wParam сообщения «мыши» неклиентской области

Имя параметра Расположение курсора Код параметра
HTSYSMENU На системном меню
HTBOTTOM На нижней горизонтальной границе окна
HTBOTTOMLEFT В нижнем левом углу окна
HTBOTTOMRIGHT В нижнем правом углу окна
HTCAPTION В строке заголовка
HTCLIENT В клиентской области
HTCLOSE In a Close button.На кнопке закрытия окна

Не нашли то, что искали? Воспользуйтесь поиском:

Использование SwapMouseButton (TRUE); разрешить перетаскивание правой кнопкой мыши

Мне нужно каким-то образом разрешить перемещение окна с помощью параметра перетаскивания правой кнопкой мыши. Я сделал это через какой-то прочный код, который мне не очень нравится, но он работает.

В настоящее время я захватываю сообщение WM_NCRBUTTONDOWN и устанавливаю bool, чтобы сказать, что я в режиме перемещения, сбросив эту переменную при получении WM_NCRBUTTONUP. В режиме перемещения я проверяю WMNCMouseMove и перемещаю форму самостоятельно. Поскольку это медленно, чтобы не отставать от быстрых движений мыши, я также устанавливаю таймер, чтобы сделать то же самое с помощью GetCursorPos.

Я недавно открыл функцию SwapMouseButton, и это делает именно то, что я хочу. Однако есть, но! Мне нужно поменять его условно и только тогда, когда пользователь щелкнул правой кнопкой мыши область CAPTION окна.

Поэтому я переключаю кнопки мыши вокруг, когда получаю WM_NCRBUTTONDOWN и сбрасываю WM_NCRBUTTONUP. Однако это будет работать на последующие клики, если WM_NCRBUTTONUP никогда не перезагружает его. Это, я думаю, потому, что событие щелчка уже произошло, так что поздно, чтобы поменять местами, поэтому он работает для последующих щелчков правой кнопкой мыши, но не щелкнул правой кнопкой мыши и не перетащил, что вызвало обмен мышью!

Может ли кто-нибудь увидеть путь вокруг этого. Имея в виду, что мне нужны функции левого щелчка для закрытия, минимизации, увеличения кнопок и т. Д. Щелкните правой кнопкой мыши на кнопку для перемещения!

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