<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=6576&amp;type=atom" />
	<updated>2011-12-27T01:58:05Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=6576</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54994#p54994" />
			<content type="html"><![CDATA[<p><span style="color: Green">Напоминаю разработчикам не стесняться помещать ценные разработки в Коллекцию.</span></p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2011-12-27T01:58:05Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54994#p54994</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54993#p54993" />
			<content type="html"><![CDATA[<p>История имеет продолжение <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> , модифицировал скрипт в <a href="http://forum.script-coding.com/viewtopic.php?pid=54829#p54829">#6</a> сообщении этой темы, теперь курсоры загружаются исключительно из памяти, изменён способ отслеживания текущей раскладки на менее ресурсоёмкий - с помощью хука отслеживаем активацию окна и меняем курсор на соответствующий текущему языку в окне, делаем тоже при нажатии одной из клавиш Ctrl, Alt, Shift.</p><p>Код без метки Init и связанных с ней данных:</p><div class="codebox"><pre><code>
#NoEnv
#SingleInstance force

Gui, +LastFound
hgui:=WinExist()

if !DllCall( &quot;RegisterShellHookWindow&quot;,&quot;uint&quot;,hgui)
	Return
MsgNum:=DllCall(&quot;RegisterWindowMessage&quot;,&quot;str&quot;,&quot;SHELLHOOK&quot;)

LIST=32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650,32651
OCR_NORMAL:=32512
OCR_IBEAM:=32513
Gosub, Init

;~ Склеивание данных для больших файлов
hex_32514.=hex_32514_1 . hex_32514_2 . hex_32514_3 . hex_32514_4 . hex_32514_5
hex_32650.=hex_32650_1 . hex_32650_2 . hex_32650_3 . hex_32650_4 . hex_32650_5

Loop, Parse, LIST, CSV
{
	Size:=Hex2Bin(hex_%A_LoopField%)
	if hcur:=LoadAniCursorIcon(&amp;hex_%A_LoopField%,Size)
	DllCall(&quot;SetSystemCursor&quot;,&quot;uint&quot;,hcur,&quot;int&quot;,A_LoopField)
}

EN_ARROW_Size:=Hex2Bin(hex_EN_ARROW)
RU_ARROW_Size:=Hex2Bin(hex_RU_ARROW)
EN_IBEAM_Size:=Hex2Bin(hex_EN_IBEAM)
RU_IBEAM_Size:=Hex2Bin(hex_RU_IBEAM)

OnExit, Exit
OnMessage(MsgNum,&quot;WndProc&quot;)
Return

~Esc::
Exit:
DllCall(&quot;SystemParametersInfo&quot;,&quot;uint&quot;,0x57,&quot;uint&quot;,0,&quot;uint&quot;,0,&quot;uint&quot;,0)
DllCall(&quot;DeregisterShellHookWindow&quot;,&quot;uint&quot;,hgui)
ExitApp

~Shift::
~Ctrl::
~Alt::
hawnd:=DllCall(&quot;GetForegroundWindow&quot;)
KeyWait, % SubStr(A_ThisHotkey,2)
Gosub, ChangeCursorByLanguage
Return

WndProc(wParam,lParam)
{
	global hawnd
	if (wParam=4) ; HSHELL_WINDOWACTIVATED
	{
		hawnd:=lParam
		if !hawnd
		hawnd:=DllCall(&quot;GetForegroundWindow&quot;)
		Gosub, ChangeCursorByLanguage
	}
}

ChangeCursorByLanguage:
ThreadID:=DllCall(&quot;GetWindowThreadProcessId&quot;,&quot;uint&quot;,hawnd,&quot;uint&quot;,0)
InputLocaleID:=DllCall(&quot;GetKeyboardLayout&quot;,&quot;uint&quot;,ThreadID)
if (InputLocaleID=Prev_InputLocaleID)
Return
if (InputLocaleID=0x4090409)
{	
	if hcur:=LoadAniCursorIcon(&amp;hex_EN_ARROW,EN_ARROW_Size)
	DllCall(&quot;SetSystemCursor&quot;,&quot;uint&quot;,hcur,&quot;int&quot;,OCR_NORMAL)
	if hcur:=LoadAniCursorIcon(&amp;hex_EN_IBEAM,EN_IBEAM_Size)
	DllCall(&quot;SetSystemCursor&quot;,&quot;uint&quot;,hcur,&quot;int&quot;,OCR_IBEAM)
}
else
{
	if hcur:=LoadAniCursorIcon(&amp;hex_RU_ARROW,RU_ARROW_Size)
	DllCall(&quot;SetSystemCursor&quot;,&quot;uint&quot;,hcur,&quot;int&quot;,OCR_NORMAL)
	if hcur:=LoadAniCursorIcon(&amp;hex_RU_IBEAM,EN_IBEAM_Size)
	DllCall(&quot;SetSystemCursor&quot;,&quot;uint&quot;,hcur,&quot;int&quot;,OCR_IBEAM)
}
Prev_InputLocaleID:=InputLocaleID
return

LoadAniCursorIcon(pBuf,BufSize)
{
	type:=NumGet(pBuf+0,2,&quot;char&quot;) ; 0- курсор, 1-иконка, 70-анимированный курсор
	if type=70
	hcur:=DllCall(&quot;CreateIconFromResourceEx&quot;,&quot;uint&quot;,pBuf,&quot;uint&quot;,BufSize,&quot;int&quot;,0,&quot;uint&quot;,0x30000,&quot;int&quot;,0,&quot;int&quot;,0,&quot;uint&quot;,0x40)
	else if type=1
	hcur:=DllCall(&quot;CreateIconFromResourceEx&quot;,&quot;uint&quot;,pBuf+22,&quot;uint&quot;,NumGet(pBuf+0,14),&quot;int&quot;,1,&quot;uint&quot;,0x30000,&quot;int&quot;,0,&quot;int&quot;,0,&quot;uint&quot;,0x40)
	else
	{
		NumPut(NumGet(pBuf+10,0,&quot;short&quot;),pBuf+18,0,&quot;short&quot;), NumPut(NumGet(pBuf+12,0,&quot;short&quot;),pBuf+20,0,&quot;short&quot;)
		hcur:=DllCall(&quot;CreateIconFromResourceEx&quot;,&quot;uint&quot;,pBuf+18,&quot;uint&quot;,NumGet(pBuf+0,14),&quot;int&quot;,0,&quot;uint&quot;,0x30000,&quot;int&quot;,0,&quot;int&quot;,0,&quot;uint&quot;,0x40)
		
		/* альтернативный способ создания курсора или иконки с помощью CreateIconIndirect
		cw:=NumGet(pBuf+6,0,&quot;char&quot;), ch:=NumGet(pBuf+7,0,&quot;char&quot;), bmsize:=NumGet(pBuf+0,14), pbi:=pBuf+22
		NumPut(cw,pbi+4), NumPut(ch,pbi+8)
		; комбинируем значение альфа или другого цветового канала со своим значением
		Loop, % bmsize//4
		{
			alphach:=pBuf+65+A_Index*4
			NumPut(0x7f&amp;NumGet(alphach+0,0,&quot;char&quot;),alphach+0,0,&quot;char&quot;)
		}
		hdc:=DllCall(&quot;GetDC&quot;,&quot;uint&quot;,0)
		hbmColor:=DllCall(&quot;CreateDIBitmap&quot;,&quot;uint&quot;,hdc,&quot;uint&quot;,pbi,&quot;uint&quot;,4,&quot;uint&quot;,pbi+40,&quot;uint&quot;,pbi,&quot;uint&quot;,0)
		DllCall(&quot;ReleaseDC&quot;,&quot;uint&quot;,0,&quot;uint&quot;,hdc)
		biBitCount:=NumGet(pbi+14,0,&quot;short&quot;), MaskBitsOffset:=(cw*ch*biBitCount)/8
		hbmMask:=DllCall(&quot;CreateBitmap&quot;,&quot;int&quot;,cw,&quot;int&quot;,ch,&quot;uint&quot;,1,&quot;uint&quot;,1,&quot;uint&quot;,pbi+40+MaskBitsOffset)
		; переворачиваем биты маски по вертикали
		hdc:=DllCall(&quot;GetDC&quot;,&quot;uint&quot;,0)
		hmemdc:=DllCall(&quot;CreateCompatibleDC&quot;,&quot;uint&quot;,hdc)
		hprbm:=DllCall(&quot;SelectObject&quot;,&quot;uint&quot;,hmemdc,&quot;uint&quot;,hbmMask)
		DllCall(&quot;StretchBlt&quot;,&quot;uint&quot;,hmemdc,&quot;int&quot;,0,&quot;int&quot;,0,&quot;int&quot;,cw,&quot;int&quot;,ch,&quot;uint&quot;,hmemdc,&quot;int&quot;,0,&quot;int&quot;,ch,&quot;int&quot;,cw,&quot;int&quot;,-ch,&quot;uint&quot;,0xCC0020)
		DllCall(&quot;SelectObject&quot;,&quot;uint&quot;,hmemdc,&quot;uint&quot;,hprbm)
		DllCall(&quot;DeleteDC&quot;,&quot;uint&quot;,hmemdc)
		DllCall(&quot;ReleaseDC&quot;,&quot;uint&quot;,0,&quot;uint&quot;,hdc)
		VarSetCapacity(ICONINFO,20), NumPut(NumGet(pBuf+10,0,&quot;short&quot;),&amp;ICONINFO+4)
		NumPut(NumGet(pBuf+12,0,&quot;short&quot;),&amp;ICONINFO+8), NumPut(hbmMask,&amp;ICONINFO+12), NumPut(hbmColor,&amp;ICONINFO+16)
		hcur:=DllCall(&quot;CreateIconIndirect&quot;,&quot;uint&quot;,&amp;ICONINFO)
		DllCall(&quot;DeleteObject&quot;,&quot;uint&quot;,hbmMask)
		DllCall(&quot;DeleteObject&quot;,&quot;uint&quot;,hbmColor)
		*/
	}
	Return hcur
}

Hex2Bin(Byref Hex)
{
	nSize:=StrLen(Hex)//2
	VarSetCapacity(buf,nSize)
	Loop % nSize
	NumPut(&quot;0x&quot; . SubStr(Hex,2*A_Index-1,2),buf,A_Index-1,&quot;char&quot;)
	DllCall(&quot;RtlMoveMemory&quot;,&quot;uint&quot;,&amp;Hex,&quot;uint&quot;,&amp;buf,&quot;uint&quot;,nSize)
	return nSize
}</code></pre></div><p>При испытании случайным образом был обнаружен конфликт с приложением аналогичного назначения Aml Maple, пояснительный рисунок прилагается:</p><p><span class="postimg"><img src="http://s014.radikal.ru/i329/1112/50/3ecd94fdd8e3.png" alt="http://s014.radikal.ru/i329/1112/50/3ecd94fdd8e3.png" /></span></p><p>На этом история возможно не заканчивается, в следующей серии хочется увидеть exe файл способный самостоятельно загружать в себя курсоры и хранить их там в качестве ресурсов с последующим их использованием на замену стандартным системным.</p><p><a href="http://www.megaupload.com/?d=CG0E6YTA">Cursors_from_hex.zip</a></p><p>Полезные ссылки:</p><p><strong>Microsoft Windows Cursor and Icon</strong><br /><a href="http://www.iconolog.org/info/icoFormat.html">http://www.iconolog.org/info/icoFormat.html</a><br /><strong>ICO (file format)</strong><br /><a href="http://en.wikipedia.org/wiki/ICO_(file_format)">http://en.wikipedia.org/wiki/ICO_(file_format)</a><br /><strong>ICO (формат файлов)</strong><br /><a href="http://ru.wikipedia.org/wiki/ICO_(формат_файлов)">http://ru.wikipedia.org/wiki/ICO_(формат_файлов)</a></p><p><strong>What is an animated cursor</strong><br /><a href="http://www.gdgsoft.com/anituner/help/aniformat.htm">http://www.gdgsoft.com/anituner/help/aniformat.htm</a><br /><strong>The Programmer&#039;s File and Data Resource</strong><br /><a href="http://www.wotsit.org">http://www.wotsit.org</a><br /><strong>ANI (file format)</strong><br /><a href="http://en.wikipedia.org/wiki/ANI_(file_format)">http://en.wikipedia.org/wiki/ANI_(file_format)</a></p><p><strong>About Cursors </strong><br /><a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms648379(v=vs.85).aspx">http://msdn.microsoft.com/en-us/library … s.85).aspx</a><br /><strong>Windows XP icon and cursor support </strong><br /><a href="http://support.microsoft.com/kb/307213">http://support.microsoft.com/kb/307213</a><br /><strong>How To Create an Alpha Blended Cursor or Icon in Windows XP </strong><br /><a href="http://support.microsoft.com/kb/318876">http://support.microsoft.com/kb/318876</a></p><p><strong>Loading Animated Cursor from AutoHotkeySC.bin</strong><br /><a href="http://www.autohotkey.com/forum/topic75100.html">http://www.autohotkey.com/forum/topic75100.html</a><br /><strong>Crazy Scripting : Include an Icon in your script</strong><br /><a href="http://www.autohotkey.com/forum/viewtopic.php?t=33955">http://www.autohotkey.com/forum/viewtopic.php?t=33955</a><br /><strong>MakeICOBars - Create icon bar graphs for tray &amp; pic</strong><br /><a href="http://www.autohotkey.com/forum/topic25992-15.html">http://www.autohotkey.com/forum/topic25992-15.html</a><br /><strong>Menu Icons v2</strong><br /><a href="http://www.autohotkey.com/forum/topic21991.html">http://www.autohotkey.com/forum/topic21991.html</a></p>]]></content>
			<author>
				<name><![CDATA[kirtech]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26525</uri>
			</author>
			<updated>2011-12-27T00:49:55Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54993#p54993</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54838#p54838" />
			<content type="html"><![CDATA[<p>ResHacker позволяет модифицировать ресурсы через параметры командной строки:<br /></p><div class="codebox"><pre><code>ResHacker.exe -add SourceName.exe, NewName.exe, blank.cur, CURSORGROUP, BLANK, 0</code></pre></div><p>Если нужно модифицировать за один раз несколько ресурсов, то можно создать скрипт:<br /></p><div class="quotebox"><blockquote><p>[FILENAMES]<br />Exe=...\SourceName.exe<br />SaveAs=...\NewName.exe.exe<br />Log=LogName.log<br />[COMMANDS]<br />-add ...\blank.cur, CURSORGROUP, BLANK, 0</p></blockquote></div><p>И запустить:<br /></p><div class="codebox"><pre><code>ResHacker.exe -script имя_файла_скрипта</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Grey]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25792</uri>
			</author>
			<updated>2011-12-22T07:23:30Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54838#p54838</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54833#p54833" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>InFlames пишет:</cite><blockquote><p>...код там был.</p></blockquote></div><p>Был.<br /></p><div class="quotebox"><cite>creature.ws пишет:</cite><blockquote><p>Есть желание избавиться от «лишнего файла», поместив blank.cur в тело скрипта...</p></blockquote></div><p>Ну с телом скрипта <em>косяк</em> ввиду того, что функция CreateIconFromResourceEx выдаёт ноль вместо хэндла, а функция GetLastError ошибки не находит, и даже когда CreateIconFromResourceEx возвращает не ноль, то курсор отображается не корректно (поэтому только 1х1 пиксель <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> как вариант). Можно поместить курсор в ресурсы испольняемого файла после компиляции:</p><div class="codebox"><pre><code>#SingleInstance, Force

~MButton::SetSystemCursor()
~MButton Up::RestoreCursors()

SetSystemCursor()
{
   hInstance:=DllCall(&quot;GetWindowLong&quot;, &quot;Int&quot;, A_ScriptHwnd, &quot;Int&quot;, -6)
   hCursor:=DllCall(&quot;LoadCursor&quot;(A_IsUnicode ? &quot;W&quot;:&quot;A&quot;), &quot;UInt&quot;, hInstance
                                                       , &quot;Str&quot;, &quot;BLANK&quot;) ; имя ресурса которое будет задано в ResHacker&#039;e
   DllCall(&quot;SetSystemCursor&quot;, &quot;UInt&quot;, hCursor ; hcur
                            , &quot;Int&quot;, 32512) ; id - OCR_NORMAL
}

RestoreCursors()
{
   DllCall(&quot;SystemParametersInfo&quot;, &quot;UInt&quot;, 0x57 ; uiAction - SPI_SETCURSORS
                                 , &quot;UInt&quot;, 0 ; uiParam
                                 , &quot;UInt&quot;, 0 ; pvParam
                                 , &quot;UInt&quot;, 0) ; fWinIni
}</code></pre></div><p>Компилируем скрипт, и открываем исполняемый файл в ResHacker&#039;e, в пункте меню Action выбираем Add a new Resource:<br /><span class="postimg"><img src="http://i.imgur.com/3Ctov.jpg" alt="http://i.imgur.com/3Ctov.jpg" /></span><br />Задаём ему имя:<br /><span class="postimg"><img src="http://i.imgur.com/9WIhm.jpg" alt="http://i.imgur.com/9WIhm.jpg" /></span><br />Теперь ресурс добавлен, сохраняем:<br /><span class="postimg"><img src="http://i.imgur.com/eZm46.jpg" alt="http://i.imgur.com/eZm46.jpg" /></span><br />Таким способом можно поместить любой ресурс, главное правильно его использовать.</p>]]></content>
			<author>
				<name><![CDATA[Grey]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25792</uri>
			</author>
			<updated>2011-12-22T06:15:55Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54833#p54833</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54831#p54831" />
			<content type="html"><![CDATA[<p>Спасибо, теперь картина полна <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Вопрос же о методе не использующем временные файлы остаётся открытым.</p>]]></content>
			<author>
				<name><![CDATA[creature.ws]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26105</uri>
			</author>
			<updated>2011-12-21T16:50:49Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54831#p54831</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54829#p54829" />
			<content type="html"><![CDATA[<p>Вроде <a href="http://warhotkeys.googlecode.com/files/cursor%20%28hex%29.zip">этот</a> код там был.</p>]]></content>
			<author>
				<name><![CDATA[InFlames]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24849</uri>
			</author>
			<updated>2011-12-21T16:15:17Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54829#p54829</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54826#p54826" />
			<content type="html"><![CDATA[<p>Спасибо.</p>]]></content>
			<author>
				<name><![CDATA[creature.ws]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26105</uri>
			</author>
			<updated>2011-12-21T13:42:44Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54826#p54826</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54792#p54792" />
			<content type="html"><![CDATA[<p>Такой вариант создаёт ресурс в памяти:</p><div class="codebox"><pre><code>#SingleInstance, Force

IconDataHex = ; I_cross.cur
(join
000002000100202000000F00100030010000160000002800000020000000400000000100010000000
000800000000000000000000000000000000000000000000000FFFFFF000000000000000000000000
000000000000000000000000000000000000010000000100000001000000010000000100000001000
0000100000001000001FFFF0000010000000100000001000000010000000100000001000000010000
000100000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7FFFFFFD7FFFFFFD7FFFFFFD7FFFFFFD7FFFFF
FD7FFFFFFD7FFFFFFD7FFFFC01007FFDFFFF7FFC01007FFFFD7FFFFFFD7FFFFFFD7FFFFFFD7FFFFFF
D7FFFFFFD7FFFFFFD7FFFFFFC7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFF
)

VarSetCapacity(IconData, nSize:=StrLen(IconDataHex)//2)

Loop, % nSize
   NumPut(&quot;0x&quot; . SubStr(IconDataHex,2*A_Index-1, 2), IconData, A_Index-1, &quot;UChar&quot;)

~MButton::SetSystemCursor()
~MButton Up::RestoreCursors()

SetSystemCursor()
{
   global
   hCur:=DllCall(&quot;CreateIconFromResourceEx&quot;, &quot;UInt&quot;, &amp;IconData
                                           , &quot;UInt&quot;, nSize
                                           , &quot;Char&quot;, 0
                                           , &quot;UInt&quot;, 0x30000
                                           , &quot;Int&quot;, 1 ; w
                                           , &quot;Int&quot;, 1 ; h
                                           , &quot;UInt&quot;, 1)
   TrayTip,, % hCur &quot;, &quot;A_LastError
   DllCall(&quot;SetSystemCursor&quot;, &quot;Uint&quot;, hCur, &quot;Int&quot;, 32512)
}

RestoreCursors()
{
   DllCall(&quot;SystemParametersInfo&quot;, &quot;UInt&quot;, SPI_SETCURSORS:=0x57
                                 , &quot;UInt&quot;, 0
                                 , &quot;UInt&quot;, 0
                                 , &quot;UInt&quot;, 0)
}</code></pre></div><p>Тут я использовал стандартный курсор (...\Windows\Cursors\I_cross.cur), а вот если использовать тот <em>пустой</em>, то хэндл функция не возвращает, но и ошибки тоже нет.<br />Второй вариант с созданием временного файла и удалением его по выходу, работает корректно:</p><div class="codebox"><pre><code>#SingleInstance, Force
OnExit, ExitScript

IconDataHex = ; blank.cur
(join
000002000100202000000000000030010000160000002800000020000000400000000100010000000000000
100000000000000000000000000000000000000000000FFFFFF000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
)

WriteFile(&quot;blank.cur&quot;, IconDataHex)

~MButton::SetSystemCursor()
~MButton Up::RestoreCursors()

ExitScript:
   FileDelete, blank.cur
   ExitApp

WriteFile(File, Data)
{
   hFile:=DllCall(&quot;CreateFile&quot;, &quot;Str&quot;, File, &quot;Uint&quot;, 0x40000000, &quot;Uint&quot;, 0
                                                               , &quot;UInt&quot;, 0
                                                               , &quot;UInt&quot;, 4
                                                               , &quot;Uint&quot;, 0
                                                               , &quot;UInt&quot;, 0)
   Loop, % StrLen(Data)//2
      DllCall(&quot;WriteFile&quot;, &quot;UInt&quot;, hFile, &quot;UCharP&quot;, &quot;0x&quot; . SubStr(Data, 2*A_Index-1, 2)
                                        , &quot;UInt&quot;, 1, &quot;UIntP&quot;, 0, &quot;UInt&quot;, 0)
   DllCall(&quot;CloseHandle&quot;, &quot;Uint&quot;, hFile)
}

SetSystemCursor()
{
   hCur2:=DllCall(&quot;LoadCursorFromFile&quot;, &quot;Str&quot;, &quot;blank.cur&quot;)
   DllCall(&quot;SetSystemCursor&quot;, &quot;Uint&quot;, hCur2, &quot;Int&quot;, 32512)
}

RestoreCursors()
{
   DllCall(&quot;SystemParametersInfo&quot;, &quot;UInt&quot;, SPI_SETCURSORS:=0x57
                                 , &quot;UInt&quot;, 0
                                 , &quot;UInt&quot;, 0
                                 , &quot;UInt&quot;, 0)
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Grey]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25792</uri>
			</author>
			<updated>2011-12-20T02:39:28Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54792#p54792</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54784#p54784" />
			<content type="html"><![CDATA[<p>Не знаю как действие было реализовано <a href="http://forum.script-coding.com/viewtopic.php?id=5108#p41138">здесь</a>, но хотелось бы без дополнительных сущностей <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[creature.ws]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26105</uri>
			</author>
			<updated>2011-12-19T20:06:38Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54784#p54784</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54783#p54783" />
			<content type="html"><![CDATA[<p>Не создавая временный файл?</p>]]></content>
			<author>
				<name><![CDATA[ypppu]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5974</uri>
			</author>
			<updated>2011-12-19T20:03:19Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54783#p54783</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Замена системного курсора изображением хранящимся в виде Hex]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=54782#p54782" />
			<content type="html"><![CDATA[<p>По мотивам <a href="http://forum.script-coding.com/viewtopic.php?id=5108#p41138">сообщения</a><br />К сожалению, ссылки в посте выше не актуальны.</p><div class="codebox"><pre><code>
; http://www.autohotkey.com/forum/topic35600.html
#SingleInstance Force

~MButton::SetSystemCursor(A_ScriptDir &quot;\blank.cur&quot;)
~MButton Up::RestoreCursors()

SetSystemCursor(Cursor)
{
   CursorHandle := DllCall(&quot;LoadCursorFromFile&quot;, Str, Cursor)
   DllCall(&quot;SetSystemCursor&quot;, Uint, CursorHandle, Int, &quot;32512&quot;)
}

RestoreCursors()
{
   SPI_SETCURSORS := 0x57
   DllCall(&quot;SystemParametersInfo&quot;, UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
}</code></pre></div><p>Курсор: <a href="http://ompldr.org/vYnRsMQ/blank.cur">blank.cur</a></p><p>При нажатии Mbutton системный «Arrow» замещается приложенным «пустым» курсором, при отпускании – восстанавливается первоначальное состояние.</p><p>Есть желание избавиться от «лишнего файла», поместив blank.cur в тело скрипта, но нет достаточных для выполнения задачи знаний.</p><p>Как установить курсор сохранённый в виде Hex данных в переменной?</p><p>Добавлено:<br />Требуемая функциональность обеспечивается примером из справки. Модифицированный вариант:<br /></p><div class="codebox"><pre><code>Space::ToggleSystemCursor()

ToggleSystemCursor() {
    static state
    static Cursors := [
        (Join,
        [32512], [32513], [32514], [32515]
        [32516], [32642], [32643], [32644]
        [32645], [32646], [32648], [32649]
        [32650], [32651], [32641], [32640]
        )]

    (state = &quot;&quot;) &amp;&amp; InitCursors(Cursors)

    handle := (state := !state)? &quot;blank&quot;:&quot;default&quot;

    loop % Cursors.MaxIndex() {
        Cursor := Cursors[A_Index]
        hImage := CopyCursorImage(Cursor[handle])
        DllCall(&quot;SetSystemCursor&quot;
            , &quot;Ptr&quot;,  hImage
            , &quot;UInt&quot;, Cursor[1])
    }
}

InitCursors(Cursors) {
    loop % Cursors.MaxIndex() {
        Cursor := Cursors[A_Index]

        if !cursorInstance := DllCall(&quot;LoadCursor&quot;
            , &quot;Ptr&quot;, 0
            , &quot;Ptr&quot;, Cursor[1])
        {
            Cursors.Remove(A_Index)
            continue
        }

        Cursor.default := CopyCursorImage(cursorInstance)
        Cursor.blank   := CreateBlankCursor()
    }
}

CreateBlankCursor() {
    static andMask, xorMask
    static initAndMask := VarSetCapacity(andMask, 32*4, 0xFF)
    static initXorMask := VarSetCapacity(xorMask, 32*4, 0)
    return DllCall(&quot;CreateCursor&quot;
        , &quot;Ptr&quot;, 0
        , &quot;Int&quot;, 0
        , &quot;Int&quot;, 0
        , &quot;Int&quot;, 32
        , &quot;Int&quot;, 32
        , &quot;Ptr&quot;, &amp;andMask
        , &quot;Ptr&quot;, &amp;xorMask)
}

CopyCursorImage(ByRef cursorInstance) {
    return DllCall(&quot;CopyImage&quot;
        , &quot;Ptr&quot;,  cursorInstance
        , &quot;UInt&quot;, 2
        , &quot;Int&quot;,  0
        , &quot;Int&quot;,  0
        , &quot;UInt&quot;, 0)
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[creature.ws]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26105</uri>
			</author>
			<updated>2011-12-19T19:56:02Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=54782#p54782</id>
		</entry>
</feed>
