<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Универсальная функция получения информации об окнах]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10394&amp;type=atom" />
	<updated>2015-02-11T09:54:50Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=10394</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Универсальная функция получения информации об окнах]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91411#p91411" />
			<content type="html"><![CDATA[<p>Я вижу три:<br /></p><div class="codebox"><pre><code>        WinGet, pid, pid, %ahk_x_name%, %WinText%,  %ExcludeTitle%, %ExcludeText%
        ComObjGet(&quot;winmgmts:&quot;).ExecQuery(&quot;Select * from Win32_Process WHERE ProcessId = &quot; . pid)._NewEnum.next(x)
        Value := x.CommandLine</code></pre></div><p>С моим вариантом было бы две:<br /></p><div class="codebox"><pre><code>WinGet, pid, pid, %ahk_x_name%, %WinText%,  %ExcludeTitle%, %ExcludeText%
Value := ComObjGet(&quot;winmgmts:&quot;).Get(&quot;Win32_Process.Handle=&quot; PID).CommandLine</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-02-11T09:54:50Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91411#p91411</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Универсальная функция получения информации об окнах]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91410#p91410" />
			<content type="html"><![CDATA[<p>Чтобы воспользоваться DllCall(&quot;GetCurrentProcessId&quot;), нужно сначала выполнить что-нибудь с окном, типа WinExist, чтобы оно стало LastFound.<br />А это уже 3 строчки кода, вместо 2 сейчас в скрипте <img src="//forum.script-coding.com/img/smilies/tongue.png" width="15" height="15" />.<br />--------------------------------------------------------------<br />Если так, то OK.</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2015-02-11T09:14:34Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91410#p91410</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Универсальная функция получения информации об окнах]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91380#p91380" />
			<content type="html"><![CDATA[<p>Проще:<br /></p><div class="codebox"><pre><code>PID := DllCall(&quot;GetCurrentProcessId&quot;)
MsgBox, % ComObjGet(&quot;winmgmts:&quot;).Get(&quot;Win32_Process.Handle=&quot; PID).CommandLine</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-02-10T11:14:29Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91380#p91380</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Универсальная функция получения информации об окнах]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91377#p91377" />
			<content type="html"><![CDATA[<p><a href="http://forum.script-coding.com/viewtopic.php?id=6443">CommandLine.</a></p>]]></content>
			<author>
				<name><![CDATA[Irbis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27384</uri>
			</author>
			<updated>2015-02-10T10:22:20Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91377#p91377</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Универсальная функция получения информации об окнах]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91375#p91375" />
			<content type="html"><![CDATA[<p>ClientCoord и OwnerID добавил.<br />Написание параметров произвольное, нужно лишь, чтобы они содержали строку Client или Own соответственно.<br />Для получения Commandline и hIcon рабочего кода не нашел.<br />Если есть, поделитесь, добавим.<br />------------------------------------<br /><strong>Irbis</strong>, спасибо!</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2015-02-10T10:02:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91375#p91375</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Универсальная функция получения информации об окнах]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91347#p91347" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>stealzy пишет:</cite><blockquote><p>ClientCoords - все таки к Controls относиться</p></blockquote></div><p>Нет, я имел в виду координаты клиентской части.<br /></p><div class="quotebox"><blockquote><p>У окна есть CommandLine?</p></blockquote></div><p>CommandLine есть у процесса окна, нужно, чтобы узнать, как именно был запущен процесс. hIcon — хэндл иконки окна, чтобы можно было скопировать её в своё окно. Ну, это, правда, не так уж часто нужно.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-02-09T13:26:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91347#p91347</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Универсальная функция получения информации об окнах]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91345#p91345" />
			<content type="html"><![CDATA[<p>Style/ExStyle, ProcessName - уже включены.<br />ClientCoords - все таки к Controls относиться, хотя несложно включить.<br />CommandLine, hIcon - с этими зверями не сталкивался. У окна есть CommandLine?<br />OwnerID - нужная вещь.</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2015-02-09T13:19:33Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91345#p91345</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Универсальная функция получения информации об окнах]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91344#p91344" />
			<content type="html"><![CDATA[<p>Ну только информация об окнах не ограничивается ID, POS и PID. Ещё часто могут понадобиться ClientCoords, Style/ExStyle, ProcessName, CommandLine, OwnerID, hIcon — это так, навскидку, что первое в голову пришло. Так что тут ещё целое поле непаханное для работы. <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-02-09T12:39:22Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91344#p91344</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Универсальная функция получения информации об окнах]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91343#p91343" />
			<content type="html"><![CDATA[<p>Из-за разнообразия названий команд получения информации об окнах, забываю как именно пишутся нек. команды ( то ли [Win%X%, Var, Title], то ли [WinGet, Var, %X%, Title], или IfWin%X% ).</p><p>Плюс раздражала смена опций <em>DetectHiddenWindows</em>, <em>SetTitleMatchMode</em>, когда меняешь их ради одной команды, а потом меняешь обратно. Если меняешь их в функции, то надо еще и сохранять старые значения и восстанавливать их потом.<br /><img src="//forum.script-coding.com/img/smilies/hmm.png" width="15" height="15" /></p><p>Задумка: одна универсальная функция для получения информации об окнах, опции <em>DHW</em> и <em>STMM</em> в параметрах.<span style="color: #dddddd"> (на выходе восстанавливаются)</span></p><p><span style="color: #44bbbb">WinGetI</span>(Cmd<span style="color: green">[, ahk_x_name, DetectHiddenWindows, SetTitleMatchMode, WinText,&nbsp; ExcludeTitle, ExcludeText]</span>)<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Все параметры Cmd</div><div class="fancy_spoiler"><p>Exist, Active, Title, Class, Text, Pos, ID, IDLast, PID, ProcessName, Count, List, MinMax, Style, ExStyle, Transparent, TransColor, ControlList, ControlListHwnd; OwnerID, ClientPos, CommandLine</p></div></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;source code</div><div class="fancy_spoiler"><div class="codebox"><pre><code>
;Все возможные параметры: Exist, Active, Title, Class, Text, Pos, ID, IDLast, PID, ProcessName, Count, List, MinMax, Style, ExStyle, Transparent, TransColor, ControlList, ControlListHwnd; OwnerID - возвращает Id окна-владельца, ClientPos - координаты клиентской области окна в нумерованном массиве, CommandLine - путь и параметры процесса.
;Если окно не существует, возвращает &quot;&quot;.
;Примеры:
;windowID := WinGetI(&quot;Id, XTitle AHK_class TMainForm, on&quot;)
;windowID := WinGetI(&quot;ID&quot;, &quot;XTitle AHK_class TMainForm&quot;, &quot;On&quot;)
;procPID := WinGetI(&quot;pid, AHK_id &quot; . windowID . &quot;, On&quot;)
;XWinPos := WinGetI(&quot;pos, XTitle&quot;)
;MsgBox %XWinPos[1]% %XWinPos[2]% %XWinPos[3]% %XWinPos[4]%

WinGetI(Cmd, ahk_x_name=&quot;&quot;, DetectHiddenWindows=&quot;&quot;, SetTitleMatchMode=&quot;&quot;, WinText=&quot;&quot;,  ExcludeTitle=&quot;&quot;, ExcludeText=&quot;&quot;) {
    if InStr(Cmd, &quot;,&quot;) { ; парсим 1 параметр, если он содержит запятые
        ParamArray := StrSplit(Cmd, &quot;,&quot;, &quot; `t&quot;)
        Cmd                 := ParamArray[1]
        ahk_x_name             := ParamArray[2]
        DetectHiddenWindows := ParamArray[3]
        SetTitleMatchMode     := ParamArray[4]
        WinText             := ParamArray[5]
        ExcludeTitle         := ParamArray[6]
        ExcludeText         := ParamArray[7]
    }
    if (DetectHiddenWindows!=&quot;On&quot; &amp;&amp; DetectHiddenWindows!=&quot;Off&quot; &amp;&amp; DetectHiddenWindows!=&quot;&quot;)
        Return BadParam(&quot;DetectHiddenWindows&quot;, DetectHiddenWindows)
    if (SetTitleMatchMode!=&quot;1&quot; &amp;&amp; SetTitleMatchMode!=&quot;2&quot; &amp;&amp; SetTitleMatchMode!=&quot;3&quot; &amp;&amp; SetTitleMatchMode!=&quot;RegEx&quot; &amp;&amp; SetTitleMatchMode!=&quot;&quot;)
        Return BadParam(&quot;SetTitleMatchMode&quot;, SetTitleMatchMode)
        
    Old_DetectHiddenWindows:=A_DetectHiddenWindows
    Old_SetTitleMatchMode:=A_TitleMatchMode
    if DetectHiddenWindows
        DetectHiddenWindows, %DetectHiddenWindows%
    if SetTitleMatchMode
        SetTitleMatchMode, %SetTitleMatchMode%
    
    Value:=WinGetIRefined(Cmd, ahk_x_name, WinText, ExcludeTitle, ExcludeText)
    
    if DetectHiddenWindows
        DetectHiddenWindows, %Old_DetectHiddenWindows%
    if SetTitleMatchMode
        SetTitleMatchMode, %Old_SetTitleMatchMode%
        
    Return Value
}

WinGetIRefined(Cmd, ahk_x_name, WinText=&quot;&quot;,  ExcludeTitle=&quot;&quot;, ExcludeText=&quot;&quot;) {
    Static WinGetParamList:={} ; параметры ф-ии WinGet()
    WinGetParamList:=[ &quot;ID&quot;, &quot;IDLast&quot;, &quot;PID&quot;, &quot;ProcessName&quot;
    , &quot;Count&quot;, &quot;List&quot;, &quot;MinMax&quot;, &quot;Style&quot;, &quot;ExStyle&quot;, &quot;Transparent&quot;, &quot;TransColor&quot;
    , &quot;ControlList&quot;, &quot;ControlListHwnd&quot;,    &quot;ProcessPath&quot;]
    for k, v in WinGetParamList
        if (Cmd=WinGetParamList[k]) {
            WinGet, Value, %Cmd%, %ahk_x_name%, %WinText%,  %ExcludeTitle%, %ExcludeText%
            if (Cmd=&quot;List&quot;) {
                i:=0
                Loop %Value% {
                    if ! i++    ; в первом цикле Value из переменной становиться массивом
                        Value:={}
                    Value[A_Index] := (Value%A_Index%)
                }
            }
            Return Value
        }
    
    if (Cmd=&quot;Exist&quot;)
        Value:=WinExist(ahk_x_name, WinText, ExcludeTitle, ExcludeText)
    else if (Cmd=&quot;Active&quot;)
        Value:=WinActive(ahk_x_name, WinText, ExcludeTitle, ExcludeText)
    else if (Cmd=&quot;Title&quot;)
        WinGetTitle, Value, %ahk_x_name%, %WinText%, %ExcludeTitle%, %ExcludeText%
    else if (Cmd=&quot;Class&quot;)
        WinGetClass, Value, %ahk_x_name%, %WinText%, %ExcludeTitle%, %ExcludeText%
    else if (Cmd=&quot;Text&quot;)
        WinGetText, Value, %ahk_x_name%, %WinText%, %ExcludeTitle%, %ExcludeText%
    else if (Cmd=&quot;Pos&quot;) {
        WinGetPos, X, Y, Width, Height, %ahk_x_name%, %WinText%, %ExcludeTitle%, %ExcludeText%
        Value:={}
        Value:=[X, Y, Width, Height]
    } else if InStr(Cmd, &quot;Own&quot;) {
        WinID := WinExist(ahk_x_name, WinText, ExcludeTitle, ExcludeText)
        Value := DllCall(&quot;GetWindow&quot;, Ptr, WinID, UInt, GW_OWNER := 4, Ptr)
    } else if (Cmd=&quot;CommandLine&quot;) {
        WinGet, pid, pid, %ahk_x_name%, %WinText%,  %ExcludeTitle%, %ExcludeText%
        ComObjGet(&quot;winmgmts:&quot;).ExecQuery(&quot;Select * from Win32_Process WHERE ProcessId = &quot; . pid)._NewEnum.next(x)
        Value := x.CommandLine
    } else if InStr(Cmd, &quot;Client&quot;) {
        if !Hwnd:=WinExist(ahk_x_name)
            Return
        VarSetCapacity(pt, 16)
        NumPut(x, pt, 0)
        NumPut(y, pt, 4)
        NumPut(w, pt, 8)
        NumPut(h, pt, 12)
        if (!DllCall(&quot;GetClientRect&quot;, &quot;uint&quot;, hwnd, &quot;uint&quot;, &amp;pt))
            Return
        if (!DllCall(&quot;ClientToScreen&quot;, &quot;uint&quot;, hwnd, &quot;uint&quot;, &amp;pt))
            Return
        x := NumGet(pt, 0, &quot;int&quot;)
        y := NumGet(pt, 4, &quot;int&quot;)
        w := NumGet(pt, 8, &quot;int&quot;)
        h := NumGet(pt, 12, &quot;int&quot;)
        Value:={}
        Value:=[x, y, w, h]
    } else
        Return BadParam(&quot;Cmd&quot;, Cmd)
    
    Return Value
}
BadParam(name, Cmd) {
    MsgBox,16, WinGetI, Parameter %name%=&quot;%Cmd%&quot; is not support
    Return
}</code></pre></div></div></div><p>+Можно забыть про зоопарк из 9 команд: IfWinActive, IfWinExist, WinGet, WinGetClass, WinGetPos, WinGetTitle, WinGetText, WinGetActiveStats, WinGetActiveTitle.<br />+OwnerID - возвращает Id окна-владельца,<br />+ClientPos - координаты клиентской области окна.<br /><span style="color: grey">ClientCoord:=WinGetI(&quot;clientpos&quot;) ; x:=ClientCoord[1], width:=ClientCoord[3]</span><br />+CommandLine - путь и параметры с которыми запущен процесс окна<br /><span style="color: grey">&quot;C:\Windows\calc.exe&quot;<br />/solve_ferma_theorem</span><br />+Валидация параметров.<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Примечания</div><div class="fancy_spoiler"><p><span style="color: grey">Применение фунции с параметром Pos возвращает нумер. массив, ассоциативный, возможно будет понятнее (winPos[&quot;y&quot;] vs winPos[2]), но лень писать кавычки;<br />Параметры Exist и ID эквиваленты;<br />Нестрогий синтаксис ahk_x abcd. Теоретически, название окна может содержать ahk_x либо запятые.<br />Посмотрел, как это сделано в AutoIt - эти параметры передаются в ф-ию асс. массивом:<br />f(..., Title: abcd, ...) если несколько условий, то: f(..., [Title: abcd, Class: xyzw] ...)</span></p></div></div><p>----------------------------<br />fixed: с параметром List возвращает в переменную массив контролов.</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2015-02-09T11:37:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91343#p91343</id>
		</entry>
</feed>
