<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=4920</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=4920&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: Как развернуть (активизировать) свернутое окно по его имени?».]]></description>
		<lastBuildDate>Fri, 04 Mar 2011 16:50:23 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45808#p45808</link>
			<description><![CDATA[<div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><p>[..]<br />а это в моем случае - сначала проверяется перечень процессов, если интересующий процесс найден - беру его ID и метод WshShell.AppActivate нормально в окно процесса выполняет переключение (критичных &quot;невнятностей&quot; пока не увидел), если процесса не было, то он запускается и переключаемся. С этим все ОК, спасибо за подсказки!</p></blockquote></div><p>Привожу код скрипта (под Win-7 будет возможность протестировать после праздников) для случая запуска оснастки управления компютером. В данном случае процесс я запускаю не через .Exec, а через .Run, т.к. все равно конкретная оснастка&nbsp; запускается не прямым вызовом exe-шки. Под XP - пока без претензий)<br /></p><div class="codebox"><pre><code>&#039;**** run_COMPMGMT.vbs **************************
&#039; (COMPMGMT.MSC: opens the Computer management tool)
&#039;
&#039; Запуск &quot;COMPMGMT&quot; с набором имени машины
&#039; Параметр - имя подключаемого компьютера
&#039;
&#039;************************************************

Option Explicit 

Dim giDebug
giDebug    = 0 &#039; 1-вывод отладочных сообщений и т.п. / 0 - обычный режим
&#039; --- чтение своей инишки ----------------------------
&#039; INI читается в случае ее наличия, 
&#039; используется для переопеределения режима отладки (ищется строка: debug=...)
Const sMyINI = &quot;run_COMPMGMT.ini&quot;
Dim fso
Set fso=CreateObject(&quot;Scripting.FileSystemObject&quot;)
Dim CurDir
Dim yes_no, s, iPos
CurDir = fso.GetAbsolutePathName(&quot;.&quot;)
yes_no = fso.FileExists( CurDir &amp; &quot;\&quot; &amp; sMyINI)
If yes_no Then
    Dim fspi
    Set fspi=fso.OpenTextFile(sMyINI, 1)
    Do While not fspi.AtEndOfStream
        s = fspi.ReadLine
        iPos = InStr(1, s, &quot;=&quot;)
        If iPos&gt;0 Then
            If LCase(Trim(Left(s, iPos-1)))=&quot;debug&quot; Then
                giDebug = CInt( Trim( Right(s, Len(s)-iPos) ) ) &#039; правая от &quot;=&quot; часть преобразовывается в целое число
            End IF
        End IF
    Loop
    fspi.Close
    Set fspi = Nothing
End IF &#039;(yes_no)
Set fso = Nothing
&#039; -----


Dim A
Set A=Wscript.Arguments

Dim sComp, sParamRD
sComp = &quot;&quot;
sParamRD = &quot;&quot;
If A.Count&gt;=1 Then  &#039; имеется переданный параметр - имя компа
    sComp = A(0)
    If A.Count=2 Then  &#039; имеется переданный параметр - доп.параметр для запуска Remote Desktop
        sParamRD = A(1)
    End IF
else
    sComp = InputBox(&quot;Введите имя подключаемого компьютера&quot;, &quot;Настройка запуска &quot;&quot;Computer Management&quot;&quot;&quot;)
End IF


If sComp&lt;&gt;&quot;&quot; Then  &#039; имеется непустое имя компа

    Dim oShell
    Set oShell = WScript.CreateObject(&quot;WScript.Shell&quot;) 
    
    Dim sNmFileProcess : sNmFileProcess = &quot;mmc.exe&quot;
    Dim iProcessID : iProcessID = 0

    &#039;--- Проверяем наличие процесса&#039;
    Dim objWMIService, colProcesses, oPrc
    Set objWMIService = GetObject(&quot;winmgmts:\\.\root\cimv2&quot;)
    Set colProcesses = objWMIService.ExecQuery (&quot;SELECT * FROM Win32_Process WHERE Name = &#039;&quot; &amp; sNmFileProcess &amp; &quot;&#039;&quot;)
    If colProcesses.Count = 0 Then &#039;--- Запускаем свой процесс&#039;
        oShell.Run &quot;COMPMGMT.MSC&quot;, 1
        FuncAppendOneStrToTXTFile &quot;run_COMPMGMT.log&quot;, Now() &amp; &quot; Start: &quot; &amp; &quot;COMPMGMT.MSC&quot;
        &#039;надо опять искать процесс&#039;
        Set colProcesses = objWMIService.ExecQuery (&quot;SELECT * FROM Win32_Process WHERE Name = &#039;&quot; &amp; sNmFileProcess &amp; &quot;&#039;&quot;)
        If colProcesses.Count &gt; 0 Then
            For Each oPrc In colProcesses
                If LCase(oPrc.Name)=LCase(sNmFileProcess) Then
                    FuncAppendOneStrToTXTFile &quot;run_COMPMGMT.log&quot;, &quot;name: &quot; &amp; oPrc.Name &amp; &quot; id:&quot; &amp; oPrc.ProcessID
                    iProcessID = oPrc.ProcessID
                    Exit FOR
                End IF
            Next
        End IF
        
    else &#039;--- процесс существует, берем айди для преключения&#039;
        FuncAppendOneStrToTXTFile &quot;run_COMPMGMT.log&quot;,  Now() &amp; &quot; (i) Process found.&quot;
        For Each oPrc In colProcesses
            If LCase(oPrc.Name)=LCase(sNmFileProcess) Then
                FuncAppendOneStrToTXTFile &quot;run_COMPMGMT.log&quot;, &quot;name: &quot; &amp; oPrc.Name &amp; &quot; id:&quot; &amp; oPrc.ProcessID
                iProcessID = oPrc.ProcessID
                Exit FOR
            End IF
        Next
    End IF
    Set objWMIService = Nothing
    Set colProcesses = Nothing

    &#039; Dim sAppTitle
    &#039; sAppTitle = &quot;Computer Management&quot;
    
    If iProcessID=0 Then
        FuncAppendOneStrToTXTFile &quot;run_COMPMGMT.log&quot;, &quot;(!) Check start process: `&quot; &amp; sNmFileProcess &amp; &quot;` not found.&quot;
    else
        Dim ret : ret = false
        ret = oShell.AppActivate (iProcessID)

        Dim iSecAll, iSecWait, i, lTmp
        iSecAll = 10000 &#039;всего отводим на попытку активации окна - 20сек
        iSecWait = 500  &#039;время простоя
        While iSecAll&gt;0 And (Not ret) &#039; выход из цикла - либо в окно переключились, либо время закончилось
            ret = oShell.AppActivate (iProcessID)
            If giDebug Then lTmp=FuncAppendOneStrToTXTFile( _
                &quot;run_COMPMGMT.log&quot;, &quot;Sleep: &quot; &amp; iSecWait &amp; &quot;, iSecAll: &quot; &amp; iSecAll &amp; &quot;,  ret: &quot; &amp; ret )
            If Not ret Then 
                WScript.Sleep iSecWait
                iSecAll = iSecAll - iSecWait
            End IF
        WEnd 
        Set oShell=Nothing 

        If ret Then &#039;при наличии успешного переключения - &quot;набираем&quot; имя компа

            WScript.Sleep 1000 &#039; 1 сек. дополнительного ожидания
            If giDebug Then lTmp=FuncAppendOneStrToTXTFile(&quot;run_COMPMGMT.log&quot;, Now() &amp; &quot; start sendkeys...&quot;)

            Dim oSHL
            Set oSHL = WScript.CreateObject(&quot;WScript.Shell&quot;) 
            oSHL.SendKeys(&quot;%&quot;)
            WScript.Sleep 200
            oSHL.SendKeys(&quot;A&quot;)
            oSHL.SendKeys(&quot;C&quot;)
            WScript.Sleep 500 &#039; 0.5 сек. дополнительного ожидания
            oSHL.SendKeys( sComp )
            Set oSHL=Nothing
            If giDebug Then lTmp=FuncAppendOneStrToTXTFile(&quot;run_COMPMGMT.log&quot;, &quot;---- End OK: &quot; &amp; Now() )
            
        else
            If giDebug Then lTmp=FuncAppendOneStrToTXTFile(&quot;run_COMPMGMT.log&quot;, Now() &amp;&quot; Quit without sendkeys...&quot;)
            MsgBox &quot;Неудачная попытка активации &quot; &amp; _
                chr(34)&amp;sNmFileProcess&amp;chr(34) &amp; vbCrLf , _
                vbCritical, &quot;Запуск оснастки управления компьютером&quot;
        End IF
    End IF
    
else
    MsgBox &quot;Goodbye!&quot;

End IF &#039; (sComp&lt;&gt;&quot;&quot;)
If giDebug Then lTmp=FuncAppendOneStrToTXTFile(&quot;run_COMPMGMT.log&quot;, vbCrLf)


&#039;----------------функция---------------------------------------- 
&#039;добавляет строчку в текстовый файл 
Function FuncAppendOneStrToTXTFile(FileName, StrText) 
   &#039;------------------------Константы для задания типа открытия файла 
   Const ForReading = 1, ForWriting = 2, ForAppending = 8, OverwriteTrue = True, OverwriteFalse = False 
   &#039; Объявляем переменные 
   Dim  objFSO, FOut 
   &#039; Создаем объект FileSystemObject 
   Set  objFSO=WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;) 
   &#039; Открываем выходной файл для записи 
   Set  FOut = objFSO.OpenTextFile (FileName,ForAppending,true) 
   &#039; Записываем текстовую строку в файл 
   FOut.WriteLine StrText&#039; &amp; vbcrlf 
   &#039; Закрываем выходной файл 
   FOut.Close 
   FuncAppendOneStrToTXTFile = true 
End Function 
&#039;***************************************************************</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Fri, 04 Mar 2011 16:50:23 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45808#p45808</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45805#p45805</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p><strong>Rom5</strong>, Вы понимаете, что «от имени доменной админской учетки» и «elevate» — разные вещи.</p></blockquote></div><p>Честно говоря, что это вещи разные - вижу, но, увы, пока еще не все понимаю - админская доменная учетка входит и в группу локальных администраторов, но ее действительно для запуска скрипта не хватает - сразу же ругается на строку с методом WshShell.Exec.</p><p>Если запускать под пользовательской учеткой с &quot;Shift - Run as Administrator&quot;, то скрипт чудесно работает,&nbsp; а это в моем случае - сначала проверяется перечень процессов, если интересующий процесс найден - беру его ID и метод WshShell.AppActivate нормально в окно процесса выполняет переключение (критичных &quot;невнятностей&quot; пока не увидел), если процесса не было, то он запускается и переключаемся. С этим все ОК, спасибо за подсказки!</p><p>В реальной работе мое HTA-приложение пользователь при работе под Win-7 запускает батником от имени админской учетки с помощью утилитки от Марка Руссиновича - PsExec. Утилита (в версии 1.98) имеет ключик: <br /><em>&quot;-h&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;If the target system is Vista or higher, has the process run with the account&#039;s elevated token, if available.&quot;</em><br />Но, увы, при совместном использовании его и ключа <em>&quot;-u&nbsp; Specifies optional user name for login to remote computer.&quot;</em> получаю на старте psexec сообщение &quot;Access denied&quot; <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Fri, 04 Mar 2011 15:26:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45805#p45805</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45766#p45766</link>
			<description><![CDATA[<p>Вообще в MSDN пишут следующее про параметры метода <strong>AppActivate</strong><br /></p><div class="quotebox"><blockquote><p>object <br />WshShell object.</p><p>title <br />Specifies which application to activate. This can be a string containing the title of the application (as it appears in the title bar) or the application&#039;s Process ID.</p></blockquote></div><p>Раз он может быть ProcessID, то можем попробывать подсунуть его. Получить его можно, запустив приложение через <strong>WshShell.Exec</strong></p><p>Собственно как то так.</p><div class="codebox"><pre><code>Dim WshExec, ProcessID
Set WshShell = CreateObject(&quot;WScript.Shell&quot;)
Set WshExec = WshShell.Exec(&quot;notepad.exe&quot;)
ProcessID = WshExec.ProcessID
Do While WshExec.Status &lt;&gt; 1
    WshShell.AppActivate ProcessID
    WshShell.SendKeys &quot;1&quot;
    WScript.Sleep 1000
Loop

MsgBox &quot;END&quot;</code></pre></div><p>Крутим цикл активации приложения до тех пор, пока оно не завершится.</p><p>Ну всё бы хорошо, только эффект всё равно невнятный какой то. <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /></p><p>P.S Возникает только 1 вопрос - как может быть активация окна по ID процесса ?? А если у процесса несколько окон ? Какое тогда активизировать ? По логике для активации нужен <strong>hWnd</strong>. Обычный window handle, который передаётся в API функции. Это я бы понял, но вот по процессу...:| Что то я видимо ещё не изучил в этой схеме. )</p><p>P.P.S Да, и кстати рекомендую прислушаться к совету <strong>alexii</strong>. Я сам не проверял, но очень возможно, что дело именно в UAC.</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Thu, 03 Mar 2011 08:32:34 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45766#p45766</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45754#p45754</link>
			<description><![CDATA[<p><strong>Rom5</strong>, Вы понимаете, что «от имени доменной админской учетки» и «elevate» — разные вещи.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Wed, 02 Mar 2011 18:22:06 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45754#p45754</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45753#p45753</link>
			<description><![CDATA[<p>Скрипт запускается в HTA-приложении, которое в свою очередь работает от имени доменной админской учетки. И все остальные функции приложения работают прогнозируемо.<br />Надо как-то скриптами &quot;уточнить&quot; имя окна...</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Wed, 02 Mar 2011 16:15:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45753#p45753</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45752#p45752</link>
			<description><![CDATA[<p><strong>Rom5</strong>, если включён UAC, попробуйте сначала запуск имеющегося скрипта с правами администратора (elevate).</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Wed, 02 Mar 2011 13:16:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45752#p45752</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45751#p45751</link>
			<description><![CDATA[<p>Коллеги, подниму старую тему, т.к. давно работающий vbs-скрипт, преключающийся в окошко по имени методом &quot;Shell.AppActivate&quot;, под системой Win-7 не активизирует окно, хотя визуально имя окна &quot;Computer Managment&quot; под 7-кой один к одному имени под Win XP.</p><p>Подскажите, плз: можно ли активизировать окно по имени процесса или его id, или подскажите - как скриптом получить перечень окон?</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Wed, 02 Mar 2011 13:00:49 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45751#p45751</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39369#p39369</link>
			<description><![CDATA[<p>Можно и без сторонних библиотек (пример на js)</p><div class="codebox"><pre><code>var Shell = new ActiveXObject(&quot;WScript.shell&quot;)
Shell.AppActivate(&quot;Fear Factory - Slave Labor.mp3 - Media Player Classic&quot;)
Shell.SendKeys(&quot;~&quot;)</code></pre></div><p>Где Fear Factory - Slave Labor.mp3 - Media Player Classic - полное название окна</p>]]></description>
			<author><![CDATA[null@example.com (Himmler)]]></author>
			<pubDate>Fri, 10 Sep 2010 13:42:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39369#p39369</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39341#p39341</link>
			<description><![CDATA[<p><a href="http://www.script-coding.com/AutiItX.html">Обзор библиотеки AutoItX3.dll</a></p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 09 Sep 2010 10:56:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39341#p39341</guid>
		</item>
		<item>
			<title><![CDATA[VBScript: Как развернуть (активизировать) свернутое окно по его имени?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39328#p39328</link>
			<description><![CDATA[<p>Всем привет! <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Сразу скажу, что я в этих скриптах ничего не понимаю. Столкнулся с такой задачей: необходимо развернуть форму подключения к терминалу &quot;SERVER-Remote Desktop&quot;. Кому не лень, помогите пожалуйста!?;)</p>]]></description>
			<author><![CDATA[null@example.com (Maks)]]></author>
			<pubDate>Thu, 09 Sep 2010 06:14:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39328#p39328</guid>
		</item>
	</channel>
</rss>
