PDA

Просмотр полной версии : Грамотное сокрытие окна


Snake Plissken
30.01.2010, 16:05
В догонку к моим топовым вопросам.
Какой наиболее оптимальный способ скрыть окно программы, запущенной через CreateProcess().

Эти параметры:

STARTUPINFO si;
si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE;


как я понял софтинка игнорирует. Как поступить в таком случае? Насколько я понял можно еще попытаться найти хэндл окошка и попробовать его насильно спрятать, но тогда программа некоторое время все еще будет светить свое окно, а это форменный непохек. Подскажите, кто занимался и решение нашел :)

RDL_Rider
30.01.2010, 17:16
может лучше через WinExec("App Name", SW_HIDE) ?
ну а если настаиваешь на
BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTESlpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation );

то присмотрись к структуре
typedef struct _STARTUPINFO {
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 :cool:
wShowWindow If dwFlags specifies STARTF_USESHOWWINDOW, this member can be any of the values that can be specified in the nCmdShow parameter for the ShowWindow function, except for SW_SHOWDEFAULT. Otherwise, this member is ignored. For GUI processes, the first time ShowWindow is called, its nCmdShow parameter is ignored wShowWindow specifies the default value. In subsequent calls to ShowWindow, the wShowWindow member is used if the nCmdShow parameter of ShowWindow is set to SW_SHOWDEFAULT.
то есть если в запускаемой проге функция ShowWindow вызывается более одного раза с ShowCmd != SW_SHOWDEFAULT, то нифига не сработает. Проверь прогу, которую запускаешь.

slesh
30.01.2010, 18:13
Темболее можно через DWORD dwX; DWORD dwY; задать положения окна за пределами экрана, чтобы его по любому не видно было

RDL_Rider
30.01.2010, 21:15
Темболее можно через DWORD dwX; DWORD dwY; задать положения окна за пределами экрана, чтобы его по любому не видно было
В таскбаре будет видно :(

Snake Plissken
30.01.2010, 21:23
С WinExec точно такой же эффект.
А с СreateProcess() указываю si.dwFlags = STARTF_USEPOSITION и кручу значения si.dwX и si.dwY но на поведение программы это никак не влияет. Может какие-то моменты не учтены?

RDL_Rider
31.01.2010, 01:36
С WinExec точно такой же эффект.
А с СreateProcess() указываю si.dwFlags = STARTF_USEPOSITION и кручу значения si.dwX и si.dwY но на поведение программы это никак не влияет. Может какие-то моменты не учтены?
а что за прогу, если не секрет, ты пытаешься запустить ?
Может, у проги дочерние окна?

t04
31.01.2010, 03:04
а не проще ли сделать так:
ShowWindow(hWnd,SW_HIDE);

Snake Plissken
31.01.2010, 10:14
RDL_Rider
Multi Password Recovery

t04
Для этого нужно найти хэндл окна, тоесть пока он будет искаться софтина будет видна.

xafon
31.01.2010, 11:10
если знаешь классс окна то можешь воспользоватся этим:
ShowWindow(FindWindow('OpWindow',nil), SW_HIDE);

один из вариантов:
function OpWnd(Handle:HWND;ShowCmd:integer):bool;stdcall;
var s:ANSIstring;
begin
SetLength(s,100);
GetClassNameA(Handle,PANSIChar(s),100);
SetLength(s, lStrLen(PANSIChar(s)));
if s='OpWindow' then ShowWindow(Handle,ShowCmd);
result:=true;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
EnumWindows(@OpWnd,SW_HIDE);//второй параметр это для функции ShowWindow то есть что мы сделаем с окнами оперы.(покажем SW_Show, скроем SW_HIDE)
end;

это пример со скрытием окна оперы, OpWindow это класс окна оперы.

p.s почитай еще вот тут (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1167&mode=print) (есть пример на делфи).

RDL_Rider
31.01.2010, 14:05
Эмм..а почему бы банально не пропатчить MPR ?

Snake Plissken
31.01.2010, 17:12
xafon
Тестил на мпр, эффекта ноль.

RDL_Rider
Наверно попробую, но интересно было бы знать как сокрытие произвести без подобного бит хакинга.