Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.014 c
3-1132298547
syte_ser78
2005-11-18 10:22
2006.01.15
доступ к результату запроса


2-1135358567
Gorger
2005-12-23 20:22
2006.01.15
Что такое OEM?


2-1135592947
john_mag
2005-12-26 13:29
2006.01.15
DateTimePicker


1-1134062536
Andy BitOff
2005-12-08 20:22
2006.01.15
Отображение MessageBox поверх всех окон.


6-1127837051
maVladimir
2005-09-27 20:04
2006.01.15
Многопоточная закачка файлов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский