Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.15;
Скачать: CL | DM;

Вниз

Найти окно из процесса   Найти похожие ветки 

 
Pasha L ©   (2005-11-03 23:58) [0]

Зравствуйте, люди. Такая задача: я хочу скрыть окно запущенного мною процесса. Для этого использую EnumThreadWindows. Только что то EnumThreadWindows не делает того, что я хочу. Скажите, что в этом коде неправильно.
program Project2;
{$APPTYPE CONSOLE}
uses
 SysUtils,
 Windows;
var
 idp,  //переменная для записи id процессов
 ht, //переменная для записи hthread
 hp,  //переменная для записи hprocess
 hw  //переменная для записи полученного хендла
 :cardinal;
// процедура запуска процесса и записи его данных
procedure docommand(aname:string);
var
 procinfo:TProcessInformation;
 startinfo:TStartupInfo;
begin
 fillchar(startinfo,sizeof(startinfo),0);
 startinfo.cb:=SizeOf(startinfo);
 createprocess(pchar(aname),nil,nil,nil,bool(true),CREATE_NEW_CONSOLE,nil,nil,startinfo,procinfo);
 hp:=procinfo.hProcess;
 ht:=procinfo.hThread;
 idp:=procinfo.dwProcessId;
end;
// процедура - колбэк
function EnumThreadWndProc(aHW: THandle; aParam: Longint): bool; cdecl;
begin
 HW := aHW;
 Result := false;
end;
begin
 docommand("prog1.exe");
 WaitForInputIdle(hp,INFINITE);
 EnumThreadWindows(idp, @EnumThreadWndProc, 0);
 closehandle(hp);
 closehandle(ht);
 showwindow(hw,SW_HIDE);
end.


 
Eraser ©   (2005-11-04 00:57) [1]


> Pasha L ©   (03.11.05 23:58)


>  EnumThreadWindows(idp, @EnumThreadWndProc, 0);

Читай спраку. To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.


 
Fay ©   (2005-11-04 06:03) [2]

2 Pasha L ©   (03.11.05 23:58)

Перенеси ShowWindow в EnumThreadWndProc


 
Pasha L ©   (2005-11-04 14:57) [3]

Дело в том, что переменная hw остается 0. Я ещё ставил на EnumThreadWndProc writeln(hw), и ничего не писалось. Следовательно EnumThreadWndProc вообще не вызывается. И result:=true тоже писал. Не помогло


 
Fay ©   (2005-11-04 18:19) [4]

2 Pasha L ©   (04.11.05 14:57) [3]

А виндо там ваще есть?


 
Pasha L ©   (2005-11-04 19:36) [5]

виндо есть


 
Fay ©   (2005-11-04 20:20) [6]

Так работает...
function EnumThreadWndProc(aHW : THandle; aParam : Longint) : bool; cdecl;
begin
 Result := 0 <> SendMessage(aHW, WM_SETTEXT, 0, LParam(PChar("Пашет")));
end;

procedure TForm1.Button1Click(Sender : TObject);
var
 pi : TProcessInformation;
 si : TStartupInfo;
begin
 FillChar(si, SizeOf(si), 0);
 si.cb := SizeOf(si);
 if not CreateProcess(nil, "notepad.exe", nil, nil, False, 0, nil, nil, si, pi) then
   RaiseLastOSError;
 WaitForInputIdle(pi.hProcess, INFINITE);
 EnumThreadWindows(pi.dwThreadId, @EnumThreadWndProc, 0);
 CloseHandle(pi.hThread);
 CloseHandle(pi.hProcess);
end;


 
Pasha L ©   (2005-11-04 20:48) [7]

Спасибо!


 
pasha L ©   (2005-11-04 21:00) [8]

А как быть с консольным приложением? Как получить хендл окна консольного приложения? EnumThreadWindows не действует


 
Fay ©   (2005-11-05 04:01) [9]

2 pasha L ©   (04.11.05 21:00) [8]
Я чё-то не понял. Какие окна в консольном приложении?


 
Pasha L ©   (2005-11-05 12:46) [10]

я запускаю консольное приложение. как мне сослаться на то окно, котором это приложение запущено


 
Fay ©   (2005-11-05 13:47) [11]

2 Pasha L ©   (05.11.05 12:46) [10]

Если тебе нужно скрыть запуск, потрогай STARTUPINFO.
Я не помню, даст ли это результат, но можно ведь проверить 8)

P.S.
Чё-то отцы молчат...


 
Pasha L ©   (2005-11-05 16:39) [12]

Нет, скрывать мне ничего не нужно. Дело в том, что я запускаю одно приложение, а потом другое. Второе запускаятся и ставит своё окно поверх окна первого. И мне нужно, чтоб окно первого после этих двух запусков стало поверх второго.


 
Zeqfreed ©   (2005-11-05 17:13) [13]

Pasha L ©   (05.11.05 16:39) [12]
function ActivateCurrentConsoleWindow() : Boolean;
var
title : array[0..MAX_PATH] of Char;
l : Cardinal;
cw : HWND;
begin
l := GetConsoleTitle(title, MAX_PATH);
title[l + 1] := #0;
cw := FindWindow("ConsoleWindowClass", title);

Result := (cw <> 0) and (SetForegroundWindow(cw) <> FALSE);
end;


 
Pasha L ©   (2005-11-05 17:41) [14]

Zeqfreed ©   (05.11.05 17:13) [13]
Дело в том, что для того, чтобы найти окно вашим методом я должен знать его title. В вашем методе я узнаю title окна процесса из которого же и вызываю ActivateCurrentConsoleWindow. А я должен вызывать эту функцию для нахождения окна другого приложения.


 
Zeqfreed ©   (2005-11-05 17:55) [15]

Pasha L ©   (05.11.05 17:41) [14]
Из [12]:

> И мне нужно, чтоб окно первого после этих двух
> запусков стало поверх второго.

После запуска доп. консольных приложений из кода основного вызываешь ActivateCurrentConsoleWindow и получаешь то, что надо.

Если же надо активировать окно из дополнительных приложений, то можно передать заголовок (или дескриптор) через механизм отображения файлов в память, например.


 
Zeqfreed ©   (2005-11-05 17:56) [16]

Zeqfreed ©   (05.11.05 17:55) [15]
Хм, или просто параметром во время запуска, что несказанно проще :)


 
Pasha L ©   (2005-11-06 00:20) [17]

Zeqfreed ©   (05.11.05 17:55) [15]
Да говорю же, что это не то что нужно. Я узнаю титл окна того же процесса, откуда вызываю ActivateCurrentConsoleWindow. И от него узнаю хендл этого окна. А мне этого совсем не нужно.


 
Pasha L ©   (2005-11-07 15:58) [18]

Удалено модератором
Примечание: Создание пустых сообщений



Страницы: 1 вся ветка

Текущий архив: 2006.01.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.041 c
2-1135504189
bobbyDigital
2005-12-25 12:49
2006.01.15
Яркость контрастность


14-1134759817
keymaster
2005-12-16 22:03
2006.01.15
Логические выражения


14-1135026250
Bot
2005-12-20 00:04
2006.01.15
Программа для подмены драйвера минипорта


14-1135233175
begin...end
2005-12-22 09:32
2006.01.15
С Днём рождения! 22 декабря


2-1135494885
LexxX
2005-12-25 10:14
2006.01.15
Получение сообщения об ошибке