Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Клик по неактивному окну


Автор: RinOSpro 25.8.2010, 15:25
Всем привет! Облазил пол инета но так и не нашел ответа на достаточно простой вопрос... 
Как кликнуть по неактивному окну то есть если окно свернутое или оно находится за другим окном?

Один из способов это использовать SetForegroundWindow, но это не лучший вариант имхо.
Сейчас кликаю так:

Post/Send Message(LHandle, WM_LBUTTONDOWN, MK_LBUTTON, MakeLParam(LPoint.X, LPoint.Y));
Post/Send Message(LHandle, WM_LBUTTONUP, MK_LBUTTON, MakeLParam(LPoint.X, LPoint.Y));

Можно ли вообще кликать по неактивному окну? без патча ядра)

Автор: RinOSpro 9.9.2010, 14:31
Людии) где выы) Не ужели ни кто не знает...

Автор: okkonst 9.9.2010, 14:38
Например - так. последний ноль - туда, вестимо, лучше передать координаты мыши.
Postmessage(WND, WM_LBUTTONDOWN, 0,0);
PostMessage(WND, WM_LBUTTONUP,0,0);


Автор: RinOSpro 9.9.2010, 14:46
О боже... да ты даже не удосужился пост до конца дочитать.

Автор: Keeper89 9.9.2010, 15:16
Цитата(RinOSpro @  25.8.2010,  15:25 Найти цитируемый пост)
Как кликнуть по неактивному окну

По заголовку окна или куда щелкнуть?

Автор: okkonst 9.9.2010, 16:24
Удосужился. Просто ты не удосужился нормально вопрос задать. И сказать, в чем проблема. Собственно, чего ты хочешь? Например, на твой вопрос можно ответить так: нет, нельзя, поскольку, как только ты кликнешь мышой на неактивном окне - оно станет активным, и ты будешь щелкать по АКТИВНОМУ окнуsmile  А вот если тебе надо на кнопку нажать - это СОВСЕМ другой вопрос. Обычно это WM_COMMAND родителю...

Автор: RinOSpro 9.9.2010, 16:48
Цитата(Keeper89 @  9.9.2010,  15:16 Найти цитируемый пост)
По заголовку окна или куда щелкнуть?

Цитата
кликнуть по неактивному окну то есть если окно свернутое или оно находится за другим окном?

В любое место, по заданным кординатам.

http://s61.radikal.ru/i171/1009/45/e27ecb4201c6.png

Цитата(okkonst @  9.9.2010,  16:24 Найти цитируемый пост)
Сэмулировать мышиный щелчок на уровне mouse_event 

Читай вопрос снова:
Цитата(RinOSpro @  25.8.2010,  15:25 Найти цитируемый пост)
Один из способов это использовать SetForegroundWindow, но это не лучший вариант имхо.

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

Автор: okkonst 9.9.2010, 17:56
Цитата(RinOSpro @ 9.9.2010,  16:48)
В любое место, по заданным кординатам.

В общем случае твоя задача вряд ли имеет однозначное решение.  По сути, она сводится к эмуляции пользовательского ввода... без оного.  Частные решения, безусловно есть, но они могут зависеть от управляемой программы. Самое простое и, пожалуй, надежное - то, что ты и сам применил. Кстати, ты так и не сказал, чем оно тебя не устраивает. Подозреваю, что работоспособность оного зависит от алгоритма обработки сообщения. Например, внутри может происходить считывание координат мыши (GetCursorPos) - тогда перед отправкой надо мышку правильно позиционировать. Возможны и более извращенные варианты. Все-таки, рассказал бы о задаче? Тебе надо управлять каким-то конкретным приложением? Паинтом, или он выбран случайно ради примера? Если да - то с какой целью (в смысле, просто кликать)? Работает ли твой способ, если да - что тебя в нем не устраивает?

Автор: RinOSpro 10.9.2010, 09:29
Цитата(okkonst @  9.9.2010,  17:56 Найти цитируемый пост)
Все-таки, рассказал бы о задаче?

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

Цитата(okkonst @  9.9.2010,  17:56 Найти цитируемый пост)
Кстати, ты так и не сказал, чем оно тебя не устраивает.

К примеру сижу я чем ни будь занимаюсь, и тут бац разворачивается окно и давай кликать.
У меня раньше такая проблема была с отправкой пользовательского ввода с клавиатуры но в этом случае я нашел решение:
http://delphiworld.narod.ru/base/keyboard_keys_down3.html, сейчас ищу такое же решение для мышки.

Цитата(okkonst @  9.9.2010,  17:56 Найти цитируемый пост)
Например, внутри может происходить считывание координат мыши (GetCursorPos) - тогда перед отправкой надо мышку правильно позиционировать.

Это я уже написал, мышка правильно позиционируется, расчитывает ClientRect.

Цитата(okkonst @  9.9.2010,  17:56 Найти цитируемый пост)
 Паинтом, или он выбран случайно ради примера?

Паинт выбран по тому что в нем хорошо видно куда я кликаю smile А вообще это может быть любое приложение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)