<?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="http://forum.script-coding.com/extern.php?action=feed&amp;tid=10144&amp;type=atom" />
	<updated>2015-09-01T15:35:06Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=10144</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=97003#p97003" />
			<content type="html"><![CDATA[<p>Тогда не знаю, видимо, какие-то проблемы чтения памяти другого процесса в Windows 10. Не могу проэкспериментировать, у меня 7.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-09-01T15:35:06Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=97003#p97003</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=97002#p97002" />
			<content type="html"><![CDATA[<p>64</p>]]></content>
			<author>
				<name><![CDATA[becauseim]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=33149</uri>
			</author>
			<updated>2015-09-01T15:31:28Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=97002#p97002</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=97001#p97001" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-09-01T15:29:35Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=97001#p97001</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96999#p96999" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[becauseim]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=33149</uri>
			</author>
			<updated>2015-09-01T15:19:31Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96999#p96999</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96998#p96998" />
			<content type="html"><![CDATA[<p>Что за окно Help и именно как там указано?</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-09-01T15:16:49Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96998#p96998</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96997#p96997" />
			<content type="html"><![CDATA[<p>Не знаю, как это можно узнать. В окне Help указано именно так.</p>]]></content>
			<author>
				<name><![CDATA[becauseim]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=33149</uri>
			</author>
			<updated>2015-09-01T15:14:45Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96997#p96997</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96996#p96996" />
			<content type="html"><![CDATA[<p>Битность AHK тоже имеет значение.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-09-01T15:02:26Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96996#p96996</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96995#p96995" />
			<content type="html"><![CDATA[<p>Win10 x64<br />v1.1.22.02</p>]]></content>
			<author>
				<name><![CDATA[becauseim]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=33149</uri>
			</author>
			<updated>2015-09-01T15:00:11Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96995#p96995</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96992#p96992" />
			<content type="html"><![CDATA[<p>Чем поделиться? У меня последний скрипт работает, у остальных, вроде, тоже работал. Какая ОС у вас, какая версия AHK?</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-09-01T12:53:21Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96992#p96992</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=96991#p96991" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[becauseim]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=33149</uri>
			</author>
			<updated>2015-09-01T12:44:46Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=96991#p96991</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88308#p88308" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-13T14:33:32Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88308#p88308</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88301#p88301" />
			<content type="html"><![CDATA[<p>И то, и другое наверно. Если кинете пару ссылок как с этим обращатся с примерами, буду балгодарен.</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2014-11-13T12:34:00Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88301#p88301</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88292#p88292" />
			<content type="html"><![CDATA[<p>Не совсем понял, вопрос про конструкцию <em>this.hProc</em>, или про winapi-функцию?</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-13T11:56:56Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88292#p88292</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88289#p88289" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2014-11-13T11:44:06Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88289#p88289</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Клик по иконке другой программы в трее или вызов ее меню]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88239#p88239" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-12T17:27:36Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88239#p88239</id>
		</entry>
</feed>
