Запустить приложение и получить дескриптор окна

Тема в разделе "Delphi - FAQ", создана пользователем Vadik(R), 30 мар 2008.

  1. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Здраствуйте, уважаемые форумчане!
    Мне требуется запустить из своей программы ещё какую-то программу и получить дескриптор её окна. Только не пойму как сделать. Вот, что пытался:
    Код (Text):
    procedure TForm1.Timer1Timer(Sender: TObject);
    Var
    H : HWND;
    begin
    H:=ShellExecute(Handle, PChar('open'), PChar('http://www.yandex.ru/'), Nil, Nil, SW_SHOWNORMAL);
    DestroyWindow(H);
    end;
    И так пробовал:
    Код (Text):
    procedure TForm1.Timer1Timer(Sender: TObject);
    Var
    H : HWND;
    begin
    H:=WinExec('explorer.exe http://www.yandex.ru/', SW_SHOWNORMAL);
    DestroyWindow(H);
    end;
    Дестрой я делал для того, что бы узнать правильно ли я получил дескриптор или нет. Как оказалось - нет, так как IE с Яндексом не закрывается.
    Знаю, что ещё есть функция CreateProcess, но с ней ни разу не работал, там слишком много параметров.
    В общем, вопрос всё тот же: как запустить программу и получить дескриптор её окна?
     
  2. Silver Wind

    Silver Wind Гость

    И ShellExecute, и WinExec возвращают код ошибки (расшифровку смотри в help`е) или 0, если все в порядке, но никак не дескриптор окна. Более того запущенная программа может вообще не иметь окна.
    Вот с ней как раз таки советую разобраться на будущее, примеров хватает, все равно ShellExecute и WinExec сводятся к ее вызову. А дополнительные параметры еще пригодятся :(

    Т.о. запускайте программу любым из перечисленных способов. А вот для поиска окна воспользуйтесь FindWindow.
    Для закрытия приложения найденному окну можно послать сообщение WM_CLOSE.

    Еще вариант - воспользоваться всетаки CreateProcess для создания процесса, а для завершения TerminateProcess.
     
  3. zubr

    zubr Гость

    Если хендл нужен для закрытия окна, то действительно лучше воспользоваться TerminateProcess, запуская программу с помощью CreateProcess. А если все таки нужен хендл окна (для других целей), то вот тебе вариант:
    Код (Text):
    unit New;

    interface

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

    type
    TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    var
    SearchHandle:HWND;

    function EnumProc(h:HWND; lParam:DWord):boolean; stdcall;
    var
    ProcessId, z:cardinal;
    begin
    Result:=True;
    GetWindowThreadProcessId(h, ProcessId);
    If ProcessId=lParam then
    begin
    SearchHandle:=h;
    Result:=False;
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    si:STARTUPINFO;
    pi:PROCESS_INFORMATION;
    buf:array[1..100] of char;
    begin
    ZeroMemory(@si, sizeof(si));
    si.cb:=SizeOf(si);
    CreateProcess(nil, 'Путь к экзешнику\MyExe.exe', nil, nil, false,
    0, nil, nil, si, pi);
    SearchHandle:=0;
    While SearchHandle=0 do
    begin
    EnumWindows(@EnumProc, pi.dwProcessId);
    Application.ProcessMessages;
    end;
    SendMessage(SearchHandle, WM_CLOSE, 0, 0);
    end;

    end.
    Сообщение WM_CLOSE, также как и WM_DESTROY будет работать не с любой программой. Так что для проверки лучше сделай свою программку.
     
  4. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Спасибо, попробую разобраться!
     
  5. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    CreateProcess - конечно, обалденная вещь, но вот пока не пойму:
    Код (Text):
    ...
    si.cb:=SizeOf(si);
    si.wShowWindow:=SW_HIDE;
    si.cb:=SizeOf(si);
    CreateProcess(nil, 'MyExe.exe', nil, nil, false, 0, nil, nil, si, pi);
    ...
    Почему приложение всё равно запускается не в скрытом режиме?
    P. S. Хотелось бы узнать, как запускать приложения в другом оконном режиме, но только с использованием CreateProcess, то есть без ShellExecute и WinExec.
     
  6. zubr

    zubr Гость

     
Загрузка...
Похожие Темы - Запустить приложение получить
  1. cyber23
    Ответов:
    3
    Просмотров:
    91
  2. Dragon108
    Ответов:
    5
    Просмотров:
    744
  3. Sanchezz86
    Ответов:
    12
    Просмотров:
    1.114
  4. Amfion
    Ответов:
    20
    Просмотров:
    1.101
  5. Sibiria
    Ответов:
    4
    Просмотров:
    1.429

Поделиться этой страницей