Взаимодействие со сторонним приложением
Цитата: --- НЛО --- от 01.11.2022, 13:56Здравствуйте, необходимо нажать на кнопку запуска в стороннем приложении на виндовс, мне известен его pid.
Пробовал через винапи, не получилось реализовать. На уму только 1 реализация через клики по координатам, но это не эффективно
Здравствуйте, необходимо нажать на кнопку запуска в стороннем приложении на виндовс, мне известен его pid.
Пробовал через винапи, не получилось реализовать. На уму только 1 реализация через клики по координатам, но это не эффективно
Цитата: --- НЛО --- от 01.11.2022, 15:04разобрался как получать необходимое окно, и код даже работает, осталось узнать как вызвать нажатие необходимой кнопки
var proc = Process.GetProcessById(10676); Console.WriteLine(proc.MainWindowTitle); var hand = proc.MainWindowHandle; SetForegroundWindow(hand);
разобрался как получать необходимое окно, и код даже работает, осталось узнать как вызвать нажатие необходимой кнопки
var proc = Process.GetProcessById(10676);
Console.WriteLine(proc.MainWindowTitle);
var hand = proc.MainWindowHandle;
SetForegroundWindow(hand);
Цитата: yuri от 01.11.2022, 15:28Привет, ну, Я бы отправил комбинацию клавиш, если кнопка поддерживает хоткей, либо, по x y отправил клик
[spoiler title="Методы"][DllImport("user32.dll")] static extern int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam); enum vmMouse { lButton = 0x01, rButton = 0x02, LeftDown = 0x0201, LeftUp = 0x0202, RightDown = 0x0204, RightUp = 0x0205, mButton = 0x04, Wheel = 0x020A, Move = 0x0200, Hover = 0x02A1, } IntPtr CreatePos(int LoWord, int HiWord) => (IntPtr)((HiWord << 16) | (LoWord & 0xffff)); void leftClick(IntPtr handle, int x, int y) { SendMessage(handle, (uint)vmMouse.LeftDown, new IntPtr((int)vmMouse.lButton), CreatePos(x, y)); SendMessage(handle, (uint)vmMouse.LeftUp, new IntPtr((int)vmMouse.lButton), CreatePos(x, y)); } void rightClick(IntPtr handle, int x, int y) { SendMessage(handle, (uint)vmMouse.RightDown, new IntPtr((int)vmMouse.rButton), CreatePos(x, y)); SendMessage(handle, (uint)vmMouse.RightUp, new IntPtr((int)vmMouse.rButton), CreatePos(x, y)); }[/spoiler]
[spoiler title="Вызов лкм"]// вместо spotify, поставь имя Своего процесса foreach (Process p in Process.GetProcessesByName("spotify")) { IntPtr handle = p.MainWindowHandle; // handle, x, y. Надо учитывать, что x y будут относительно окна приложения. Работает, даже если окно закрыто другим окном leftClick(handle, 123, 456); }[/spoiler]
Если x y не эффективно, то можно выставить Свой размер окна (если приложение поддерживает такое), либо шаманить над положением кнопки, в зависимости от размера окнаЕсли нужно отправить клавишу, то вот, но надо чтобы приложение было активным окном
Привет, ну, Я бы отправил комбинацию клавиш, если кнопка поддерживает хоткей, либо, по x y отправил клик
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam);
enum vmMouse {
lButton = 0x01,
rButton = 0x02,
LeftDown = 0x0201,
LeftUp = 0x0202,
RightDown = 0x0204,
RightUp = 0x0205,
mButton = 0x04,
Wheel = 0x020A,
Move = 0x0200,
Hover = 0x02A1,
}
IntPtr CreatePos(int LoWord, int HiWord) => (IntPtr)((HiWord << 16) | (LoWord & 0xffff));
void leftClick(IntPtr handle, int x, int y) {
SendMessage(handle, (uint)vmMouse.LeftDown, new IntPtr((int)vmMouse.lButton), CreatePos(x, y));
SendMessage(handle, (uint)vmMouse.LeftUp, new IntPtr((int)vmMouse.lButton), CreatePos(x, y));
}
void rightClick(IntPtr handle, int x, int y) {
SendMessage(handle, (uint)vmMouse.RightDown, new IntPtr((int)vmMouse.rButton), CreatePos(x, y));
SendMessage(handle, (uint)vmMouse.RightUp, new IntPtr((int)vmMouse.rButton), CreatePos(x, y));
}
// вместо spotify, поставь имя Своего процесса
foreach (Process p in Process.GetProcessesByName("spotify")) {
IntPtr handle = p.MainWindowHandle;
// handle, x, y. Надо учитывать, что x y будут относительно окна приложения. Работает, даже если окно закрыто другим окном
leftClick(handle, 123, 456);
}
Если x y не эффективно, то можно выставить Свой размер окна (если приложение поддерживает такое), либо шаманить над положением кнопки, в зависимости от размера окна
Если нужно отправить клавишу, то вот, но надо чтобы приложение было активным окном
Цитата: --- НЛО --- от 01.11.2022, 15:33какова вероятность, что код не отработает при высокой нагрузке системы? например цп будет биться в 100% и я запущу дополнительно 30 окон на которых вызову клик по координате, высока вероятность того, что где то код не отработает как надо
какова вероятность, что код не отработает при высокой нагрузке системы? например цп будет биться в 100% и я запущу дополнительно 30 окон на которых вызову клик по координате, высока вероятность того, что где то код не отработает как надо
Цитата: yuri от 01.11.2022, 15:34Помню, что sendkeys падал (пропускал клавиши), а вот клики не проверял с такой дикой нагрузкой
Помню, что sendkeys падал (пропускал клавиши), а вот клики не проверял с такой дикой нагрузкой
Цитата: --- НЛО --- от 02.11.2022, 02:12
IntPtr CreatePos(int LoWord, int HiWord) => (IntPtr)((HiWord << 16) | (LoWord & 0xffff));
обьясните этот код пожалуйста
Скопировано
IntPtr CreatePos(int LoWord, int HiWord) => (IntPtr)((HiWord << 16) | (LoWord & 0xffff));
Скопировано
обьясните этот код пожалуйста
Цитата: yuri от 02.11.2022, 02:20Я не вдавался в подробности,лишь знаю,что этот метод задаёт данные x y для курсора внутри приложения. Если хочешь подробнее узнать об этом, глянь тут
Я не вдавался в подробности,лишь знаю,что этот метод задаёт данные x y для курсора внутри приложения. Если хочешь подробнее узнать об этом, глянь тут
Цитата: --- НЛО --- от 02.11.2022, 03:00в спотифае это конечно работает, но в приложении с которым я работаю - никакой отдачи. Попробовал со стимом взаимодействовать, - тот же результат. Из интересного, когда загнал все в цикл который перебирает все координаты - ничего не происходит, до того, как я не помещу курсор мыши на окно стима, дальше я сам так до конца и не понял, что происходит. Когда кликает по координате, когда кликает на позицию курсора
С моими вин форм/впф окнами та же ситуация
в спотифае это конечно работает, но в приложении с которым я работаю - никакой отдачи. Попробовал со стимом взаимодействовать, - тот же результат. Из интересного, когда загнал все в цикл который перебирает все координаты - ничего не происходит, до того, как я не помещу курсор мыши на окно стима, дальше я сам так до конца и не понял, что происходит. Когда кликает по координате, когда кликает на позицию курсора
С моими вин форм/впф окнами та же ситуация
Цитата: yuri от 02.11.2022, 08:41А если брать handle через
Process.GetProcessById(pid);?
А если брать handle через СкопированоProcess.GetProcessById(pid);?
Цитата: --- НЛО --- от 02.11.2022, 12:15через ид и беру окно, дело в чем то другом
через ид и беру окно, дело в чем то другом
Цитата: Viсtor от 02.11.2022, 14:43asda, Привет, я решал подобную задачу с помощью библиотеки FlaUI . Там в принципе всё интуитивно понятно. Пользуешься программой для просмотра визуального дерева, что бы понять по какому пути тебя кнопка интересует. Единственная важная вещь. Это то, что в этом framework есть один значимый недостаток, который в принципе в первом вопросе FAQ написан. Если тебе необходимо автоматизировать например winform и wpf одновременно(была такая задача), то взаимодействия с каким-то из них придётся в отдельный процесс выносить.
Пример моей микро- оптимизации, ныне не актуальный.
asda, Привет, я решал подобную задачу с помощью библиотеки FlaUI . Там в принципе всё интуитивно понятно. Пользуешься программой для просмотра визуального дерева, что бы понять по какому пути тебя кнопка интересует. Единственная важная вещь. Это то, что в этом framework есть один значимый недостаток, который в принципе в первом вопросе FAQ написан. Если тебе необходимо автоматизировать например winform и wpf одновременно(была такая задача), то взаимодействия с каким-то из них придётся в отдельный процесс выносить.
Пример моей микро- оптимизации, ныне не актуальный.