Форум: "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