Как выбрать и выделить окно в другом приложении?

Я хотел бы отправить несколько нажатий клавиш из программы на C++ в другое окно.

По этой причине я хотел бы, чтобы пользователь выбирал целевое окно, аналогично тому, как это делается в утилите Spy ++, поставляемой с Visual Studio (перетащите курсор в виде перекрестия на целевое окно и выделите целевое окно рамкой).

Как это перетаскивание выполняется в Windows? Я совершенно не понимаю, где мне начать искать механизм для реализации этой функции.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 648
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот как это обычно делается:

  1. Захватите мышь с помощью SetCapture. Это приведет к тому, что все сообщения мыши будут направляться в окно вашего приложения.
  2. Обработайте сообщение WM_MOUSEMOVE. В коде обработчика захватите окно под мышью, используя WindowFromPoint. Это даст вам HWND окна, над которым в данный момент находится мышь.
  3. Теперь, когда у вас есть окно, вам нужен контекст устройства (HDC). Вы можете получить его, используя GetWindowDC для указанного окна.
  4. Теперь вы можете рисовать в DC, используя типичные функции GDI.

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

Для этого вы также можете нарисовать DC на экране, но в любом случае вам понадобится дескриптор окна, чтобы получить прямоугольник окна.

Если вы поищете в Google исходный код Spy ++, вы увидите несколько примеров этой техники.

Проблема с этим подходом заключается в том, что DWM (в частности, Aero) не знает о ваших красиво нарисованных изображениях и удаляет их случайным образом.

Ed Guiness 26.02.2010 15:16

Бывшие ответы неверны.

Исходный код Spy ++ был предоставлен в G. Groups в течение многих лет (см. В основном новости о Win32 api ng: //194.177.96.26/comp.os.ms-windows.programmer.win32)

Я знаком с кодом Spy ++, но есть несколько способов сделать это. Вы можете сделать это вне процесса, используя технику, описанную выше, или вы можете сделать это внутри процесса, используя перехватчики, внедрение DLL и создание подклассов. Я считаю, что это именно то, что делает Spy ++. Но для покраски это не обязательно.

user2189331 23.10.2008 14:39

Другие вопросы по теме