Как нажать кнопку в другом приложении c
Поскольку требовалась такая же функциональность на C++, было решено перенести и доработать код, чтобы он удовлетворял потребности. Остальная статья объяснит принцип отправки клавиш в Win32 и покажет, как использовать код, чтобы отправлять клавиши всего двумя строками кода.
Принцип отправки клавиш в Win32
Основой функциональности отправки клавиш в CSendKeys является использование функции Win32 API keybd_event().
keybd_event() производит нажатие клавиши, однако прерывание драйвера клавиатуры обрабатывает вызовы этой функции, а значит, можно отправлять почти любое сочетание клавиш с незначительными ограничениями.
Вкратце, это позволяет отправлять виртуальную клавишу, определенную в winuser.h как VK_XXX, и флаг, обозначающий KeyDown(клавиша нажата), KeyUp(клавиша отпущена) или состояние, сообщающее, является ли VKey расширенной клавишей.
Нормальные символы переводятся в виртуальные клавиши посредством VkKeyScan(), принимающей CHAR и возвращающей WORD, обозначающий виртуальную клавишу.
При отправке клавиши она будет нажата до тех пор, пока не будет отправлена снова с флагом KEYEVENTF_KEYUP.
Ниже приведен маленький фрагмент кода, отправляющий сочетание клавиш ALT-TAB:
Как видно, для отправки этого простого сочетания клавиш понадобилось 4 строки кода. Здесь вступает в действие CSendKeys, чтобы упростить данную задачу.
Как использовать код
Вкратце, код можно использовать следующим образом:
Каждую клавишу представляет один или несколько символов. Чтобы указать один клавиатурный символ, используйте сам символ. Например, чтобы представить букву 'a', передайте строку "a" методу. Чтобы представить строку символов, передайте их по порядку, как "hello".
" нажимается Shift+`, что равноценно нажатиям клавиш "+`" или просто "" (таблица 1.b).
Все символы в таблице 3 зарезервированы и имеют специальное значение в дополнение к левым или правым круглым или квадратным скобкам.
Круглые скобки используются для связывания заданного модификатора или модификаторов с группой символов. Например, отправка "HELLO" описывается как "+(hello)", что сообщает CSendKeys нажать клавишу SHIFT при отправке следующей группы клавиш. Тогда как квадратные скобки используются для закрытия любых клавиш, представленных в таблице 1 и 2.
Отправленные клавиши не отправляются конкретному приложению, вместо этого они просто нажимаются, и любое приложение, имеющее ввод с клавиатуры, примет клавиши.
Как программно нажать на клавишу WIN?
Да, есть класс SendKeys, с помощью которого можно программно нажимать на клавиши(даже статья есть.
Как программно нажать клавишу Windows?
Знаю подобных вопросов на форуме много, но все же прочитав большую их часть, я не нашел ответа, как.
Как программно нажать клавишу F5 для обновления рабочего стола из своего приложения?
Есть ли метод или функция эмулирующая нажатие клавиши F5 для обновления рабочего стола? Или.
мб живой пример подкинете?
упрощенно нажатие кнопки 1 в калькуляторе выглядит так
и если мне не изменяет память когда то это даже работало, но сейчас в моей винде у калькулятора подписей к кнопкам нет, соответственно искать кнопку по подписи не получится
скорее всего вам также понадобится подключать поиск дочернего окна / следующего окна и т.д. чтобы осуществлять навигацию по вложенным окнам на форме приложения
также вам наверное понадобится что-то, что позволит расковырять приложение и понять куда вообще лезть к нужной кнопке, лично мне в этом помог spy++
з.ы. где то, кажется даже на этом же форуме лежит пример лучше, который лично мне и помог разбираться в этом некоторое время назад
з.ы. где то, кажется даже на этом же форуме лежит пример лучше, который лично мне и помог разбираться в этом некоторое время назад спасибо за помощ, мне оно не надо, но я сохраню то, что ты тут скинул)я понял, но мне не надо такого) мне надо именно послать клавишу к примеру "A", в полностью свернутое приложение. ясно, такого не искал
подумал что имеется в виду послать клик на клавишу где то)
Продолжим поиски) и подведем итоги:
Нужен код посылания нажатия клавиши клавиатуры в другое приложеение(нажать "А" в свернутом приложении)
Добавлено через 2 часа 40 минут
UP. Дайте хоть указание или подсказку как ето сделать
Добавлено через 8 минут
Жду помощи
Добавлено через 9 часов 53 минуты
люююди сори за флуд, ето вообще реально?
спасибо, разобрался. 2х методов из библиотеки юзер32 хватило) Модеры закройте тему плиз спасибо, разобрался. 2х методов из библиотеки юзер32 хватило) Модеры закройте тему плиз День добрый!
Может подскажите, как решилось? Возник подобный вопрос по нажатию клавиши в другом приложении, handle отлавливается
SendMessage тоже работает(проверял на закрытие окна)
и собственно такой вариант работает
Программно нажать клавишу
Здравствуйте! В общем такой вопрос, как программно нажать на клавишу или сочетание клавиш. Есть.
Как нажать программно кнопку в другом приложении
День добрый! Возник вопрос программно нажать в другом приложении кнопку; примеры видел, не все.
Программно нажать клавишу в консоли
Есть функция которая читает md5 хеш файла в консоли. class Program < static void Main(string.
Программно нажать клавишу клавиатуры в чужом окне
Ребят , что не так не могу разобраться , может программа обрабатывает нажатие по другому. Есть.
Как программно нажать клавишу
По теме вроде как понятно. Ребят подскажите пожалуйста.
Как программно нажать клавишу [=] и [-]?
Почти все поисковики перерыл, а ответа так и не нашел =( Мне нужно программно нажать клавиши и .
Я пытаюсь использовать следующий код, чтобы нажать кнопку в другом приложении:
Это не работает. Я попытался передать разные ручки MAKEWORD и изменить WPARM и LPARAM, но ничего.
любые идеи о том, как нажать кнопку в окне другого приложения?
код ценится. Спасибо.
изменить: Причина, по-видимому, не работает разрешения. Я отправил PostMessage() , и результатом была ошибка с GetLastError () = 5 (или доступ запрещен). Есть идеи?
EDIT2 Я не хочу быть грубым, но, пожалуйста, пожалуйста, пожалуйста, я уже искал все API, включая получение и настройку регионов для кнопки, а затем отправку кнопки вниз и кнопку вверх, получение идентификатора управления, получение идентификатора класса и еще миллион. Причина, по которой я задал вопрос здесь в первую очередь, потому что я уже исчерпал свой поиск в интернете. Если вы знаете ответ пожалуйста ПОЧТОВЫЙ ИНДЕКС, не предлагайте API, и все, покажите мне, как этот API решает проблему. Это не трудно. спасибо.
EDIT 3: Ответ на вопрос был выбран автоматически, когда баунти закончил. Вопрос остается без ответа.
обновление: Я считаю, что это должно работать,
см. следующее решение, также вы можете использовать
Примечание.: Получение уверенности из текста окна, текст кнопки (проверьте, есть ли место в конце заголовка окна)
этого не должно происходить, если процесс, которому принадлежит целевое окно, не запускается "asAdministrator" или не является службой. И его чертовски трудно для служб создавать окна на интерактивном рабочем столе с Windows 6 и выше.
есть две функции для имитации событий мыши SendInput и mouse_event . Я рекомендую использовать . Чтобы поднять окно, вы можете использовать ShowWindow. Я не знаю, как получить ручку кнопки, но если у вас есть hWnd его легко найти его абсолютное положение, используя GetWindowRect. Попробуйте использовать их, если у вас возникнут какие-либо проблемы, я буду рад помочь.
Microsoft теперь нажимает активная доступность (MSAA) для автоматизации пользовательского интерфейса , (На протяжении многих лет он был переименован несколько раз) см.
Извините, у меня нет простого кода, чтобы вы начали. Как "Метод SendMessage()" кажется, не работает для вас, я не знаю другого варианта, кроме "UI Automation"
вы можете использовать sendkeys (как сказал tr3) для отправки щелчков мыши, что отличается от использования SendMessage. Он также менее прямой и более Хак-иш, но полезен для автоматизации (в VBS).
подход, отличный от C: используйте Java и java.ОУ.Класс роботов для перемещения мыши выполняет реальные клики (я думаю, что для этого тоже есть что-то в мире Windows). Проблема: вы должны знать, где находится ваша кнопка: D
Я пытаюсь использовать следующий код, чтобы нажать кнопку в другом приложении:
Это не работает. Я попробовал передать разные ручки в MAKEWORD и изменить WPARM и LPARAM, но ничего.
Любые идеи о том, как нажать кнопку в другом окне приложения?
Код оценен. Спасибо.
EDIT: Причина, по которой он не работает, разрешает работать. Я отправил PostMessage(), и результатом была ошибка с GetLastError() = 5 (или Access Denied). Любые идеи?
EDIT2 Я не хочу быть грубым, но, пожалуйста, пожалуйста, я уже искал все API, включая получение и настройку регионов для кнопки, а затем отправку кнопки вниз и кнопку вверх, получение идентификатор управления, получение идентификатора класса и еще миллион. Причина, по которой я задал этот вопрос, в первую очередь, состоит в том, что я уже исчерпал свой поиск в Интернете. Если вы знаете ответ PLEASE POST CODE, не предлагайте API и его, покажите мне, как этот API решает проблему. Это не сложно. Спасибо.
РЕДАКТИРОВАТЬ 3: Ответ на вопрос был выбран автоматически, когда награда закончилась. Вопрос остается без ответа.
ОТВЕТЫ
Ответ 1
Обновление: Я считаю, что это должно работать,
Ответ 2
Ответ 3
Ответ 4
См. следующее решение, также вы можете использовать
Примечание: Убедитесь, что текст окна, текст кнопки (проверьте, есть ли место в конце заголовка окна)
Ответ 5
Это не должно происходить, если процесс, которому принадлежит целевое окно, запускается "asAdministrator" или является службой. И его чертовски сложно обслуживать создание окон на интерактивном рабочем столе с Windows 6 и выше.
Вы можете немного прочитать о Уровнях целостности здесь, если они применимы даже в отдаленной ситуации к этой ситуации. Internet Explorer - единственное другое приложение, которое "выбирает" в модели безопасности целостности, намеренно снижая уровень целостности самого себя, чтобы более эффективно работать с песочницей.
Ответ 6
Есть две функции для имитации события мыши SendInput и mouse_event . Я рекомендую использовать функцию mouse_event . Чтобы поднять окно, вы можете использовать ShowWindow. Я не знаю, как получить ручку кнопки, но если у вас есть hWnd, легко найти ее абсолютное положение, используя GetWindowRect, Попробуйте использовать их, если у вас возникнут какие-либо проблемы, я буду рад помочь.
Ответ 7
Ответ 8
Microsoft теперь предлагает Active Accessibility (MSAA) для автоматизации пользовательского интерфейса, (Он был переименован несколько раз за эти годы) см.
Извините, у меня нет простого кода, чтобы вы начали. Поскольку "SendMessage()" , похоже, не работает для вас, я не знаю другого варианта, кроме "Автоматизации пользовательского интерфейса"
Ответ 9
Вы можете использовать sendkeys (как указано tr3) для отправки щелчков мыши, что отличается от использования SendMessage. Он также менее прямой и более хакерский, но полезен для автоматизации (в VBS).
Ответ 10
Читайте также: