|
Вопрос # 5 384/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты! Помогите разобраться! Весь инет облазил, не нашел ответа. Проблема вот в чем: есть некое приложение, мне необходимо его запустить как дочернее в своей форме. Запустить то получается, (запускаем приложение, всавляем задержку, ищем окно по заголовку, вставляем в мое окно) но перед тем как оно помещается в мою форму, его окно мелькает на экране. Можно ли как то с помощью Createprocess запустить прогу сразу в моем окне, а не потом ее привязывать?
Приложение: Переключить в обычный режим- procedure TForm1.FormCreate(Sender: TObject);
- var
- h: hWnd;
- wnd:HWND;
- begin
- Createprocess('Sys.exe','ipoffice_1.cfg',nil,nil,true,NORMAL_PRIORITY_CLASS ,nil,nil,si,p);;
- Delay (1000);
- h := FindWindow(nil, PChar('Sys'));
- if h <> 0 then
- begin
- Windows.SetParent(h, Form1.Handle);
- ShowWindow(h, SW_MAXIMIZE);
- end;
- Application.ProcessMessages;
- end;
-
 |
Вопрос задал: andreyfotograf (статус: Посетитель)
Вопрос отправлен: 7 июня 2011, 11:37
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 8; последнее сообщение — 8 июня 2011, 12:16; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 7 июня 2011, 11:47 [#1]:
В функцию CreateProcess() передаётся структура типа STARTUPINFO. Вот такая:
typedef struct _STARTUPINFO { // si
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
В этой структуре есть поле wShowWindow. Вот что пишет SDK:
Цитата:
wShowWindow
Ignored unless dwFlags specifies STARTF_USESHOWWINDOW. The wshowWindow member can be any of the SW_ constants defined in WINUSER.H. 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.
Делай выводы.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
andreyfotograf (статус: Посетитель), 7 июня 2011, 12:09 [#2]:
А можите это в коде отобразить, если не трудно , не особо врубаюсь...
|
|
min@y™ (статус: Доктор наук), 7 июня 2011, 13:06 [#3]:
Цитата (andreyfotograf):
А можите это в коде отобразить, если не трудно  , не особо врубаюсь...
Да некогда мне, работы дохрена. А чтобы это в коде изображать, придётся писать тестовую программу. Ну нафиг.
Да чё там врубаться-то? Прогу можно запускать невидимой, если присвоить wShowWindow = SW_HIDE.
Кстати, городить всё это можно и не через CreateProcess(), а через ShellExecute(). Там этот параметр передаётся прямо в функцию.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
andreyfotograf (статус: Посетитель), 7 июня 2011, 14:43 [#4]:
Присваиваю wShowWindow = SW_HIDE и через CreateProcess и через ShellExecute а она все равно видна, причем если параметр например SW_MAXIMIZE то окно распахивается, а если SW_HIDE или например SW_MINIMIZE то ничего не происходит...
|
|
andreyfotograf (статус: Посетитель), 7 июня 2011, 14:50 [#5]:
Оно как бы не реагирует на команды
|
|
andreyfotograf (статус: Посетитель), 7 июня 2011, 17:19 [#6]:
Если я правильно понял, читая форумы в инете, некоторые программы не ведуться на комманды типа SW_HIDE. Точнее если так:
var
wnd:HWND;
begin
wnd:=FindWindow(nil,'Resource Hacker');
ShowWindow(wnd,SW_HIDE);
То все прячется, но перед этим окно где-то секунду висит на экране, ведь FindWindow сразу его не находит, придотся вставлять задержку.
Неужели нет способа?
|
|
andreyfotograf (статус: Посетитель), 7 июня 2011, 17:19 [#7]:
Кстате прогу которую надо сделать дочерней Resource Hacker
|
|
andreyfotograf (статус: Посетитель), 8 июня 2011, 12:16 [#8]:
Кому интересно проблема решена. В таймер прописал
var
wnd:HWND;
begin
wnd:=FindWindow(nil,'Resource Hacker');
ShowWindow(wnd,SW_HIDE);
end;
Интервал 1
Все прога не успевает появиться.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|