Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Грамотное сокрытие окна (https://forum.antichat.xyz/showthread.php?t=174733)

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

Цитата:

Сообщение от slesh
Темболее можно через 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

Цитата:

Сообщение от Snake Plissken
С 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 почитай еще вот тут (есть пример на делфи).

RDL_Rider 31.01.2010 14:05

Эмм..а почему бы банально не пропатчить MPR ?


Время: 19:36