Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Запустить приложение и получить дескриптор окна
Vadik(R)
Вставить ник
сообщение 30:03:2008, 17:32
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 122
Регистрация: 12:12:2007
Из: Волгоград
Пользователь №: 14 203
Специализация: Программист, знаю HTML, JS, CSS, Паскаль.



Репутация: - 2 +


Здраствуйте, уважаемые форумчане!
Мне требуется запустить из своей программы ещё какую-то программу и получить дескриптор её окна. Только не пойму как сделать. Вот, что пытался:
Код
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, но с ней ни разу не работал, там слишком много параметров.
В общем, вопрос всё тот же: как запустить программу и получить дескриптор её окна?

Сообщение отредактировал Vadik(R) - 30:03:2008, 17:36
Подняться вверх 
 
Сообщение #1
 
Новая тема 
Ответов (1 - 5)
Silver Wind
Вставить ник
сообщение 31:03:2008, 10:59
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 99
Регистрация: 30:07:2007
Из: Витебск
Пользователь №: 12 080
Специализация: программист



Репутация: - 6 +


И ShellExecute, и WinExec возвращают код ошибки (расшифровку смотри в help`е) или 0, если все в порядке, но никак не дескриптор окна. Более того запущенная программа может вообще не иметь окна.
Цитата(Vadik(R) @ 30:03:2008 - 20:32) *
Знаю, что ещё есть функция CreateProcess, но с ней ни разу не работал, там слишком много параметров.

Вот с ней как раз таки советую разобраться на будущее, примеров хватает, все равно ShellExecute и WinExec сводятся к ее вызову. А дополнительные параметры еще пригодятся smile.gif

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

Еще вариант - воспользоваться всетаки CreateProcess для создания процесса, а для завершения TerminateProcess.
Подняться вверх 
 
Сообщение #2
zubr
Вставить ник
сообщение 31:03:2008, 14:51
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 899
Регистрация: 19:11:2003
Пользователь №: 133



Репутация: - 11 +


Если хендл нужен для закрытия окна, то действительно лучше воспользоваться 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 будет работать не с любой программой. Так что для проверки лучше сделай свою программку.
Подняться вверх 
 
Сообщение #3
Vadik(R)
Вставить ник
сообщение 31:03:2008, 16:54
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 122
Регистрация: 12:12:2007
Из: Волгоград
Пользователь №: 14 203
Специализация: Программист, знаю HTML, JS, CSS, Паскаль.



Репутация: - 2 +


Спасибо, попробую разобраться!
Подняться вверх 
 
Сообщение #4
Vadik(R)
Вставить ник
сообщение 1:04:2008, 13:14
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 122
Регистрация: 12:12:2007
Из: Волгоград
Пользователь №: 14 203
Специализация: Программист, знаю HTML, JS, CSS, Паскаль.



Репутация: - 2 +


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.
Подняться вверх 
 
Сообщение #5
zubr
Вставить ник
сообщение 1:04:2008, 17:14
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 899
Регистрация: 19:11:2003
Пользователь №: 133



Репутация: - 11 +


Цитата
wShowWindow
If dwFlags specifies STARTF_USESHOWWINDOW, this member can be any of the SW_ constants defined in Winuser.h. Otherwise, this member is ignored.
For GUI processes, wShowWindow specifies the default value the first time ShowWindow is called. The nCmdShow parameter of ShowWindow is ignored. In subsequent calls to ShowWindow, the wShowWindow member is used if the nCmdShow parameter of ShowWindow is set to SW_SHOWDEFAULT.
Подняться вверх 
 
Сообщение #6


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись
   

 

RSS Текстовая версия Сейчас: 17:05:2008 - 10:19
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net