1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

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

  1. Vadik(R)

    Vadik(R) Well-Known Member

    Репутация:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    469
    Симпатии:
    0
    Здраствуйте, уважаемые форумчане!
    Мне требуется запустить из своей программы ещё какую-то программу и получить дескриптор её окна. Только не пойму как сделать. Вот, что пытался:
    Код:
    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;
    И так пробовал:
    Код:
    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 Гость

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

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

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

    zubr Гость

    Репутация:
    0
    Если хендл нужен для закрытия окна, то действительно лучше воспользоваться TerminateProcess, запуская программу с помощью CreateProcess. А если все таки нужен хендл окна (для других целей), то вот тебе вариант:
    Код:
    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

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

    Vadik(R) Well-Known Member

    Репутация:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    469
    Симпатии:
    0
    CreateProcess - конечно, обалденная вещь, но вот пока не пойму:
    Код:
    ...
    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 Гость

    Репутация:
    0
     
Загрузка...

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