<?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=5440&amp;type=atom" />
	<updated>2011-02-02T15:20:08Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=5440</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Определение видимой области окна на экране]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=44751#p44751" />
			<content type="html"><![CDATA[<p>Спасибо <strong>teadrinker</strong>!<br />Отлично!</p>]]></content>
			<author>
				<name><![CDATA[avens]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24487</uri>
			</author>
			<updated>2011-02-02T15:20:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=44751#p44751</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Определение видимой области окна на экране]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=44623#p44623" />
			<content type="html"><![CDATA[<p>Определить, какая часть окна видима, можно сосчитав, сколько точек окна перекрыто другими окнами, лежащими выше него, и краем монитора. Хэндлы окон в порядке сверху до низу возвращает команда<br /></p><div class="codebox"><pre><code>WinGet, List, List</code></pre></div><p>Будем проверять каждую точку окна, перекрыта она, или нет. Наверное, не очень рационально по скорости, но алгоритм высчитывания и вычитания перекрытых площадей (а окно могут перекрывать несколько других окон, в свою очередь, перекрывающих друг друга) будет гораздо более сложным.<br /></p><div class="codebox"><pre><code>hWnd =    ; указать реальный хэндл окна

SetBatchLines -1
MsgBox, % GetVisibleSquare(hWnd)
Return

GetVisibleSquare(hWnd)
{
   if !WinExist(&quot;ahk_id &quot; hWnd)
      Return &quot;Видимого окна с данным хэндлом не существует!&quot;
      
   SquareCovered := i := 0
   WinGetPos, X, Y, W, H, ahk_id %hWnd%
   X1 := X &lt; 0 ? 0 : X
   Y1 := Y &lt; 0 ? 0 : Y
   X2 := X + W &gt; A_ScreenWidth ? A_ScreenWidth : X + W
   Y2 := Y + H &gt; A_ScreenHeight ? A_ScreenHeight : Y + H
   SquareReal := W * H
   SquareOnScreen := (X2 - X1) * (Y2 - Y1)   ; площадь, не перекрытая краем монитора
   
   WinGet, List, List
   While List%A_Index% != hWnd
   {
      i++
      WinGetPos, X, Y, W, H, % &quot;ahk_id &quot; List%A_Index%
      X1_%i% := X &lt; 0 ? 0 : X
      Y1_%i% := Y &lt; 0 ? 0 : Y
      X2_%i% := X + W &gt; A_ScreenWidth ? A_ScreenWidth : X + W &lt; 0 ? 0 : X + W
      Y2_%i% := Y + H &gt; A_ScreenHeight ? A_ScreenHeight : Y + H &lt; 0 ? 0 : Y + H
      
      if (X1_%i% &lt;= X1 &amp;&amp; X2 &lt;= X2_%i% &amp;&amp; Y1_%i% &lt;= Y1 &amp;&amp; Y2 &lt;= Y2_%i%)
         Return 0    ; окно полностью перекрывает целевое
      
      if (X1_%i% &gt; X2 || X1 &gt; X2_%i% || Y1_%i% &gt; Y2 || Y1 &gt; Y2_%i%)   ; окно не перекрывает целевое
         i--                                                          ; отсеиваем его из дальнейшей проверки
   }
   if i = 0
      Return 100 - Round((SquareReal - SquareOnScreen)*100/SquareReal)
      
   Loop % Y2 - Y1
   {
      Y := Y1 + A_Index - 1
      Loop % X2 - X1
      {
         X := X1 + A_Index - 1
         Loop % i
         {
            if (X &gt;= X1_%A_Index% &amp;&amp; X &lt;= X2_%A_Index%   ; проверяем, перекрыта ли данная точка
               &amp;&amp; Y &gt;= Y1_%A_Index% &amp;&amp; Y &lt;= Y2_%A_Index%)
            {
               SquareCovered++
               Break
            }
         }
      }
   }
   Return 100 - Round((SquareCovered + SquareReal - SquareOnScreen)*100/SquareReal)
}</code></pre></div><p>Правда, такой алгоритм сработает только для стандартных, прямоугольных окон.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2011-01-30T19:15:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=44623#p44623</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Определение видимой области окна на экране]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=44600#p44600" />
			<content type="html"><![CDATA[<p>Здравствуйте!<br />Такой вопрос, может и не осуществляемый но все же решил спросить, есть скрипт ahk с окном Gui, можно ли какими то средствами AHK определять сколько процентов окна видно сейчас на экране монитора, для тех случаев когда оно неактивно и немного прикрыто другим каким нибудь окном?</p><p>К примеру на этот гуи:<br /></p><div class="codebox"><pre><code>    WS_EX_LAYERED := 0x00080000
    Gui, +Owner
    Gui, Add, Picture, x0 y0 w420 h330 Hidden gMyPic vMyPic, %SlidePic%
    Gui, +LastFound -Caption +E0x80000
    GuiHwnd := WinExist()
    
    result:=DllCall(&quot;SetLayeredWindowAttributes&quot; ;========&lt;&lt;ПРОБЛЕМНАЯФУНКЦИЯ&gt;&gt;==========
       , UInt, GuiHwnd
       , Uint, 0x0099aaee   ;0x00bbggrr
       , Char, 0xff
       , Uint, 1)   ;LWA_COLORKEY:=1   ;LWA_ALPHA:=2
    
    
    Gui, Color, EEAA99
    Transparency = 0
    WinSet, Transparent, %Transparency% %Transparency%, MySlideShow
    Gui Show, x860 y440 w420 h330, MySlideShow
    GuiControl, Show, MyPic</code></pre></div>]]></content>
			<author>
				<name><![CDATA[avens]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24487</uri>
			</author>
			<updated>2011-01-30T11:06:00Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=44600#p44600</id>
		</entry>
</feed>
