Главная страница
    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.013 c
2-1135601337
oleggar
2005-12-26 15:48
2006.01.15
hooks


2-1135245919
Вт
2005-12-22 13:05
2006.01.15
Как установить в заданную позицию DBGrid


14-1135018408
Санёк
2005-12-19 21:53
2006.01.15
Visual C++ 2005 Express Edition


14-1135258909
Sergey13
2005-12-22 16:41
2006.01.15
"Забавные" цены


3-1132304599
Ярослав
2005-11-18 12:03
2006.01.15
Как в SQL уменьшить/увеличить время на 1 час





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский