<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=10144</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=10144&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Клик по иконке другой программы в трее или вызов ее меню».]]></description>
		<lastBuildDate>Tue, 01 Sep 2015 15:35:06 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=97003#p97003</link>
			<description><![CDATA[<p>Тогда не знаю, видимо, какие-то проблемы чтения памяти другого процесса в Windows 10. Не могу проэкспериментировать, у меня 7.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 01 Sep 2015 15:35:06 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=97003#p97003</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=97002#p97002</link>
			<description><![CDATA[<p>64</p>]]></description>
			<author><![CDATA[null@example.com (becauseim)]]></author>
			<pubDate>Tue, 01 Sep 2015 15:31:28 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=97002#p97002</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=97001#p97001</link>
			<description><![CDATA[<p>А, понял, в справке этого не может быть написано, она общая. Откройте папку, куда установлен AHK, найдите файл AutoHotkey.exe, наведите на него курсор. Должно появиться всплывающее окно типа такого:</p><p><span class="postimg"><img src="https://cloclo20.cloud.mail.ru/weblink/thumb/xw1/3xWFwYtFNHBh/2015.09.01-18.27.33.7.jpg" alt="https://cloclo20.cloud.mail.ru/weblink/thumb/xw1/3xWFwYtFNHBh/2015.09.01-18.27.33.7.jpg" /></span></p><p>Там будет описание файла.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 01 Sep 2015 15:29:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=97001#p97001</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=96999#p96999</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>как там указано?</p></blockquote></div><p>Так как я указал. Где указывается битность, я не знаю, к сожалению.<br /><span class="postimg"><img src="http://puu.sh/jWjRu/16ebcca739.png" alt="http://puu.sh/jWjRu/16ebcca739.png" /></span></p>]]></description>
			<author><![CDATA[null@example.com (becauseim)]]></author>
			<pubDate>Tue, 01 Sep 2015 15:19:31 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=96999#p96999</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=96998#p96998</link>
			<description><![CDATA[<p>Что за окно Help и именно как там указано?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 01 Sep 2015 15:16:49 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=96998#p96998</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=96997#p96997</link>
			<description><![CDATA[<p>Не знаю, как это можно узнать. В окне Help указано именно так.</p>]]></description>
			<author><![CDATA[null@example.com (becauseim)]]></author>
			<pubDate>Tue, 01 Sep 2015 15:14:45 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=96997#p96997</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=96996#p96996</link>
			<description><![CDATA[<p>Битность AHK тоже имеет значение.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 01 Sep 2015 15:02:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=96996#p96996</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=96995#p96995</link>
			<description><![CDATA[<p>Win10 x64<br />v1.1.22.02</p>]]></description>
			<author><![CDATA[null@example.com (becauseim)]]></author>
			<pubDate>Tue, 01 Sep 2015 15:00:11 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=96995#p96995</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=96992#p96992</link>
			<description><![CDATA[<p>Чем поделиться? У меня последний скрипт работает, у остальных, вроде, тоже работал. Какая ОС у вас, какая версия AHK?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 01 Sep 2015 12:53:21 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=96992#p96992</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=96991#p96991</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>отправляем сообщения иконке Skype.exe</p></blockquote></div><p><span class="postimg"><img src="http://puu.sh/jWbRJ/decc068137.png" alt="http://puu.sh/jWbRJ/decc068137.png" /></span></p><p>Была бы кстати рабочая версия. Поделитесь, пожалуйста.<br />Имеется в виду пкм по заданной программе в трее.</p>]]></description>
			<author><![CDATA[null@example.com (becauseim)]]></author>
			<pubDate>Tue, 01 Sep 2015 12:44:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=96991#p96991</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=88308#p88308</link>
			<description><![CDATA[<p>Ключевое слово &quot;this&quot; используется при работе с <a href="http://ahkscript.org/docs/Objects.htm#Custom_Classes">классами</a>, но изучить следует всю статью <a href="http://ahkscript.org/docs/Objects.htm#Objects"><em>Объекты</em></a>.<br />Справочная информация о winapi-функциях (и иногда примеры использования) находится <a href="https://social.msdn.microsoft.com/search/en-US">поиском</a> в <a href="https://ru.wikipedia.org/wiki/Microsoft_Developer_Network">MSDN</a>, например <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms684320%28v=vs.85%29.aspx"><em>OpenProcess</em></a>.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 13 Nov 2014 14:33:32 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=88308#p88308</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=88301#p88301</link>
			<description><![CDATA[<p>И то, и другое наверно. Если кинете пару ссылок как с этим обращатся с примерами, буду балгодарен.</p>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Thu, 13 Nov 2014 12:34:00 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=88301#p88301</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=88292#p88292</link>
			<description><![CDATA[<p>Не совсем понял, вопрос про конструкцию <em>this.hProc</em>, или про winapi-функцию?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 13 Nov 2014 11:56:56 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=88292#p88292</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=88289#p88289</link>
			<description><![CDATA[<p>Спасибо большое, вариант по имени процесса отлично работает.<br />Я только не понял <strong>как</strong> он это делает.<br />В частности указатели или&nbsp; такие вызовы:</p><div class="codebox"><pre><code>(this.hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))</code></pre></div><p>Я в основном учился по справке.<br />Вы не подскажете что проштудировать, чтобы самому составлять такие выражения?</p>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Thu, 13 Nov 2014 11:44:06 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=88289#p88289</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=88239#p88239</link>
			<description><![CDATA[<p>Где-то уже писал, но вот подправленные варианты. По порядковому индексу иконки, отправляем сообщения первой иконке в трее:<br /></p><div class="codebox"><pre><code>#NoTrayIcon
idx := 1
PostMessage2TrayIconIndex(idx
   , &quot;Tray&quot;   ; если иконка в Shell_TrayWnd, пишем &quot;Tray&quot;, если в NotifyIconOverflowWindow — &quot;&quot;
   , WM_RBUTTONDOWN := 0x204
   , WM_RBUTTONUP := 0x205)  ; последние параметры — сообщения которые нужно отправить
Return

PostMessage2TrayIconIndex(idx, TrayOrOverflow, messages*)
{
/*
Структура TRAYDATA
typedef TRAYDATA
{
IntPtr hwnd;
uint uID;
uint uCallbackMessage;
uint Reserved;
uint Reserved2;
IntPtr hIcon;
}
*/
   static WM_USER := 0x400, TB_BUTTONCOUNT := WM_USER + 24, TB_GETBUTTON := WM_USER + 23
      , PtrSize := A_Is64bitOS ? 8 : 4, SizeOfTBBUTTON := 8 + PtrSize*3, SizeOfTRAYDATA := 16 + PtrSize*2

   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   ControlGet, hWnd, hwnd,, ToolbarWindow321, % &quot;ahk_class &quot; . (TrayOrOverflow = &quot;Tray&quot; ? &quot;Shell_TrayWnd&quot; : &quot;NotifyIconOverflowWindow&quot;)
   WinExist(&quot;ahk_id&quot; hWnd)
   WinGet, PID, PID

   if !IsObject(RemoteBuff := New RemoteBuffer(PID, SizeOfTRAYDATA)) {
      DetectHiddenWindows, %DHW_Prev%
      Return, 0, DllCall(&quot;MessageBox&quot;, Ptr, 0, Str, &quot;Не удалось создать удалённый буфер`nОшибка &quot; A_LastError, Str, &quot;&quot;, UInt, 0)
   }
 
   SendMessage, TB_GETBUTTON, idx - 1, RemoteBuff.ptr
   if ! ( pTBBUTTON := RemoteBuff.Read(SizeOfTBBUTTON) )
      || !pTRAYDATA := RemoteBuff.Read(SizeOfTRAYDATA, NumGet(pTBBUTTON + 8 + PtrSize) - RemoteBuff.ptr) {
      DetectHiddenWindows, %DHW_Prev%
      Return
   }

   WinExist(&quot;ahk_id&quot; NumGet(pTRAYDATA+0))
   uID := NumGet(pTRAYDATA + PtrSize, &quot;UInt&quot;)
   uCallbackMessage := NumGet(pTRAYDATA + PtrSize + 4, &quot;UInt&quot;)

   for i, message in messages
      PostMessage, uCallbackMessage, uID, message
   
   DetectHiddenWindows, %DHW_Prev%
}

Class RemoteBuffer
{
   __New(PID, size)
   {
      static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
         , MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
         
      if !(this.hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
         Return
      
      if !(this.ptr := DllCall(&quot;VirtualAllocEx&quot;, UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
         Return, &quot;&quot;, DllCall(&quot;CloseHandle&quot;, Ptr, this.hProc)
   }
   
   __Delete()
   {
      DllCall(&quot;VirtualFreeEx&quot;, Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
      DllCall(&quot;CloseHandle&quot;, Ptr, this.hProc)
   }
   
   Read(size, offset = 0)
   {
      static LocalBuff
      VarSetCapacity(LocalBuff, size, 0)
      if !DllCall(&quot;ReadProcessMemory&quot;, Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &amp;LocalBuff, UInt, size, UInt, 0)
         Return, 0, DllCall(&quot;MessageBox&quot;, Ptr, 0, Str, &quot;Не удалось прочитать данные`nОшибка &quot; A_LastError, Str, &quot;&quot;, UInt, 0)
      
      VarSetCapacity(LocalBuff, -1)
      Return &amp;LocalBuff
   }
   
   Write(pLocalBuff, size, offset = 0)
   {
      res := DllCall(&quot;WriteProcessMemory&quot;, Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
      Return res ? res : 0, (!res) ? DllCall(&quot;MessageBox&quot;, Ptr, 0, Str, &quot;Не удалось записать данные`nОшибка &quot; A_LastError, Str, &quot;&quot;, UInt, 0)
   }
}</code></pre></div><p>По названию процесса (или если ahk, то по имени скрипта), отправляем сообщения иконке Skype.exe:<br /></p><div class="codebox"><pre><code>#NoTrayIcon
PostMessage2TrayIconProcName(&quot;skype.exe&quot;, WM_RBUTTONDOWN := 0x204, WM_RBUTTONUP := 0x205)
Return

PostMessage2TrayIconProcName(ProcessName, messages*)
{
/*
Структура TRAYDATA
typedef TRAYDATA
{
IntPtr hwnd;
uint uID;
uint uCallbackMessage;
uint Reserved;
uint Reserved2;
IntPtr hIcon;
}
*/
   static WM_USER := 0x400, TB_BUTTONCOUNT := WM_USER + 24, TB_GETBUTTON := WM_USER + 23
      , PtrSize := A_Is64bitOS ? 8 : 4, SizeOfTBBUTTON := 8 + PtrSize*3, SizeOfTRAYDATA := 16 + PtrSize*2
   oWMI := ComObjGet(&quot;winmgmts:&quot;)
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   
   Loop 2
   {
      ControlGet, hWnd, hwnd,, ToolbarWindow321, % &quot;ahk_class &quot; . (A_Index = 1 ? &quot;Shell_TrayWnd&quot; : &quot;NotifyIconOverflowWindow&quot;)
      WinExist(&quot;ahk_id&quot; hWnd)
      WinGet, PID, PID

      if (A_Index = 1 &amp;&amp; !IsObject(RemoteBuff := New RemoteBuffer(PID, SizeOfTRAYDATA))) {
         DetectHiddenWindows, %DHW_Prev%
         Return, 0, DllCall(&quot;MessageBox&quot;, Ptr, 0, Str, &quot;Не удалось создать удалённый буфер`nОшибка &quot; A_LastError, Str, &quot;&quot;, UInt, 0)
      }
      
      SendMessage, TB_BUTTONCOUNT
      Loop % ErrorLevel
      {
         SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr
         if ! ( pTBBUTTON := RemoteBuff.Read(SizeOfTBBUTTON) )
            || !pTRAYDATA := RemoteBuff.Read(SizeOfTRAYDATA, NumGet(pTBBUTTON + 8 + PtrSize) - RemoteBuff.ptr) {
            DetectHiddenWindows, %DHW_Prev%
            Return
         }

         WinGet, PID, PID, % &quot;ahk_id&quot; hWnd := NumGet(pTRAYDATA+0)
         CurrentProcessName := oWMI.Get(&quot;Win32_Process.Handle=&quot; PID).Name
         if (CurrentProcessName = &quot;AutoHotkey.exe&quot;)
         {
            WinGetTitle, Title, % &quot;ahk_id&quot; hWnd
            CurrentProcessName := RegExReplace(Title, &quot;i).*\\(.*) - autohotkey v[\.\d]+&quot;, &quot;$1&quot;)
         }
         if (CurrentProcessName = ProcessName)
         {
            uID := NumGet(pTRAYDATA + PtrSize, &quot;UInt&quot;)
            uCallbackMessage := NumGet(pTRAYDATA + PtrSize + 4, &quot;UInt&quot;)

            for i, message in messages
               PostMessage, uCallbackMessage, uID, message,, % &quot;ahk_id&quot; hWnd
            DetectHiddenWindows, %DHW_Prev%
            Return
         }
      }
   }
   DetectHiddenWindows, %DHW_Prev%
   MsgBox, % &quot;Иконка процесса &quot; . ProcessName . &quot; не найдена&quot;
}

Class RemoteBuffer
{
   __New(PID, size)
   {
      static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
         , MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
         
      if !(this.hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
         Return
      
      if !(this.ptr := DllCall(&quot;VirtualAllocEx&quot;, UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
         Return, &quot;&quot;, DllCall(&quot;CloseHandle&quot;, Ptr, this.hProc)
   }
   
   __Delete()
   {
      DllCall(&quot;VirtualFreeEx&quot;, Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
      DllCall(&quot;CloseHandle&quot;, Ptr, this.hProc)
   }
   
   Read(size, offset = 0)
   {
      static LocalBuff
      VarSetCapacity(LocalBuff, size, 0)
      if !DllCall(&quot;ReadProcessMemory&quot;, Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &amp;LocalBuff, UInt, size, UInt, 0)
         Return, 0, DllCall(&quot;MessageBox&quot;, Ptr, 0, Str, &quot;Не удалось прочитать данные`nОшибка &quot; A_LastError, Str, &quot;&quot;, UInt, 0)
      
      VarSetCapacity(LocalBuff, -1)
      Return &amp;LocalBuff
   }
   
   Write(pLocalBuff, size, offset = 0)
   {
      res := DllCall(&quot;WriteProcessMemory&quot;, Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
      Return res ? res : 0, (!res) ? DllCall(&quot;MessageBox&quot;, Ptr, 0, Str, &quot;Не удалось записать данные`nОшибка &quot; A_LastError, Str, &quot;&quot;, UInt, 0)
   }
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 12 Nov 2014 17:27:36 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=88239#p88239</guid>
		</item>
	</channel>
</rss>
