программно свернуть чужую программу

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Student :), 17 Jul 2010.

  1. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    Привет всем!!! как программно свернуть чужую программу (название окна нет :( )
    такой код не подходит

    Showwindow(findwindow(nil,'ОКНО'),sw_hide);

    может как то по имени процесса? есле можно дайте код , Спасибо заранее!!!
     
  2. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А зачем ты окно прячешь?? Тебе же надо свернуть. - SW_MINIMIZE
    Если окно не удается найти окно то получи список всех окон. которые есть в системе через EnumWindows а затем через GetWindowThreadProcessId определи к какому приложению относятся найденный окна. Таким образом сможешь найти все окна которые есть у нужного приложения.

    P.S. на окна UAC в Vista и W7 такое работать не будет потому что к ним вообще запрещен любой доступ (и посылка нажатия клавиши, и команды мыши и команды управления окном и эмуляция ввода) на них вообще ничего не действует. Или ошибку даёт или отказано в доступе
     
  3. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    спасибо, но названия окна нет
     
  4. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    есть только имя класса HwndWrapper(proga.exe;;bkgdfg-434ff-wefweff3rr23rytryrty)
     
  5. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А по твоему первый параметр FindWindow за что отвечает?
     
  6. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    slesh я понимаю что такой функцией не возможно свернуть окно (findwindow), может ка то при помощи cooltray ,
     
  7. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Student :), при помощи FindWindow ты можешь найти нужное тебе окно за именем класса. А выше ты что то ошибочное или не особо внятное сказал (в частности про cooltray).
     
  8. Greedz

    Greedz New Member

    Joined:
    1 Aug 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Student :), а можно уточнить, что за программа?
    я бы сделал так, при условии, что нам известно имя процесса:
    Code:
    [color=magenta][i]#include[/i][/color] [color=gray]<Process.au3>[/color]
    
    [color=brown]$sProcessName[/color] [color=red]=[/color] [color=gray]"notepad.exe"[/color] [color=green][i]; в этой переменной имя вашего процесса[/i][/color]
    [color=brown]$all_windows[/color] [color=red]=[/color] [color=darkblue][i]WinList[/i][/color][color=red]()[/color][color=green][i]; собираем в массив все окна[/i][/color]
    [color=blue]For[/color] [color=brown]$i[/color] [color=red]=[/color] [color=darkmagenta][i]1[/i][/color] [color=blue]to[/color] [color=brown]$all_windows[/color][color=red][[/color][color=darkmagenta][i]0[/i][/color][color=red]][[/color][color=darkmagenta][i]0[/i][/color][color=red]][/color][color=green][i]; перебираем все окна в цикле и проверяем только видимые[/i][/color]
        [color=blue]If[/color] IsVisible[color=red]([/color][color=brown]$all_windows[/color][color=red][[/color][color=brown]$i[/color][color=red]][[/color][color=darkmagenta][i]1[/i][/color][color=red]])[/color] [color=blue]Then[/color]
            [color=brown]$winPid[/color] [color=red]=[/color] [color=darkblue][i]WinGetProcess[/i][/color] [color=red]([/color][color=brown]$all_windows[/color][color=red][[/color][color=brown]$i[/color][color=red]][[/color][color=darkmagenta][i]1[/i][/color][color=red]])[/color][color=green][i]; определяем PID окна[/i][/color]
            [color=brown]$sCurProcessName[/color] [color=red]=[/color] [color=gray][i]_ProcessGetName[/i][/color] [color=red]([/color][color=brown]$winPid[/color][color=red])[/color] [color=green][i]; определяем имя процеса[/i][/color]
            [color=blue]If[/color] [color=brown]$sCurProcessName[/color] [color=red]=[/color] [color=brown]$sProcessName[/color] [color=blue]Then[/color] [color=green][i]; если имя процесса равно нашему, то[/i][/color]
                [color=darkblue][i]WinSetState[/i][/color] [color=red]([/color][color=brown]$all_windows[/color][color=red][[/color][color=brown]$i[/color][color=red]][[/color][color=darkmagenta][i]1[/i][/color][color=red]],[/color] [color=gray]""[/color][color=red],[/color] [color=magenta]@SW_MINIMIZE[/color][color=red])[/color] [color=green][i]; минимизируем это окно, зная его хэндл[/i][/color]
                [color=blue]Exit[/color] [color=green][i]; завершение работы скрипта[/i][/color]
            [color=blue]EndIf
        EndIf
    Next
    
    Func[/color] IsVisible[color=red]([/color][color=brown]$handle[/color][color=red])[/color][color=green][i]; самодельная функция проверки видимо ли окно[/i][/color]
      [color=blue]If[/color] [color=darkblue][i]BitAnd[/i][/color][color=red]([/color] [color=darkblue][i]WinGetState[/i][/color][color=red]([/color][color=brown]$handle[/color][color=red]),[/color] [color=darkmagenta][i]2[/i][/color] [color=red])[/color] [color=blue]Then
        Return[/color] [color=darkmagenta][i]1[/i][/color]
      [color=blue]Else
        Return[/color] [color=darkmagenta][i]0[/i][/color]
      [color=blue]EndIf
    EndFunc[/color]
    В этой ситуации скрипт вообще не смотрит на заголовки окон, а работает с хэндлами. Проверил на блокноте - Работает.
    Вариант при известном классе окна:
    Code:
    [color=brown]$hMyWindow[/color] [color=red]=[/color]  [color=darkblue][i]WinGetHandle[/i][/color] [color=red]([/color][color=gray]"[CLASS:Notepad]"[/color][color=red])[/color] [color=green][i]; зная класс окна определяем его хэндл[/i][/color]
    [color=blue]If[/color] [color=brown]$hMyWindow[/color] [color=red]<>[/color] [color=gray]""[/color] [color=blue]Then[/color] [color=darkblue][i]WinSetState[/i][/color] [color=red]([/color][color=brown]$hMyWindow[/color][color=red],[/color] [color=gray]""[/color][color=red],[/color] [color=magenta]@SW_MINIMIZE[/color][color=red])[/color][color=green][i]; если хендл не пустой, то минимизируем[/i][/color]
    Естественно вместо Notepad вписать свой класс
    язык: AutoIt
     
    #8 Greedz, 1 Aug 2010
    Last edited: 1 Aug 2010