Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 384

/ вопрос открыт /

Здравствуйте, уважаемые эксперты! Помогите разобраться! Весь инет облазил, не нашел ответа. Проблема вот в чем: есть некое приложение, мне необходимо его запустить как дочернее в своей форме. Запустить то получается, (запускаем приложение, всавляем задержку, ищем окно по заголовку, вставляем в мое окно) но перед тем как оно помещается в мою форму, его окно мелькает на экране. Можно ли как то с помощью Createprocess запустить прогу сразу в моем окне, а не потом ее привязывать?

Приложение:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var
  3. h: hWnd;
  4. wnd:HWND;
  5. begin
  6. Createprocess('Sys.exe','ipoffice_1.cfg',nil,nil,true,NORMAL_PRIORITY_CLASS ,nil,nil,si,p);;
  7. Delay (1000);
  8. h := FindWindow(nil, PChar('Sys'));
  9. if h <> 0 then
  10. begin
  11. Windows.SetParent(h, Form1.Handle);
  12. ShowWindow(h, SW_MAXIMIZE);
  13. end;
  14. Application.ProcessMessages;
  15. end;
  16.  


andreyfotograf Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: andreyfotograf (статус: Посетитель)
Вопрос отправлен: 7 июня 2011, 11:37
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 8 июня 2011, 12:16; участников в обсуждении: 2.
min@y™

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

andreyfotograf (статус: Посетитель), 7 июня 2011, 12:09 [#2]:

А можите это в коде отобразить, если не трудно :-), не особо врубаюсь...
min@y™

min@y™ (статус: Доктор наук), 7 июня 2011, 13:06 [#3]:

Цитата (andreyfotograf):

А можите это в коде отобразить, если не трудно :-), не особо врубаюсь...

Да некогда мне, работы дохрена. А чтобы это в коде изображать, придётся писать тестовую программу. Ну нафиг.
Да чё там врубаться-то? Прогу можно запускать невидимой, если присвоить wShowWindow = SW_HIDE.
Кстати, городить всё это можно и не через CreateProcess(), а через ShellExecute(). Там этот параметр передаётся прямо в функцию.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
andreyfotograf

andreyfotograf (статус: Посетитель), 7 июня 2011, 14:43 [#4]:

Присваиваю wShowWindow = SW_HIDE и через CreateProcess и через ShellExecute а она все равно видна, причем если параметр например SW_MAXIMIZE то окно распахивается, а если SW_HIDE или например SW_MINIMIZE то ничего не происходит...
andreyfotograf

andreyfotograf (статус: Посетитель), 7 июня 2011, 14:50 [#5]:

Оно как бы не реагирует на команды
andreyfotograf

andreyfotograf (статус: Посетитель), 7 июня 2011, 17:19 [#6]:

Если я правильно понял, читая форумы в инете, некоторые программы не ведуться на комманды типа SW_HIDE. Точнее если так:
var
wnd:HWND;
begin
wnd:=FindWindow(nil,'Resource Hacker');
ShowWindow(wnd,SW_HIDE);
То все прячется, но перед этим окно где-то секунду висит на экране, ведь FindWindow сразу его не находит, придотся вставлять задержку.
Неужели нет способа?
andreyfotograf

andreyfotograf (статус: Посетитель), 7 июня 2011, 17:19 [#7]:

Кстате прогу которую надо сделать дочерней Resource Hacker
andreyfotograf

andreyfotograf (статус: Посетитель), 8 июня 2011, 12:16 [#8]:

Кому интересно проблема решена. В таймер прописал
var
wnd:HWND;
begin
wnd:=FindWindow(nil,'Resource Hacker');
ShowWindow(wnd,SW_HIDE);
end;
Интервал 1
Все прога не успевает появиться.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.04 сек.