<?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=9024&amp;type=atom" />
	<updated>2014-11-13T18:31:02Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=9024</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88325#p88325" />
			<content type="html"><![CDATA[<p>Так можно.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-13T18:31:02Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88325#p88325</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88324#p88324" />
			<content type="html"><![CDATA[<p>А если сделать так, то наверное не будут получены новые дескрипторы иконок при повторном нажатии?<br /></p><div class="codebox"><pre><code>3::
if !hAssociatedGui2
{
   hIcon:= ExtractIcon(&quot;imageres.dll&quot;, 4, 16)
   hAssociatedGui2 := AddTrayIcon(hIcon)
}
return

4::
if !hAssociatedGui3
{
   hIcon:= ExtractIcon(&quot;imageres.dll&quot;, 8, 16)
   hAssociatedGui3 := AddTrayIcon(hIcon)
}
return</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2014-11-13T18:27:35Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88324#p88324</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88323#p88323" />
			<content type="html"><![CDATA[<p>Память, вроде, не ест, судя по диспетчеру задач, но в коде есть ошибка: при повторном нажатии 3 и 4 будут получены новые дескрипторы иконок, которые нигде не удаляются, это тоже как-то расходует ресурсы системы. Тут я подробно не знаю, но знаю, что такие хендлы должны удаляться с помощью <em>DllCall(&quot;DestroyIcon&quot;, Ptr, hIcon)</em>.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-13T18:22:33Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88323#p88323</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88322#p88322" />
			<content type="html"><![CDATA[<p>А такой код не будет есть память?<br /></p><div class="codebox"><pre><code>OnExit, RemoveIcon
Return

1::
hIcon:= ExtractIcon(&quot;imageres.dll&quot;, 77, 16)
if hAssociatedGui1
   ModifyTrayIcon(hIcon, hAssociatedGui1)
else
   hAssociatedGui1 := AddTrayIcon(hIcon)
return

2::
hIcon:= ExtractIcon(&quot;imageres.dll&quot;, 2, 16)
if hAssociatedGui1
   ModifyTrayIcon(hIcon, hAssociatedGui1)
else
   hAssociatedGui1 := AddTrayIcon(hIcon)
return

3::
hIcon:= ExtractIcon(&quot;imageres.dll&quot;, 4, 16)
if !hAssociatedGui2
   hAssociatedGui2 := AddTrayIcon(hIcon)
return

4::
hIcon:= ExtractIcon(&quot;imageres.dll&quot;, 8, 16)
if !hAssociatedGui3
   hAssociatedGui3 := AddTrayIcon(hIcon)
return
   
Esc:: ExitApp

RemoveIcon:
   RemoveTrayIcon(hAssociatedGui1), RemoveTrayIcon(hAssociatedGui2), RemoveTrayIcon(hAssociatedGui3)
   ExitApp

ExtractIcon(sFile, IconNumber, IconSize)
{
   coding := A_IsUnicode ? &quot;W&quot; : &quot;A&quot;

   SplitPath, sFile,,, ext
   (ext = &quot;ico&quot; &amp;&amp; IconNumber := 0)

   if PrivateExtractIcons := DllCall(&quot;GetProcAddress&quot;
                              , Ptr, DllCall(&quot;LoadLibrary&quot;, Str, &quot;User32&quot;, Ptr)
                              , AStr, &quot;PrivateExtractIcons&quot; . coding, Ptr)
   {
      Result := DllCall(PrivateExtractIcons, Str, sFile, Int, IconNumber-1
                  , Int, IconSize, Int, IconSize, PtrP, hIcon, UIntP, 0, UInt, 1, UInt, 0)
      if !Result
         MsgBox, 16,, % &quot;Не удалось извлечь иконку.`nОшибка &quot; A_LastError
      else if (Result = 0xFFFFFFFF || Result = -1)
         MsgBox, 16,, Файл &quot;%sFile%&quot; не найден!
   }

   else
   {
      if !DllCall(&quot;Shell32\ExtractIconEx&quot; . coding, Str, sFile, Int, IconNumber-1, PtrP, hIconLarge, PtrP, hIconSmall, UInt, 1)
      {
         MsgBox, 16,, % &quot;Не удалось извлечь иконку.`nОшибка &quot; A_LastError
         return
      }
      SysGet, SmallIconSize, % SM_CXSMICON := 49
      if (IconSize &lt;= SmallIconSize)
         DllCall(&quot;DestroyIcon&quot;, Ptr, hIconLarge), hIcon := hIconSmall
      else
         DllCall(&quot;DestroyIcon&quot;, Ptr, hIconSmall), hIcon := hIconLarge

      hIcon := DllCall(&quot;CopyImage&quot;, Ptr, hIcon, UInt, IMAGE_ICON := 1
         , Int, IconSize, Int, IconSize, UInt, LR_COPYRETURNORG := 0x4|LR_COPYDELETEORG := 0x8, Ptr)
   }

   Return hIcon
}

AddTrayIcon(hIcon)
{
   static NIF_MESSAGE := 1, NIF_ICON := 2, GuiNumber := 99, NIM_ADD := 0, uID := 0x404
   
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   Gui, % GuiNumber-- &quot;: +hwndhGui&quot;
   NumPut(hGui, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   NumPut(NIF_MESSAGE|NIF_ICON, NOTIFYICONDATA, 2*A_PtrSize + 4, &quot;UInt&quot;)
   NumPut(nMsg := 0x404, NOTIFYICONDATA, 2*A_PtrSize + 8, &quot;UInt&quot;)
   NumPut(hIcon, NOTIFYICONDATA, 3*A_PtrSize+8)
   
   DllCall(&quot;shell32\Shell_NotifyIcon&quot;, UInt, NIM_ADD, Ptr, &amp;NOTIFYICONDATA)
   DllCall(&quot;DestroyIcon&quot;, Ptr, hIcon)
   Return hGui
}

ModifyTrayIcon(hIcon, hGui, uID = 0x404)
{
   static NIM_MODIFY := 1, NIF_ICON := 2
   
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   NumPut(hGui, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   NumPut(NIF_ICON, NOTIFYICONDATA, 2*A_PtrSize + 4, &quot;UInt&quot;)
   NumPut(hIcon, NOTIFYICONDATA, 3*A_PtrSize+8)
   
   res := DllCall(&quot;shell32\Shell_NotifyIcon&quot;, UInt, NIM_MODIFY, Ptr, &amp;NOTIFYICONDATA)
   DllCall(&quot;DestroyIcon&quot;, Ptr, hIcon)
   Return res
}

RemoveTrayIcon(hWnd, uID=0x404)
{
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   NumPut(hWnd, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   Return DllCall(&quot;shell32\Shell_NotifyIcon&quot;, &quot;UInt&quot;, NIM_DELETE := 2, Ptr, &amp;NOTIFYICONDATA)
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2014-11-13T18:10:21Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88322#p88322</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88317#p88317" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Malcev пишет:</cite><blockquote><p>Если нажимаю сразу &quot;2&quot;, то иконка не появляется.<br />Если нажимаю 1, потом 2 и потом опять 1, то иконка остается 2.</p></blockquote></div><p>Так задача была:<br /></p><div class="quotebox"><cite>Malcev пишет:</cite><blockquote><p>Потом при нажатии 1, добавляет еще одну.<br />При нажатии 2 -&nbsp; меняет добавленную на вторую.</p></blockquote></div><div class="quotebox"><cite>Malcev пишет:</cite><blockquote><p>А к каким последствиям может привести моя модификация скрипта?</p></blockquote></div><p>Работать не будет правильно, с каждым нажатием память отъедать. Нужно понимать, как работают эти функции, там при каждом вызове AddTrayIcon() создаётся новое скрытое окно. Чтобы менялось туда-обратно, лучше так:<br /></p><div class="codebox"><pre><code>Menu, Tray, Icon, % A_AhkPath, 2
OnExit, RemoveIcon
Return

1::
2::
    hIcon:= ExtractIcon(&quot;imageres.dll&quot;, A_ThisHotkey = 1 ? 77 : 2, 16)
    hAssociatedGui ? ModifyTrayIcon(hIcon, hAssociatedGui) : hAssociatedGui := AddTrayIcon(hIcon)
    Return
   
Esc:: ExitApp

RemoveIcon:
   RemoveTrayIcon(hAssociatedGui)
   ExitApp

ExtractIcon(sFile, IconNumber, IconSize)
{
   coding := A_IsUnicode ? &quot;W&quot; : &quot;A&quot;

   SplitPath, sFile,,, ext
   (ext = &quot;ico&quot; &amp;&amp; IconNumber := 0)

   if PrivateExtractIcons := DllCall(&quot;GetProcAddress&quot;
                              , Ptr, DllCall(&quot;LoadLibrary&quot;, Str, &quot;User32&quot;, Ptr)
                              , AStr, &quot;PrivateExtractIcons&quot; . coding, Ptr)
   {
      Result := DllCall(PrivateExtractIcons, Str, sFile, Int, IconNumber-1
                  , Int, IconSize, Int, IconSize, PtrP, hIcon, UIntP, 0, UInt, 1, UInt, 0)
      if !Result
         MsgBox, 16,, % &quot;Не удалось извлечь иконку.`nОшибка &quot; A_LastError
      else if (Result = 0xFFFFFFFF || Result = -1)
         MsgBox, 16,, Файл &quot;%sFile%&quot; не найден!
   }

   else
   {
      if !DllCall(&quot;Shell32\ExtractIconEx&quot; . coding, Str, sFile, Int, IconNumber-1, PtrP, hIconLarge, PtrP, hIconSmall, UInt, 1)
      {
         MsgBox, 16,, % &quot;Не удалось извлечь иконку.`nОшибка &quot; A_LastError
         return
      }
      SysGet, SmallIconSize, % SM_CXSMICON := 49
      if (IconSize &lt;= SmallIconSize)
         DllCall(&quot;DestroyIcon&quot;, Ptr, hIconLarge), hIcon := hIconSmall
      else
         DllCall(&quot;DestroyIcon&quot;, Ptr, hIconSmall), hIcon := hIconLarge

      hIcon := DllCall(&quot;CopyImage&quot;, Ptr, hIcon, UInt, IMAGE_ICON := 1
         , Int, IconSize, Int, IconSize, UInt, LR_COPYRETURNORG := 0x4|LR_COPYDELETEORG := 0x8, Ptr)
   }

   Return hIcon
}

AddTrayIcon(hIcon)
{
   static NIF_MESSAGE := 1, NIF_ICON := 2, GuiNumber := 99, NIM_ADD := 0, uID := 0x404
   
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   Gui, % GuiNumber-- &quot;: +hwndhGui&quot;
   NumPut(hGui, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   NumPut(NIF_MESSAGE|NIF_ICON, NOTIFYICONDATA, 2*A_PtrSize + 4, &quot;UInt&quot;)
   NumPut(nMsg := 0x404, NOTIFYICONDATA, 2*A_PtrSize + 8, &quot;UInt&quot;)
   NumPut(hIcon, NOTIFYICONDATA, 3*A_PtrSize+8)
   
   DllCall(&quot;shell32\Shell_NotifyIcon&quot;, UInt, NIM_ADD, Ptr, &amp;NOTIFYICONDATA)
   DllCall(&quot;DestroyIcon&quot;, Ptr, hIcon)
   Return hGui
}

ModifyTrayIcon(hIcon, hGui, uID = 0x404)
{
   static NIM_MODIFY := 1, NIF_ICON := 2
   
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   NumPut(hGui, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   NumPut(NIF_ICON, NOTIFYICONDATA, 2*A_PtrSize + 4, &quot;UInt&quot;)
   NumPut(hIcon, NOTIFYICONDATA, 3*A_PtrSize+8)
   
   res := DllCall(&quot;shell32\Shell_NotifyIcon&quot;, UInt, NIM_MODIFY, Ptr, &amp;NOTIFYICONDATA)
   DllCall(&quot;DestroyIcon&quot;, Ptr, hIcon)
   Return res
}

RemoveTrayIcon(hWnd, uID=0x404)
{
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   NumPut(hWnd, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   Return DllCall(&quot;shell32\Shell_NotifyIcon&quot;, &quot;UInt&quot;, NIM_DELETE := 2, Ptr, &amp;NOTIFYICONDATA)
}</code></pre></div><p>Нажимать можно в любом порядке.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-13T16:16:00Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88317#p88317</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88312#p88312" />
			<content type="html"><![CDATA[<p>Если нажимаю сразу &quot;2&quot;, то иконка не появляется.<br />Если нажимаю 1, потом 2 и потом опять 1, то иконка остается 2.<br />А к каким последствиям может привести моя модификация скрипта?</p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2014-11-13T15:38:29Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88312#p88312</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88311#p88311" />
			<content type="html"><![CDATA[<p>Тогда так:<br /></p><div class="codebox"><pre><code>Menu, Tray, Icon, % A_AhkPath, 2
OnExit, RemoveIcon
Return

1:: (!hIcon1 &amp;&amp; (hIcon1 := ExtractIcon(&quot;imageres.dll&quot;, 77, 16))
    &amp;&amp; hAssociatedGui := AddTrayIcon(hIcon1))

2:: (!hIcon2 &amp;&amp; (hIcon2 := ExtractIcon(&quot;imageres.dll&quot;, 2, 16))
    &amp;&amp; ModifyTrayIcon(hIcon2, hAssociatedGui))
    
Esc:: ExitApp

RemoveIcon:
   RemoveTrayIcon(hAssociatedGui)
   ExitApp

ExtractIcon(sFile, IconNumber, IconSize)
{
   coding := A_IsUnicode ? &quot;W&quot; : &quot;A&quot;

   SplitPath, sFile,,, ext
   (ext = &quot;ico&quot; &amp;&amp; IconNumber := 0)

   if PrivateExtractIcons := DllCall(&quot;GetProcAddress&quot;
                              , Ptr, DllCall(&quot;LoadLibrary&quot;, Str, &quot;User32&quot;, Ptr)
                              , AStr, &quot;PrivateExtractIcons&quot; . coding, Ptr)
   {
      Result := DllCall(PrivateExtractIcons, Str, sFile, Int, IconNumber-1
                  , Int, IconSize, Int, IconSize, PtrP, hIcon, UIntP, 0, UInt, 1, UInt, 0)
      if !Result
         MsgBox, 16,, % &quot;Не удалось извлечь иконку.`nОшибка &quot; A_LastError
      else if (Result = 0xFFFFFFFF || Result = -1)
         MsgBox, 16,, Файл &quot;%sFile%&quot; не найден!
   }

   else
   {
      if !DllCall(&quot;Shell32\ExtractIconEx&quot; . coding, Str, sFile, Int, IconNumber-1, PtrP, hIconLarge, PtrP, hIconSmall, UInt, 1)
      {
         MsgBox, 16,, % &quot;Не удалось извлечь иконку.`nОшибка &quot; A_LastError
         return
      }
      SysGet, SmallIconSize, % SM_CXSMICON := 49
      if (IconSize &lt;= SmallIconSize)
         DllCall(&quot;DestroyIcon&quot;, Ptr, hIconLarge), hIcon := hIconSmall
      else
         DllCall(&quot;DestroyIcon&quot;, Ptr, hIconSmall), hIcon := hIconLarge

      hIcon := DllCall(&quot;CopyImage&quot;, Ptr, hIcon, UInt, IMAGE_ICON := 1
         , Int, IconSize, Int, IconSize, UInt, LR_COPYRETURNORG := 0x4|LR_COPYDELETEORG := 0x8, Ptr)
   }

   Return hIcon
}

AddTrayIcon(hIcon)
{
   static NIF_MESSAGE := 1, NIF_ICON := 2, GuiNumber := 99, NIM_ADD := 0, uID := 0x404
   
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   Gui, % GuiNumber-- &quot;: +hwndhGui&quot;
   NumPut(hGui, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   NumPut(NIF_MESSAGE|NIF_ICON, NOTIFYICONDATA, 2*A_PtrSize + 4, &quot;UInt&quot;)
   NumPut(nMsg := 0x404, NOTIFYICONDATA, 2*A_PtrSize + 8, &quot;UInt&quot;)
   NumPut(hIcon, NOTIFYICONDATA, 3*A_PtrSize+8)
   
   DllCall(&quot;shell32\Shell_NotifyIcon&quot;, UInt, NIM_ADD, Ptr, &amp;NOTIFYICONDATA)
   DllCall(&quot;DestroyIcon&quot;, Ptr, hIcon)
   Return hGui
}

ModifyTrayIcon(hIcon, hGui, uID = 0x404)
{
   static NIM_MODIFY := 1, NIF_ICON := 2
   
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   NumPut(hGui, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   NumPut(NIF_ICON, NOTIFYICONDATA, 2*A_PtrSize + 4, &quot;UInt&quot;)
   NumPut(hIcon, NOTIFYICONDATA, 3*A_PtrSize+8)
   
   res := DllCall(&quot;shell32\Shell_NotifyIcon&quot;, UInt, NIM_MODIFY, Ptr, &amp;NOTIFYICONDATA)
   DllCall(&quot;DestroyIcon&quot;, Ptr, hIcon)
   Return res
}

RemoveTrayIcon(hWnd, uID=0x404)
{
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   NumPut(hWnd, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   Return DllCall(&quot;shell32\Shell_NotifyIcon&quot;, &quot;UInt&quot;, NIM_DELETE := 2, Ptr, &amp;NOTIFYICONDATA)
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-13T15:30:04Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88311#p88311</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88307#p88307" />
			<content type="html"><![CDATA[<p>Да. Изначально скрипт загружает только свою иконку.<br />Потом при нажатии 1, добавляет еще одну.<br />При нажатии 2 -&nbsp; меняет добавленную на вторую.</p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2014-11-13T14:31:07Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88307#p88307</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88285#p88285" />
			<content type="html"><![CDATA[<p>В смысле, «первая иконка» — это в дополнение к уже имеющейся иконке скрипта, или как?</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-13T11:17:27Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88285#p88285</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88268#p88268" />
			<content type="html"><![CDATA[<p>Я хочу чтобы при нажатии &quot;1&quot; появлялась в трее первая иконка, а при нажатии &quot;2&quot; она менялась на вторую.</p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2014-11-13T07:25:24Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88268#p88268</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88264#p88264" />
			<content type="html"><![CDATA[<p>Нет, не так, а что именно ты хочешь сделать?</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-13T04:38:36Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88264#p88264</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=88255#p88255" />
			<content type="html"><![CDATA[<p>Правильно ли я понимаю, что для того, чтобы менять иконки шорткатами нужно делать так:<br /></p><div class="codebox"><pre><code>OnExit, Exit

1::
hIcon := ExtractIcon(A_AhkPath, 2, 16)
RemoveTrayIcon(hAssociatedGui1)
hAssociatedGui1 := AddTrayIcon(hIcon)  ; первая дополнительная иконка
return

2::
hIcon := ExtractIcon(&quot;Shell32.dll&quot;, 44, 16)
RemoveTrayIcon(hAssociatedGui1)
hAssociatedGui1 := AddTrayIcon(hIcon)  ; первая дополнительная иконка
return


CloseApp:
   ExitApp

Exit:
   RemoveTrayIcon(hAssociatedGui1)
   ExitApp

ExtractIcon(sFile, IconNumber, IconSize)
{
   coding := A_IsUnicode ? &quot;W&quot; : &quot;A&quot;

   SplitPath, sFile,,, ext
   (ext = &quot;ico&quot; &amp;&amp; IconNumber := 0)

   if PrivateExtractIcons := DllCall(&quot;GetProcAddress&quot;
                              , Ptr, DllCall(&quot;LoadLibrary&quot;, Str, &quot;User32&quot;, Ptr)
                              , AStr, &quot;PrivateExtractIcons&quot; . coding, Ptr)
   {
      Result := DllCall(PrivateExtractIcons, Str, sFile, Int, IconNumber-1
                  , Int, IconSize, Int, IconSize, PtrP, hIcon, UIntP, 0, UInt, 1, UInt, 0)
      if !Result
         MsgBox, 16,, % &quot;Не удалось извлечь иконку.`nОшибка &quot; A_LastError
      else if (Result = 0xFFFFFFFF || Result = -1)
         MsgBox, 16,, Файл &quot;%sFile%&quot; не найден!
   }

   else
   {
      if !DllCall(&quot;Shell32\ExtractIconEx&quot; . coding, Str, sFile, Int, IconNumber-1, PtrP, hIconLarge, PtrP, hIconSmall, UInt, 1)
      {
         MsgBox, 16,, % &quot;Не удалось извлечь иконку.`nОшибка &quot; A_LastError
         return
      }
      SysGet, SmallIconSize, % SM_CXSMICON := 49
      if (IconSize &lt;= SmallIconSize)
         DllCall(&quot;DestroyIcon&quot;, Ptr, hIconLarge), hIcon := hIconSmall
      else
         DllCall(&quot;DestroyIcon&quot;, Ptr, hIconSmall), hIcon := hIconLarge

      hIcon := DllCall(&quot;CopyImage&quot;, Ptr, hIcon, UInt, IMAGE_ICON := 1
         , Int, IconSize, Int, IconSize, UInt, LR_COPYRETURNORG := 0x4|LR_COPYDELETEORG := 0x8, Ptr)
   }

   Return hIcon
}

AddTrayIcon(hIcon)
{
   static NIF_MESSAGE := 1, NIF_ICON := 2, GuiNumber := 99
   
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   Gui, % GuiNumber-- &quot;: +hwndhGui&quot;
   NumPut(hGui, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID := 0x404, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   NumPut(NIF_MESSAGE|NIF_ICON, NOTIFYICONDATA, 2*A_PtrSize + 4, &quot;UInt&quot;)
   NumPut(nMsg := 0x404, NOTIFYICONDATA, 2*A_PtrSize + 8, &quot;UInt&quot;)
   NumPut(hIcon, NOTIFYICONDATA, 3*A_PtrSize+8)
   
   DllCall(&quot;shell32\Shell_NotifyIcon&quot;, UInt, NIM_ADD := 0, Ptr, &amp;NOTIFYICONDATA)
   DllCall(&quot;DestroyIcon&quot;, Ptr, hIcon)
   Return hGui
}

RemoveTrayIcon(hWnd, uID=0x404)
{
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   NumPut(hWnd, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   DllCall(&quot;shell32\Shell_NotifyIcon&quot;, &quot;UInt&quot;, NIM_DELETE := 2, Ptr, &amp;NOTIFYICONDATA)
   Return
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2014-11-12T23:07:59Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=88255#p88255</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87938#p87938" />
			<content type="html"><![CDATA[<p>Так же.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-02T22:56:37Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87938#p87938</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87937#p87937" />
			<content type="html"><![CDATA[<p>А как в этом коде загрузить иконки не из dll или exe, а просто указать путь к ico?<br /></p><div class="codebox"><pre><code>if hIcon := ExtractIcon(A_AhkPath, 2, 16)
   hAssociatedGui1 := AddTrayIcon(hIcon)  ; первая дополнительная иконка

if hIcon := ExtractIcon(&quot;Shell32.dll&quot;, 44, 16)
   hAssociatedGui2 := AddTrayIcon(hIcon)  ; вторая дополнительная иконка
OnExit, Exit

; если нужно меню для иконок
OnMessage(0x404, &quot;AHK_NOTIFYICON&quot;)
Menu, MyTrayMenu, Add, Завершение работы, CloseApp
Return

CloseApp:
   ExitApp

Exit:
   RemoveTrayIcon(hAssociatedGui1), RemoveTrayIcon(hAssociatedGui2)
   ExitApp

ExtractIcon(sFile, IconNumber, IconSize)
{
   coding := A_IsUnicode ? &quot;W&quot; : &quot;A&quot;

   SplitPath, sFile,,, ext
   (ext = &quot;ico&quot; &amp;&amp; IconNumber := 0)

   if PrivateExtractIcons := DllCall(&quot;GetProcAddress&quot;
                              , Ptr, DllCall(&quot;LoadLibrary&quot;, Str, &quot;User32&quot;, Ptr)
                              , AStr, &quot;PrivateExtractIcons&quot; . coding, Ptr)
   {
      Result := DllCall(PrivateExtractIcons, Str, sFile, Int, IconNumber-1
                  , Int, IconSize, Int, IconSize, PtrP, hIcon, UIntP, 0, UInt, 1, UInt, 0)
      if !Result
         MsgBox, 16,, % &quot;Не удалось извлечь иконку.`nОшибка &quot; A_LastError
      else if (Result = 0xFFFFFFFF || Result = -1)
         MsgBox, 16,, Файл &quot;%sFile%&quot; не найден!
   }

   else
   {
      if !DllCall(&quot;Shell32\ExtractIconEx&quot; . coding, Str, sFile, Int, IconNumber-1, PtrP, hIconLarge, PtrP, hIconSmall, UInt, 1)
      {
         MsgBox, 16,, % &quot;Не удалось извлечь иконку.`nОшибка &quot; A_LastError
         return
      }
      SysGet, SmallIconSize, % SM_CXSMICON := 49
      if (IconSize &lt;= SmallIconSize)
         DllCall(&quot;DestroyIcon&quot;, Ptr, hIconLarge), hIcon := hIconSmall
      else
         DllCall(&quot;DestroyIcon&quot;, Ptr, hIconSmall), hIcon := hIconLarge

      hIcon := DllCall(&quot;CopyImage&quot;, Ptr, hIcon, UInt, IMAGE_ICON := 1
         , Int, IconSize, Int, IconSize, UInt, LR_COPYRETURNORG := 0x4|LR_COPYDELETEORG := 0x8, Ptr)
   }

   Return hIcon
}

AddTrayIcon(hIcon)
{
   static NIF_MESSAGE := 1, NIF_ICON := 2, GuiNumber := 99
   
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   Gui, % GuiNumber-- &quot;: +hwndhGui&quot;
   NumPut(hGui, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID := 0x404, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   NumPut(NIF_MESSAGE|NIF_ICON, NOTIFYICONDATA, 2*A_PtrSize + 4, &quot;UInt&quot;)
   NumPut(nMsg := 0x404, NOTIFYICONDATA, 2*A_PtrSize + 8, &quot;UInt&quot;)
   NumPut(hIcon, NOTIFYICONDATA, 3*A_PtrSize+8)
   
   DllCall(&quot;shell32\Shell_NotifyIcon&quot;, UInt, NIM_ADD := 0, Ptr, &amp;NOTIFYICONDATA)
   DllCall(&quot;DestroyIcon&quot;, Ptr, hIcon)
   Return hGui
}

RemoveTrayIcon(hWnd, uID=0x404)
{
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, &quot;UInt&quot;)
   NumPut(hWnd, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize, &quot;UInt&quot;)
   DllCall(&quot;shell32\Shell_NotifyIcon&quot;, &quot;UInt&quot;, NIM_DELETE := 2, Ptr, &amp;NOTIFYICONDATA)
   Return
}

AHK_NOTIFYICON(wp, lp, msg, hwnd)   ; wp — uID, lp — Message
{
   global hAssociatedGui1, hAssociatedGui2
   static WM_RBUTTONUP := 0x205
   if (lp = WM_RBUTTONUP &amp;&amp; (hwnd = hAssociatedGui1 || hwnd = hAssociatedGui2))
      Menu, MyTrayMenu, Show
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2014-11-02T22:50:13Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87937#p87937</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Загрузка разных иконок для программы]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=87929#p87929" />
			<content type="html"><![CDATA[<p>Если нельзя, но очень хочется, то можно. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2014-11-02T17:01:17Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=87929#p87929</id>
		</entry>
</feed>
