Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2017, 18:00   #1
GamerOld
 
Регистрация: 24.09.2017
Сообщений: 4
Вопрос Нажатие кнопки в другой программе

Здравствуйте!

Имеется эмулятор приставки PS2 - PCSX2

http://fastpic.ru/view/93/2017/0923/...37d64.png.html

Написал лаунчер, содержащий авто запуск игры

http://fastpic.ru/view/91/2017/0923/...d785c.png.html

Требуется: автоматизировать вызов настроек - при клике на кнопку "Controller" (в скрипте это btn3Click) запускался эмулятор и автоматически открывал окно с настройками управления (плагина)

http://fastpic.ru/view/89/2017/0923/...a9ca8.png.html
http://fastpic.ru/view/91/2017/0923/...19834.png.html

Проблема заключается в реализации перехода во второе подменю "Controllers (PAD)" и, соответственно, нажатия там нужной кнопки "Plugin Settings...".
Нажатие кнопки получается выполнить только в тех строках, где нет "второго подменю со стрелкой >".

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ShellAPI;

type
  TForm1 = class(TForm)
    img1: TImage;
    btn1: TBitBtn;
    btn2: TBitBtn;
    btn3: TBitBtn;
    btn4: TBitBtn;
    procedure btn1Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
form1.Close;
end;

procedure TForm1.btn4Click(Sender: TObject);
begin
form1.Close;
ShellExecute(Application.Handle,PChar('open'),PChar('Start Game.exe'),nil,nil,SW_SHOW)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or CS_NOCLOSE);
end;

procedure TForm1.btn3Click(Sender: TObject);
Var
Men      :HMenu;
Hnd      :HWnd;
HndMen,HndSMen                          :HMenu;
IdBtn,idMen                             :integer;
begin
  Hnd:=FindWindow(nil, 'PCSX2 Burnout 3: Takedown');
  if Hnd <>0 then begin
    windows.SetForegroundWindow(Hnd);
    HndMen:=GetMenu(Hnd);
    HndSMen:=GetSubMenu(HndMen,2);
    idMen:=GetMenuItemID(HndSMen,6);
    if idMen<>0 then begin
      PostMessage(Hnd,WM_COMMAND,idMen,0);
end;
end;
end;

end.
GamerOld вне форума Ответить с цитированием
Старый 25.09.2017, 13:33   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

А что мешает вызвать GetSubMenu два раза?
Код:
    HndMen:=GetMenu(Hnd);
    HndSMen:=GetSubMenu(HndMen,2);
    HndSMen:=GetSubMenu(HndSMen,1);
    idMen:=GetMenuItemID(HndSMen,1);
А вообще-то, если чужой .exe всегда один и тот же, то нужную команду можно раз и навсегда посмотреть в любом редакторе ресурсов
Black Fregat вне форума Ответить с цитированием
Старый 25.09.2017, 20:14   #3
GamerOld
 
Регистрация: 24.09.2017
Сообщений: 4
По умолчанию

Black Fregat, Большое Вам Спасибо это работает!

В моём случае получились такие значения (может кому пригодится):
Код:
 
HndMen:=GetMenu(Hnd);
HndSMen:=GetSubMenu(HndMen,2);
HndSMen:=GetSubMenu(HndSMen,6);
idMen:=GetMenuItemID(HndSMen,2);
Остался "последний штрих" - такой вопрос:
Понятно, что данный код работает, если окно эмулятора заранее открыто.

При запуске лаунчера эмулятор пока ещё не должен быть запущен.
Требуется: при клике на кнопку "Controller" сначала запустить эмулятор (exe-файл), а затем уже выполнить автоматическое открытие окна плагина.

Последний раз редактировалось GamerOld; 26.09.2017 в 13:16.
GamerOld вне форума Ответить с цитированием
Старый 16.10.2017, 16:23   #4
GamerOld
 
Регистрация: 24.09.2017
Сообщений: 4
По умолчанию

Цитата:
При клике на кнопку "Controller" сначала запустить эмулятор (exe-файл), а затем уже выполнить автоматическое открытие окна плагина.
Решение:

Код:
if ShellExecute(Application.Handle,PChar('open'),PChar('programpath\Start2.exe'),nil,nil,SW_SHOW) > 32 then begin
sleep(1000);
GamerOld вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нажатие кнопок в другой программе Aleksander550 Win Api 8 04.11.2014 20:15
нажатие кнопки megostudent Общие вопросы Delphi 9 26.09.2011 11:11
нажатие кнопки в другой программе Pein95 Общие вопросы C/C++ 6 20.06.2011 22:56
На нажатие кнопки access6472043 Microsoft Office Access 2 29.11.2009 15:08
нажатие кнопки xakkkkker Работа с сетью в Delphi 1 20.11.2008 01:08