Грамотное сокрытие окна

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Snake Plissken, 30 Jan 2010.

  1. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    В догонку к моим топовым вопросам.
    Какой наиболее оптимальный способ скрыть окно программы, запущенной через CreateProcess().

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

    Code:
      STARTUPINFO si;  
    si.dwFlags = STARTF_USESHOWWINDOW;  si.wShowWindow = SW_HIDE;
    
    как я понял софтинка игнорирует. Как поступить в таком случае? Насколько я понял можно еще попытаться найти хэндл окошка и попробовать его насильно спрятать, но тогда программа некоторое время все еще будет светить свое окно, а это форменный непохек. Подскажите, кто занимался и решение нашел :)
     
  2. RDL_Rider

    RDL_Rider New Member

    Joined:
    21 Jun 2009
    Messages:
    100
    Likes Received:
    3
    Reputations:
    0
    может лучше через WinExec("App Name", SW_HIDE) ?
    ну а если настаиваешь на
    Code:
    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  );
    
    то присмотрись к структуре
    Code:
    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:
    то есть если в запускаемой проге функция ShowWindow вызывается более одного раза с ShowCmd != SW_SHOWDEFAULT, то нифига не сработает. Проверь прогу, которую запускаешь.
     
    #2 RDL_Rider, 30 Jan 2010
    Last edited: 30 Jan 2010
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Темболее можно через DWORD dwX; DWORD dwY; задать положения окна за пределами экрана, чтобы его по любому не видно было
     
  4. RDL_Rider

    RDL_Rider New Member

    Joined:
    21 Jun 2009
    Messages:
    100
    Likes Received:
    3
    Reputations:
    0
    В таскбаре будет видно :(
     
  5. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    С WinExec точно такой же эффект.
    А с СreateProcess() указываю si.dwFlags = STARTF_USEPOSITION и кручу значения si.dwX и si.dwY но на поведение программы это никак не влияет. Может какие-то моменты не учтены?
     
    #5 Snake Plissken, 30 Jan 2010
    Last edited: 30 Jan 2010
  6. RDL_Rider

    RDL_Rider New Member

    Joined:
    21 Jun 2009
    Messages:
    100
    Likes Received:
    3
    Reputations:
    0
    а что за прогу, если не секрет, ты пытаешься запустить ?
    Может, у проги дочерние окна?
     
  7. t04

    t04 Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    137
    Likes Received:
    40
    Reputations:
    8
    а не проще ли сделать так:
    Code:
    ShowWindow(hWnd,SW_HIDE);
     
  8. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    RDL_Rider
    Multi Password Recovery

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

    xafon New Member

    Joined:
    2 Dec 2009
    Messages:
    38
    Likes Received:
    4
    Reputations:
    0
    если знаешь классс окна то можешь воспользоватся этим:
    Code:
    ShowWindow(FindWindow('OpWindow',nil), SW_HIDE);
    один из вариантов:
    Code:
    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 почитай еще вот тут (есть пример на делфи).
     
    #9 xafon, 31 Jan 2010
    Last edited: 31 Jan 2010
  10. RDL_Rider

    RDL_Rider New Member

    Joined:
    21 Jun 2009
    Messages:
    100
    Likes Received:
    3
    Reputations:
    0
    Эмм..а почему бы банально не пропатчить MPR ?
     
  11. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    xafon
    Тестил на мпр, эффекта ноль.

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