Вы должны войти, чтобы создавать сообщения и темы.

Взаимодействие со сторонним приложением

Здравствуйте, необходимо  нажать на кнопку запуска в стороннем приложении на виндовс, мне известен его pid. 

Пробовал через винапи, не получилось реализовать. На уму только 1 реализация через клики по координатам, но это не эффективно

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

 

var proc = Process.GetProcessById(10676);
          Console.WriteLine(proc.MainWindowTitle);
          var hand = proc.MainWindowHandle;
          SetForegroundWindow(hand);

 

 

Привет, ну, Я бы отправил комбинацию клавиш, если кнопка поддерживает хоткей, либо, по 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 не эффективно, то можно выставить Свой размер окна (если приложение поддерживает такое), либо шаманить над положением кнопки, в зависимости от размера окна

Если нужно отправить клавишу, то вот, но надо чтобы приложение было активным окном

Лайкнул Удаленный пользователь
Удаленный пользователь

какова вероятность, что код не отработает при высокой нагрузке системы?  например цп будет биться в 100% и я запущу дополнительно 30 окон на которых вызову клик по координате, высока вероятность того, что где то код не отработает как надо

Помню, что sendkeys падал (пропускал клавиши), а вот клики не проверял с такой дикой нагрузкой

Лайкнул Удаленный пользователь
Удаленный пользователь

Скопировано

IntPtr CreatePos(int LoWord, int HiWord) => (IntPtr)((HiWord << 16) | (LoWord & 0xffff));

Скопировано

обьясните этот код пожалуйста

Я не вдавался в подробности,лишь знаю,что этот метод задаёт данные x y для курсора внутри приложения. Если хочешь подробнее узнать об этом, глянь тут

Лайкнул Удаленный пользователь
Удаленный пользователь

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

С моими вин форм/впф окнами та же ситуация

А если брать handle через СкопированоProcess.GetProcessById(pid);?

через ид и беру окно, дело в чем то другом

asda, Привет, я решал подобную задачу с помощью  библиотеки FlaUI . Там в принципе всё интуитивно понятно. Пользуешься программой для просмотра визуального дерева, что бы понять по какому пути тебя кнопка интересует. Единственная важная вещь. Это то, что в этом framework есть один значимый недостаток, который в принципе в первом вопросе FAQ написан. Если тебе необходимо автоматизировать например winform и wpf одновременно(была такая задача), то взаимодействия с каким-то из них придётся в отдельный процесс выносить.

Пример моей микро- оптимизации, ныне не актуальный.