<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Передача файла в приложение методом Drag&Drop]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=7212</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=7212&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Передача файла в приложение методом Drag&Drop».]]></description>
		<lastBuildDate>Sun, 30 Sep 2018 23:19:04 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128968#p128968</link>
			<description><![CDATA[<p>Рабочий код:<br /><a href="https://autohotkey.com/boards/viewtopic.php?f=6&amp;t=56720">https://autohotkey.com/boards/viewtopic … mp;t=56720</a></p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Sun, 30 Sep 2018 23:19:04 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128968#p128968</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128891#p128891</link>
			<description><![CDATA[<p>Тема, дествительно, очень непростая.<br /><strong>qwerty12</strong> смог добиться посылать файлы с рабочего стола.<br />С путями файлы не посылаются, он предполагает, что возможно причина в этом:<br /><a href="https://stackoverflow.com/questions/31356071/how-to-make-my-file-dropsouce-be-accepted-by-all-targets-that-works-with-files/31362098#31362098">https://stackoverflow.com/questions/313 … 8#31362098</a><br />Сам он уже не пользуется виндой и shell COM интерфейсы особо не изучал, поэтому поправить не может.<br />Для теста скачиваем программу spek:<br /><a href="https://github.com/withmorten/spek-alternative/releases">https://github.com/withmorten/spek-alternative/releases</a></p><p>AtoHotkeyMini.dll<br /><a href="https://github.com/HotKeyIt/ahkdll-v1-release/tree/master/Win32w">https://github.com/HotKeyIt/ahkdll-v1-r … ter/Win32w</a></p><p>AutoHotkeyU32 loader.ahk<br /></p><div class="codebox"><pre><code>#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

Inject()

Inject()
{
	WinGet, nPid, PID, Spek - ahk_class wxWindowNR ahk_exe spek.exe
	if (nPid)
		InjectAhkDllMod(nPid, A_ScriptDir . &quot;\AutoHotkeyMini.dll&quot;, &quot;#Include &quot; . A_ScriptDir . &quot;\hook.ahk&quot;)
}

;==================================================

;[original version of InjectAhkDll]
;[SOLVED]get other process&#039;s working dir - Page 3 - Ask for Help - AutoHotkey Community
;https://autohotkey.com/board/topic/85304-solvedget-other-processs-working-dir/page-3#entry544650

;[get x64 and x32 versions of AutoHotkeyMini.dll]
;GitHub - HotKeyIt/ahkdll-v1-release: AutoHotkey_H v1 release
;https://github.com/HotKeyIt/ahkdll-v1-release

;by HotKeyIt (modified version by jeeswg to not require _Struct.ahk)
;(also added a PreventUnload parameter)

InjectAhkDllMod(PID, dll:=&quot;AutoHotkey.dll&quot;, script:=0, PreventUnload:=0)
{
	static PROCESS_ALL_ACCESS:=0x1F0FFF,MEM_COMMIT := 0x1000,MEM_RELEASE:=0x8000,PAGE_EXECUTE_READWRITE:=64
	,hKernel32:=DllCall(&quot;LoadLibrary&quot;,&quot;Str&quot;,&quot;kernel32.dll&quot;,&quot;PTR&quot;),LoadLibraryA:=DllCall(&quot;GetProcAddress&quot;,&quot;PTR&quot;,hKernel32,&quot;AStr&quot;,&quot;LoadLibraryA&quot;,&quot;PTR&quot;)
	,base:={__Call:&quot;InjectAhkDll&quot;,__Delete:&quot;InjectAhkDll&quot;},FreeLibrary:=DllCall(&quot;GetProcAddress&quot;,&quot;PTR&quot;,hKernel32,&quot;AStr&quot;,&quot;FreeLibrary&quot;,&quot;PTR&quot;)
	static TH32CS_SNAPMODULE:=0x00000008,INVALID_HANDLE_VALUE:=-1
	,MAX_PATH:=260,MAX_MODULE_NAME32:=255,ModuleName:=&quot;&quot;,init:=VarSetCapacity(ModuleName,MAX_PATH*(A_IsUnicode?2:1))

	if PreventUnload
		base:={__Call:&quot;InjectAhkDll&quot;}

	if IsObject(PID)
	{
		if (dll!=&quot;Exec&quot; &amp;&amp; script)
			return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Only Exec method can be used here!&quot;,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0)

		hProc := DllCall(&quot;OpenProcess&quot;, &quot;UInt&quot;, PROCESS_ALL_ACCESS, &quot;Int&quot;,0, &quot;UInt&quot;, PID.PID,&quot;PTR&quot;)
		if !hProc
			return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not open process for PID: &quot; PID.PID,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0)

		if (!script) ; Free Library in remote process (object is being deleted)
		{
			; Terminate the thread in ahkdll
			hThread := DllCall(&quot;CreateRemoteThread&quot;, &quot;PTR&quot;, hProc, &quot;PTR&quot;, 0, &quot;PTR&quot;, 0, &quot;PTR&quot;, PID.ahkTerminate, &quot;PTR&quot;, 0, &quot;UInt&quot;, 0, &quot;PTR&quot;, 0,&quot;PTR&quot;)
			DllCall(&quot;WaitForSingleObject&quot;, &quot;PTR&quot;, hThread, &quot;UInt&quot;, 0xFFFFFFFF)
			,DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hThread)

			; Free library in remote process
			hThread := DllCall(&quot;CreateRemoteThread&quot;, &quot;PTR&quot;, hProc, &quot;UInt&quot;, 0, &quot;UInt&quot;, 0, &quot;PTR&quot;, FreeLibrary, &quot;PTR&quot;, PID.hModule, &quot;UInt&quot;, 0, &quot;UInt&quot;, 0,&quot;PTR&quot;)
			DllCall(&quot;WaitForSingleObject&quot;, &quot;PTR&quot;, hThread, &quot;UInt&quot;, 0xFFFFFFFF)
			,DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hThread),DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hProc)
			return
		}

		nScriptLength := VarSetCapacity(nScript, (StrLen(script)+1)*(A_IsUnicode?2:1), 0)
		,StrPut(script,&amp;nScript)

		; Reserve memory in remote process where our script will be saved
		if !pBufferRemote := DllCall(&quot;VirtualAllocEx&quot;, &quot;Ptr&quot;, hProc, &quot;Ptr&quot;, 0, &quot;PTR&quot;, nScriptLength, &quot;UInt&quot;, MEM_COMMIT, &quot;UInt&quot;, PAGE_EXECUTE_READWRITE, &quot;Ptr&quot;)
			return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not reseve memory for process.&quot;,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0)
		,DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hProc)

		; Write script to remote process memory
		DllCall(&quot;WriteProcessMemory&quot;, &quot;Ptr&quot;, hProc, &quot;Ptr&quot;, pBufferRemote, &quot;Ptr&quot;, &amp;nScript, &quot;PTR&quot;, nScriptLength, &quot;Ptr&quot;, 0)

		; Start execution of code
		hThread := DllCall(&quot;CreateRemoteThread&quot;, &quot;PTR&quot;, hProc, &quot;PTR&quot;, 0, &quot;PTR&quot;, 0, &quot;PTR&quot;, PID.ahkExec, &quot;PTR&quot;, pBufferRemote, &quot;UInt&quot;, 0, &quot;PTR&quot;, 0,&quot;PTR&quot;)
		if !hThread
		{
			DllCall(&quot;VirtualFreeEx&quot;,&quot;PTR&quot;,hProc,&quot;PTR&quot;,pBufferRemote,&quot;PTR&quot;,nScriptLength,MEM_RELEASE)
			,DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hProc)
			return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not execute script in remote process.&quot;,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0)
		}

		; Wait for thread to finish
		DllCall(&quot;WaitForSingleObject&quot;, &quot;PTR&quot;, hThread, &quot;UInt&quot;, 0xFFFFFFFF)

		; Get Exit code returned by ahkExec (1 = script could be executed / 0 = script could not be executed)
		DllCall(&quot;GetExitCodeThread&quot;, &quot;PTR&quot;, hThread, &quot;UIntP&quot;, lpExitCode)
		if !lpExitCode
			return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not execute script in remote process.&quot;,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0)

		DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hThread)
		,DllCall(&quot;VirtualFreeEx&quot;,&quot;PTR&quot;,hProc,&quot;PTR&quot;,pBufferRemote,&quot;PTR&quot;,nScriptLength,MEM_RELEASE)
		,DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hProc)
		return
	}
	else if !hDll:=DllCall(&quot;LoadLibrary&quot;,&quot;Str&quot;,dll,&quot;PTR&quot;)
		return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not find &quot; dll &quot; library.&quot;,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0),DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hProc)
	else
	{
		hProc := DllCall(&quot;OpenProcess&quot;,&quot;UInt&quot;, PROCESS_ALL_ACCESS, &quot;Int&quot;,0,&quot;UInt&quot;, DllCall(&quot;GetCurrentProcessId&quot;),&quot;PTR&quot;)
		DllCall(&quot;GetModuleFileName&quot;,&quot;PTR&quot;,hDll,&quot;PTR&quot;,&amp;ModuleName,&quot;UInt&quot;,MAX_PATH)
		DllCall(&quot;CloseHandle&quot;,&quot;PTR&quot;,hProc)
	}
	; Open Process to PID
	hProc := DllCall(&quot;OpenProcess&quot;, &quot;UInt&quot;, PROCESS_ALL_ACCESS, &quot;Int&quot;,0, &quot;UInt&quot;, PID,&quot;PTR&quot;)
	if !hProc
		return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not open process for PID: &quot; PID,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0)

	; Reserve some memory and write dll path (ANSI)
	nDirLength := VarSetCapacity(nDir, StrLen(dll)+1, 0)
	,StrPut(dll,&amp;nDir,&quot;CP0&quot;)

	; Reserve memory in remote process
	if !pBufferRemote := DllCall(&quot;VirtualAllocEx&quot;, &quot;Ptr&quot;, hProc, &quot;Ptr&quot;, 0, &quot;PTR&quot;, nDirLength, &quot;UInt&quot;, MEM_COMMIT, &quot;UInt&quot;, PAGE_EXECUTE_READWRITE, &quot;Ptr&quot;)
		return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not reseve memory for process.&quot;,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0),DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hProc)

	; Write dll path to remote process memory
	DllCall(&quot;WriteProcessMemory&quot;, &quot;Ptr&quot;, hProc, &quot;Ptr&quot;, pBufferRemote, &quot;Ptr&quot;, &amp;nDir, &quot;PTR&quot;, nDirLength, &quot;Ptr&quot;, 0)

	; Start new thread loading our dll

	hThread:=DllCall(&quot;CreateRemoteThread&quot;,&quot;PTR&quot;,hProc,&quot;PTR&quot;,0,&quot;PTR&quot;,0,&quot;PTR&quot;,LoadLibraryA,&quot;PTR&quot;,pBufferRemote,&quot;UInt&quot;,0,&quot;PTR&quot;,0,&quot;PTR&quot;)
	if !hThread
	{
		DllCall(&quot;VirtualFreeEx&quot;,&quot;PTR&quot;,hProc,&quot;PTR&quot;,pBufferRemote,&quot;PTR&quot;,nDirLength,&quot;Uint&quot;,MEM_RELEASE)
		,DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hProc)
		return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not load &quot; dll &quot; in remote process.&quot;,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0)
	}
	; Wait for thread to finish
	DllCall(&quot;WaitForSingleObject&quot;, &quot;PTR&quot;, hThread, &quot;UInt&quot;, 0xFFFFFFFF)

	; Get Exit code returned by thread (HMODULE for our dll)
	DllCall(&quot;GetExitCodeThread&quot;, &quot;PTR&quot;, hThread, &quot;UInt*&quot;, hModule)

	; Close Thread
	DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hThread)

	if (A_PtrSize=8)
	{ ; use different method to retrieve base address because GetExitCodeThread returns DWORD only
		hModule:=0,VarSetCapacity(me32, (A_PtrSize=8?48:32)+(A_IsUnicode?1032:516), 0) ;W:1080:1064, A:564:548
		;  Take a snapshot of all modules in the specified process.
		hModuleSnap := DllCall(&quot;CreateToolhelp32Snapshot&quot;,&quot;UInt&quot;, TH32CS_SNAPMODULE,&quot;UInt&quot;, PID, &quot;PTR&quot; )
		if ( hModuleSnap != INVALID_HANDLE_VALUE )
		{
			; reset hModule and set the size of the structure before using it.
			NumPut((A_PtrSize=8?48:32)+(A_IsUnicode?1032:516), &amp;me32, 0, &quot;UInt&quot;) ;dwSize  ;W:1080:1064, A:564:548
			;  Retrieve information about the first module,
			;  and exit if unsuccessful
			if ( !DllCall(&quot;Module32First&quot; (A_IsUnicode?&quot;W&quot;:&quot;&quot;),&quot;PTR&quot;, hModuleSnap,&quot;PTR&quot;, &amp;me32 ) )
			{
				; Free memory used for passing dll path to remote thread
				DllCall(&quot;VirtualFreeEx&quot;,&quot;PTR&quot;,hProc,&quot;PTR&quot;,pBufferRemote,&quot;PTR&quot;,nDirLength,MEM_RELEASE)
				,DllCall(&quot;CloseHandle&quot;,&quot;PTR&quot;, hModuleSnap ) ; Must clean up the snapshot object!
				return false
			}
			;  Now walk the module list of the process,and display information about each module
			while(A_Index=1 || DllCall(&quot;Module32Next&quot; (A_IsUnicode?&quot;W&quot;:&quot;&quot;),&quot;PTR&quot;,hModuleSnap,&quot;PTR&quot;, &amp;me32 ) )
				if (StrGet(&amp;me32+(A_PtrSize=8?48:32)+(A_IsUnicode?512:256))=dll) ;szExePath ;W:560:544, A:304:288
				{
					hModule := NumGet(me32, A_PtrSize=8?40:28, &quot;Ptr&quot;) ;hModule
					break
				}
			DllCall(&quot;CloseHandle&quot;,&quot;PTR&quot;,hModuleSnap) ; clean up
		}
	}

	hDll:=DllCall(&quot;LoadLibrary&quot;,&quot;Str&quot;,dll,&quot;PTR&quot;)

	; Calculate pointer to ahkdll and ahkExec functions
	ahktextdll:=hModule+DllCall(&quot;GetProcAddress&quot;,&quot;PTR&quot;,hDll,&quot;AStr&quot;,&quot;ahktextdll&quot;,&quot;PTR&quot;)-hDll
	ahkExec:=hModule+DllCall(&quot;GetProcAddress&quot;,&quot;PTR&quot;,hDll,&quot;AStr&quot;,&quot;ahkExec&quot;,&quot;PTR&quot;)-hDll
	if !PreventUnload
		ahkTerminate:=hModule+DllCall(&quot;GetProcAddress&quot;,&quot;PTR&quot;,hDll,&quot;AStr&quot;,&quot;ahkTerminate&quot;,&quot;PTR&quot;)-hDll

	if script
	{
		nScriptLength := VarSetCapacity(nScript, (StrLen(script)+1)*(A_IsUnicode?2:1), 0)
		,StrPut(script,&amp;nScript)
		; Reserve memory in remote process where our script will be saved
		if !pBufferScript := DllCall(&quot;VirtualAllocEx&quot;, &quot;Ptr&quot;, hProc, &quot;Ptr&quot;, 0, &quot;PTR&quot;, nScriptLength, &quot;UInt&quot;, MEM_COMMIT, &quot;UInt&quot;, PAGE_EXECUTE_READWRITE, &quot;Ptr&quot;)
			return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not reseve memory for process.&quot;,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0)
		,DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hProc)

		; Write script to remote process memory
		DllCall(&quot;WriteProcessMemory&quot;, &quot;Ptr&quot;, hProc, &quot;Ptr&quot;, pBufferScript, &quot;Ptr&quot;, &amp;nScript, &quot;PTR&quot;, nScriptLength, &quot;Ptr&quot;, 0)
	}
	else
		pBufferScript:=0

	; Run ahkdll function in remote thread
	hThread := DllCall(&quot;CreateRemoteThread&quot;,&quot;PTR&quot;,hProc,&quot;PTR&quot;,0,&quot;PTR&quot;,0,&quot;PTR&quot;,ahktextdll,&quot;PTR&quot;,pBufferScript,&quot;PTR&quot;,0,&quot;UInt&quot;,0,&quot;PTR&quot;)
	if !hThread
	{ ; could not start ahkdll in remote process
		; Free memory used for passing dll path to remote thread
		DllCall(&quot;VirtualFreeEx&quot;,&quot;PTR&quot;,hProc,&quot;PTR&quot;,pBufferRemote,&quot;PTR&quot;,nDirLength,MEM_RELEASE)
		DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hProc)
		return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not start ahkdll in remote process&quot;,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0)
	}
	DllCall(&quot;WaitForSingleObject&quot;, &quot;PTR&quot;, hThread, &quot;UInt&quot;, 0xFFFFFFFF)
	DllCall(&quot;GetExitCodeThread&quot;, &quot;PTR&quot;, hThread, &quot;UIntP&quot;, lpExitCode)

	; Release memory and handles
	DllCall(&quot;VirtualFreeEx&quot;,&quot;PTR&quot;,hProc,&quot;PTR&quot;,pBufferRemote,&quot;PTR&quot;,nDirLength,MEM_RELEASE)
	DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hThread)
	DllCall(&quot;CloseHandle&quot;, &quot;PTR&quot;, hProc)

	if PreventUnload &amp;&amp; hDll
		DllCall(FreeLibrary, &quot;Ptr&quot;, hDll), hDll := 0

	if !lpExitCode ; thread could not be created.
		return DllCall(&quot;MessageBox&quot;,&quot;PTR&quot;,0,&quot;Str&quot;,&quot;Could not create a thread in remote process&quot;,&quot;STR&quot;,&quot;Error&quot;,&quot;UInt&quot;,0)

	if PreventUnload
		return true
	return {PID:PID,hModule:hModule,ahkExec:ahkExec,ahkTerminate:ahkTerminate,base:base}
}

;==================================================</code></pre></div><p>hook.ahk<br /></p><div class="codebox"><pre><code>;note: qwerty12 called it WM_JEEDND (not jeeswg)

#NoEnv
#Persistent
#NoTrayIcon
SetBatchLines, -1
;DetectHiddenWindows On

main(), return

main()
{
	global WM_JEEDND := DllCall(&quot;RegisterWindowMessage&quot;, &quot;Str&quot;, &quot;WM_JEEDND&quot;, &quot;UInt&quot;), msgHookCb, msgHook, hWnd

	if ((msgHookCb := RegisterCallback(&quot;CallWndProc&quot;, &quot;Fast&quot;))) {
		OnExit(&quot;AtExit&quot;)
		if ((hWnd := WinExist(&quot;Spek - ahk_class wxWindowNR ahk_exe spek.exe ahk_pid &quot; . DllCall(&quot;GetCurrentProcessId&quot;, &quot;UInt&quot;))) &amp;&amp; (tId := DllCall(&quot;GetWindowThreadProcessId&quot;, &quot;Ptr&quot;, hWnd, &quot;Ptr&quot;, 0, &quot;UInt&quot;)))
			msgHook := DllCall(&quot;SetWindowsHookEx&quot;, &quot;Int&quot;, WH_CALLWNDPROC := 4, &quot;Ptr&quot;, msgHookCb, &quot;Ptr&quot;, 0, &quot;UInt&quot;, tId, &quot;Ptr&quot;)
	}
}

AtExit()
{
	global msgHook, msgHookCb
	OnExit(A_ThisFunc, 0)

	if (msgHook)
		DllCall(&quot;UnhookWindowsHookEx&quot;, &quot;Ptr&quot;, msgHook), msgHook := 0

	if (msgHookCb)
		DllCall(&quot;GlobalFree&quot;, &quot;Ptr&quot;, msgHookCb, &quot;Ptr&quot;), msgHookCb := 0

	return 0
}

CallWndProc(nCode, wParam, lParam)
{
	Critical 999
	global msgHook, WM_JEEDND, hWnd
	PassToChain := True

	if (nCode &gt;= 0) { ; HC_ACTION
		;msgLparam := NumGet(lParam+0,, &quot;Ptr&quot;)
		msg := NumGet(lParam+0, A_PtrSize * 2, &quot;UInt&quot;)
		msghWnd := NumGet(lParam+0, A_PtrSize * 3, &quot;Ptr&quot;)

		if (msg == WM_JEEDND &amp;&amp; msghWnd == hWnd) {
			PassToChain := False
			msgWparam := NumGet(lParam+0, A_PtrSize, &quot;Ptr&quot;)
			if (msgWparam)
				DoDnd([StrGet(msgWparam,, &quot;UTF-16&quot;)])
		}
	}

	return PassToChain ? DllCall(&quot;CallNextHookEx&quot;, &quot;Ptr&quot;, msgHook, &quot;Int&quot;, nCode, &quot;Ptr&quot;, wParam, &quot;Ptr&quot;, lParam, &quot;Ptr&quot;) : 0
}

DoDnd(filenames)
{
	; qwerty12
	global hWnd
	static IID_IDataObject
	ret := False

	if (!IsObject(filenames) || !filenames.MaxIndex() || !filenames[1])
		return ret

	if (!(pUnk := DllCall(&quot;GetProp&quot;, &quot;Ptr&quot;, hWnd, &quot;Str&quot;, &quot;OleDropTargetInterface&quot;, &quot;Ptr&quot;)))
		return ret

	if (!VarSetCapacity(IID_IDataObject))
		VarSetCapacity(IID_IDataObject, 16)
		,DllCall(&quot;ole32\CLSIDFromString&quot;, &quot;WStr&quot;, &quot;{0000010e-0000-0000-C000-000000000046}&quot;, &quot;Ptr&quot;, &amp;IID_IDataObject)

	DllCall(&quot;shell32\SHGetDesktopFolder&quot;, &quot;Ptr*&quot;, pDesktop)
	if (pDesktop) {
		pDropTarget := ComObjQuery(pUnk, &quot;{00000122-0000-0000-C000-000000000046}&quot;)

		VarSetCapacity(pidl_list, filenames.MaxIndex() * A_PtrSize)
		filenameCount := 0, ParseDisplayName := NumGet(NumGet(pDesktop+0)+3*A_PtrSize)
		for _, filename in filenames
			filenameCount += DllCall(ParseDisplayName, &quot;Ptr&quot;, pDesktop, &quot;Ptr&quot;, 0, Ptr, 0, &quot;WStr&quot;, filename, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, &amp;pidl_list+(filenameCount * A_PtrSize), &quot;Ptr&quot;, 0) &gt;= 0x00
		if (filenameCount) {
			DllCall(NumGet(NumGet(pDesktop+0)+10*A_PtrSize), &quot;Ptr&quot;, pDesktop, &quot;Ptr&quot;, 0, &quot;UInt&quot;, filenameCount, &quot;Ptr&quot;, &amp;pidl_list, &quot;Ptr&quot;, &amp;IID_IDataObject, &quot;Ptr&quot;, 0, &quot;Ptr*&quot;, pDataObject) ; GetUIObjectOf
			if (pDataObject) {
				DllCall(NumGet(NumGet(pDropTarget+0)+3*A_PtrSize), &quot;Ptr&quot;, pDropTarget, &quot;Ptr&quot;, pDataObject, &quot;UInt&quot;, 0, &quot;Int64&quot;, 0, &quot;UInt*&quot;, 1) ; DragEnter
				ret := DllCall(NumGet(NumGet(pDropTarget+0)+6*A_PtrSize), &quot;Ptr&quot;, pDropTarget, &quot;Ptr&quot;, pDataObject, &quot;UInt&quot;, 0, &quot;Int64&quot;, 0, &quot;UInt*&quot;, 1) &gt;= 0x00 ; Drop
				ObjRelease(pDataObject)
			}
			Loop %filenameCount% {
				if ((pidl := NumGet(pidl_list, (A_Index - 1) * A_PtrSize, &quot;Ptr&quot;)))
					DllCall(&quot;ole32\CoTaskMemFree&quot;, &quot;Ptr&quot;, pidl)
			}
		}

		for _, obj in [pDropTarget, pDesktop]
			ObjRelease(obj)
	}

	return ret
}</code></pre></div><p>test.ahk<br /></p><div class="codebox"><pre><code>;notes from qwerty12:
;•This &quot;drags&quot; one file only. Spek isn&#039;t exactly expecting more than one file to be dragged to it. DoDnd(filenames) is multi-filename ready, you need to modify the script sending the filenames with a suitable scheme (multiple files delimited by &quot;|&quot;) and the hook function receiving the files to reconstruct a suitable list (StrSplit(&quot;|&quot;,...). Saying that, I have no idea if this actually works for multiple files.
;•Allocating and freeing the filename string is handled by the script sending the message only. This removes any ambiguity as to what should free the string
;•You aren&#039;t notified if the DnD operation succeeded - the hook allows for no way for the return value to be set, DoDnD&#039;s ret value is for show. SendMessage is used to try and make sure the filename string isn&#039;t freed too early. Depending on how many filenames you send, SendMessage&#039;s default timeout of 5 seconds might be too low
;•None of just me&#039;s code was used, so that&#039;s one less dependency. The shell already has a suitable IDataObject implementation.

#NoTrayIcon
#NoEnv

WM_JEEDND := DllCall(&quot;RegisterWindowMessage&quot;, &quot;Str&quot;, &quot;WM_JEEDND&quot;, &quot;UInt&quot;)
; filenames := A_Desktop &quot;\music.mp3&quot; ; don`t work
filenames := &quot;music.mp3&quot;

hWnd := WinExist(&quot;Spek - ahk_class wxWindowNR ahk_exe spek.exe&quot;)
WinGet, nPid, PID, % &quot;ahk_id &quot; hWnd

if (!(hProcess := DllCall(&quot;OpenProcess&quot;, &quot;UInt&quot;, PROCESS_QUERY_INFORMATION := 0x0400 | PROCESS_VM_OPERATION := 0x0008 | PROCESS_VM_READ := 0x0010 | PROCESS_VM_WRITE := 0x0020, &quot;Int&quot;, False, &quot;UInt&quot;, nPid, &quot;Ptr&quot;)))
	throw

if (!(pRemoteFilenames := DllCall(&quot;VirtualAllocEx&quot;, &quot;Ptr&quot;, hProcess, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, (StrLen(filenames) + 1) * 2, &quot;UInt&quot;, MEM_COMMIT := 0x00001000, &quot;UInt&quot;, PAGE_READWRITE := 0x04, &quot;Ptr&quot;)))
	throw

if (!DllCall(&quot;WriteProcessMemory&quot;, &quot;Ptr&quot;, hProcess, &quot;Ptr&quot;, pRemoteFilenames, &quot;Ptr&quot;, &amp;filenames, &quot;Ptr&quot;, (StrLen(filenames) + 1) * 2, &quot;Ptr&quot;, 0)) ; the hook assumes UTF-16 filenames. Bear that in mind
	throw

SendMessage, % WM_JEEDND, % pRemoteFilenames,,, % &quot;ahk_id &quot; hWnd

DllCall(&quot;VirtualFreeEx&quot;, &quot;Ptr&quot;, hProcess, &quot;Ptr&quot;, pRemoteFilenames, &quot;Ptr&quot;, 0, &quot;UInt&quot;, MEM_RELEASE := 0x8000)
DllCall(&quot;CloseHandle&quot;, &quot;Ptr&quot;, hProcess)</code></pre></div><p>В test.ahk изменяем filenames := &quot;music.mp3&quot; на свой mp3 находящийся на десктопе.<br />Запускаем spek.exe, потом AutoHotkeyU32 loader.ahk, потом test.ahk.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Fri, 28 Sep 2018 10:17:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128891#p128891</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128759#p128759</link>
			<description><![CDATA[<p>Да. Либо через WM_DROPFILES либо через IDropTarget.<br /><a href="https://docs.microsoft.com/en-us/windows/desktop/api/oleidl/nn-oleidl-idroptarget">https://docs.microsoft.com/en-us/window … droptarget</a><br />Посылание LVM_INSERTITEM тут не поможет, так как это будет просто изменение в гуи.<br />IDropTarget обсуждается тут и <strong>jeeswg</strong> вроде выложит наработки через пару дней.<br /><a href="https://autohotkey.com/boards/viewtopic.php?f=5&amp;t=8700">https://autohotkey.com/boards/viewtopic … amp;t=8700</a></p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Tue, 18 Sep 2018 08:20:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128759#p128759</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128756#p128756</link>
			<description><![CDATA[<p>Спасибо за информацию, буду разбираться.<br />Похоже, всё сложнее, чем казалось, разные программы по разному принимают файлы.</p>]]></description>
			<author><![CDATA[null@example.com (Aslan)]]></author>
			<pubDate>Mon, 17 Sep 2018 20:26:32 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128756#p128756</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128712#p128712</link>
			<description><![CDATA[<div class="quotebox"><cite>Aslan пишет:</cite><blockquote><p>Именно такой записи в логах не встретил.</p></blockquote></div><p>А она может быть и не такой.<br />Смотрите по хексу.<br /><a href="https://www.geoffchappell.com/studies/windows/shell/comctl32/controls/listview/messages/index.htm">https://www.geoffchappell.com/studies/w … /index.htm</a><br /></p><div class="quotebox"><cite>Aslan пишет:</cite><blockquote><p>На всякий случай попробовал заменять в функции 0x233 на те коды сообщений</p></blockquote></div><p>Так не получится, так как передаваемые структуры разные.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Sun, 16 Sep 2018 07:06:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128712#p128712</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128706#p128706</link>
			<description><![CDATA[<p>Функция у меня работает, хоть и составлена не совсем корректно. Мой вариант:<br /></p><div class="codebox"><pre><code>DropFiles(fileList, windowTitle := &quot;&quot;, ctrl := &quot;&quot;, x := 0, y := 0, NC := 0, isUnicodeFiles := 0)  {
   fileList := Trim( RegExReplace(fileList, &quot;\R&quot;, &quot;`n&quot;), &quot; `t`r`n&quot; ), RegExReplace(fileList, &quot;\R&quot;, &quot;&quot;, count)
   VarSetCapacity(DROPFILES, size := 20 + StrLen(fileList) + count + 2, 0)
   NumPut(20, DROPFILES)
   NumPut(x, DROPFILES, 4)
   NumPut(y, DROPFILES, 8)
   NumPut(NC, DROPFILES, 12)
   NumPut(isUnicodeFiles, DROPFILES, 16)
   
   prevLen := 0
   Loop, parse, fileList, `n
      prevLen += StrPut( A_LoopField, &amp;DROPFILES + 20 + prevLen + A_Index - 1, StrLen(A_LoopField), &quot;CP0&quot; )
   
   hDrop := DllCall(&quot;GlobalAlloc&quot;, UInt, 0x42, Ptr, size, Ptr)
   pData := DllCall(&quot;GlobalLock&quot;, Ptr, hDrop, Ptr)
   DllCall(&quot;RtlMoveMemory&quot;, Ptr, pData, Ptr, &amp;DROPFILES, Ptr, size)
   DllCall(&quot;GlobalUnlock&quot;, Ptr, hDrop)
   PostMessage, WM_DROPFILES := 0x233, hDrop,, % ctrl, % windowTitle
}</code></pre></div><p>Для проверки запустите сначала такой скрипт:<br /></p><div class="codebox"><pre><code>WM_DROPFILES := 0x233, WS_EX_ACCEPTFILES := 0x10

Gui, +AlwaysOnTop
Gui, Margin, 10, 10
Gui, Font, s12 q5, calibri
Gui, Add, Text, y70 h70 Border +E%WS_EX_ACCEPTFILES%, % &quot;   ↓ Перетащите сюда файлы ↓   &quot;
OnMessage(0x233, &quot;WM_DROPFILES&quot;)
Gui, Show, y100, Drop Files Test
Return

GuiClose:
   ExitApp

WM_DROPFILES(hDrop)  {
   countFiles := DllCall(&quot;Shell32\DragQueryFile&quot;, Ptr, hDrop, UInt, 0xFFFFFFFF, Ptr, 0, UInt, 0)
   Loop % countFiles  {
      size := DllCall(&quot;Shell32\DragQueryFile&quot;, Ptr, hDrop, UInt, A_Index - 1, Ptr, 0, UInt, 0)
      VarSetCapacity(buff, size + 1, 0)
      DllCall(&quot;Shell32\DragQueryFile&quot;, Ptr, hDrop, UInt, A_Index - 1, Ptr, &amp;buff, UInt, size + 1)
      fileNames .= (fileNames = &quot;&quot; ? &quot;&quot; : &quot;`r`n&quot;) . StrGet(&amp;buff, &quot;CP0&quot;)
   }
   DllCall(&quot;Shell32\DragFinish&quot;, Ptr, hDrop)
   timer := Func(&quot;ShowFileNames&quot;).Bind(fileNames)
   SetTimer, % timer, -10
}

ShowFileNames(fileNames)  {
   MsgBox, % fileNames
}</code></pre></div><p>В появившееся окно можно перетаскивать файлы вручную, если опускать их в выделенную область, в ответ будет появляться Message Box со списком файлов.<br />Не завершая первый скрипт, запустите такой:<br /></p><div class="codebox"><pre><code>fileList =
(
%A_WinDir%
%A_ProgramFiles%
%A_Temp%
)

DropFiles(fileList, &quot;Drop Files Test&quot;, &quot;Static1&quot;)

DropFiles(fileList, windowTitle := &quot;&quot;, ctrl := &quot;&quot;, x := 0, y := 0, NC := 0, isUnicodeFiles := 0)  {
   fileList := Trim( RegExReplace(fileList, &quot;\R&quot;, &quot;`n&quot;), &quot; `t`r`n&quot; ), RegExReplace(fileList, &quot;\R&quot;, &quot;&quot;, count)
   VarSetCapacity(DROPFILES, size := 20 + StrLen(fileList) + count + 2, 0)
   NumPut(20, DROPFILES)
   NumPut(x, DROPFILES, 4)
   NumPut(y, DROPFILES, 8)
   NumPut(NC, DROPFILES, 12)
   NumPut(isUnicodeFiles, DROPFILES, 16)
   
   prevLen := 0
   Loop, parse, fileList, `n
      prevLen += StrPut( A_LoopField, &amp;DROPFILES + 20 + prevLen + A_Index - 1, StrLen(A_LoopField), &quot;CP0&quot; )
   
   hDrop := DllCall(&quot;GlobalAlloc&quot;, UInt, 0x42, Ptr, size, Ptr)
   pData := DllCall(&quot;GlobalLock&quot;, Ptr, hDrop, Ptr)
   DllCall(&quot;RtlMoveMemory&quot;, Ptr, pData, Ptr, &amp;DROPFILES, Ptr, size)
   DllCall(&quot;GlobalUnlock&quot;, Ptr, hDrop)
   PostMessage, WM_DROPFILES := 0x233, hDrop,, % ctrl, % windowTitle
}</code></pre></div><p>Первый скрипт должен показать список указанных папок.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 15 Sep 2018 23:02:44 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128706#p128706</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128704#p128704</link>
			<description><![CDATA[<p>Попробую.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 15 Sep 2018 21:02:39 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128704#p128704</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128703#p128703</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Трудно сказать, не имея вашей программы.</p></blockquote></div><p>Как я написал выше - безрезультатно пробовал передачу файлов на контролы <span class="bbu">разных</span> программ (указываю wTitle - всё работает, указываю wTitle и Ctrl - не работает).</p><p>Подскажите по тем программам, которые у вас есть.<br />В какой-нибудь программе (ссылочку на неё или название) работает передача файлов скриптом на определённый контрол этой программы? И как выглядит правильная запись передачи файлов именно на контрол? (примеров с подобным использованием функции не нашёл, свои тщетные попытки записи выложил выше).</p><div class="quotebox"><cite>Malcev пишет:</cite><blockquote><p><strong>Aslan</strong>, посмотрите через spy++, что отправляется окну при перетаскивани.<br />Раз это ListView, то возможно отправляется LVM_INSERTITEM.</p></blockquote></div><p>Для разных программ генерируются разное во время отпускания перетаскиваемого файла. Именно такой записи в логах не встретил.<br />На всякий случай попробовал заменять в функции 0x233 на те коды сообщений, которые отправляются во время отпускания файла - не сработало.</p>]]></description>
			<author><![CDATA[null@example.com (Aslan)]]></author>
			<pubDate>Sat, 15 Sep 2018 20:58:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128703#p128703</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128702#p128702</link>
			<description><![CDATA[<p><strong>Aslan</strong>, посмотрите через spy++, что отправляется окну при перетаскивани.<br />Раз это ListView, то возможно отправляется LVM_INSERTITEM.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Sat, 15 Sep 2018 20:43:39 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128702#p128702</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128697#p128697</link>
			<description><![CDATA[<p>Трудно сказать, не имея вашей программы.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 15 Sep 2018 17:53:53 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128697#p128697</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128696#p128696</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Там же координаты есть. Попробуйте указать координаты внутри контрола, отличные от 0.</p></blockquote></div><p>Пробовал так:<br />DropFiles( FileList, &quot;ahk_exe EncryptCare.exe&quot;, &quot;TListView1&quot;, 100, 100 )<br />Пробовал указать координаты внутри всего окна:<br />DropFiles( FileList, &quot;ahk_exe EncryptCare.exe&quot;,, 300, 300 )<br />Не срабатывает.</p><p>Пробовал предварительно ControlFocus, ControlClick делать, определять Hwnd контрола и передавать его... безрезультатно.</p><p>Многие программы умеют принимать файлы при перетаскивании на любое место окна. Но если для них указываю определённый контрол, то файлы тоже не принимаются.<br />Или эта возможность в функции вообще недоделана и не работает (или и не должна работать) или я что-то неправильно записываю?</p>]]></description>
			<author><![CDATA[null@example.com (Aslan)]]></author>
			<pubDate>Sat, 15 Sep 2018 15:58:39 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128696#p128696</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128695#p128695</link>
			<description><![CDATA[<p>Там же координаты есть. Попробуйте указать координаты внутри контрола, отличные от 0.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 15 Sep 2018 14:07:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128695#p128695</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=128693#p128693</link>
			<description><![CDATA[<p><a href="https://autohotkey.com/board/topic/41467-make-ahk-drop-files-into-other-applications/page-2">Обновлённая версия</a> с поддержкой юникода.</p><p>На окно - замечательно работает. А как перетянуть файлы не на окно, а на определённый контрол окна?<br />Есть утилитка <a href="http://www.glorylogic.com/encrypt-care.html">EncryptCare</a>, она принимает файлы только при перетаскивании на TListView1. Пытаюсь сделать так:<br />DropFiles( FileList, &quot;ahk_exe EncryptCare.exe&quot;, &quot;TListView1&quot; )<br />Не работает.</p>]]></description>
			<author><![CDATA[null@example.com (Aslan)]]></author>
			<pubDate>Sat, 15 Sep 2018 12:26:03 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=128693#p128693</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=72020#p72020</link>
			<description><![CDATA[<div class="codebox"><pre><code>DropFiles(ByRef fileList, windowTitle := &quot;&quot;, ctrl := &quot;&quot;, x := 0, y := 0, NC := 0) {
    offset := 20
    VarSetCapacity(dropFiles, StrLen(fileList) + offset + 2, 0)
    pDropFiles := &amp;dropFiles

    loop parse, fileList, `n, `r
        StrPut(A_LoopField, pDropFiles + offset, StrLen(A_LoopField), &quot;CP0&quot;)
        , offset += StrLen(A_LoopField) + 1

    NumPut(20, pDropFiles + 0, &quot;UInt&quot;)
    NumPut(x,  pDropFiles + 4, &quot;UInt&quot;)
    NumPut(y,  pDropFiles + 8, &quot;UInt&quot;)
    NumPut(NC, pDropFiles + 12, &quot;UInt&quot;)
    NumPut(0,  pDropFiles + 16, &quot;UInt&quot;)

    size := offset + 1
    hDrop := DllCall(&quot;GlobalAlloc&quot;, &quot;UInt&quot;, 0x42, &quot;UInt&quot;, size, &quot;Ptr&quot;)
    pData := DllCall(&quot;GlobalLock&quot;, &quot;Ptr&quot;, hDrop, &quot;Ptr&quot;)
    DllCall(&quot;RtlMoveMemory&quot;, &quot;Ptr&quot;, pData, &quot;Ptr&quot;, pDropFiles, &quot;UInt&quot;, size)
    DllCall(&quot;GlobalUnlock&quot;, &quot;Ptr&quot;, hDrop)

    PostMessage 0x233, hDrop, 0, %ctrl%, %windowTitle%
}</code></pre></div><p>Или так, но 3 байта, кажется, не значат много <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (creature.ws)]]></author>
			<pubDate>Sat, 11 May 2013 11:39:48 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=72020#p72020</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Передача файла в приложение методом Drag&Drop]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=72018#p72018</link>
			<description><![CDATA[<p>Работает. Раньше приходилось передавать по одному. <br />То есть функция в исправленном виде выглядит:<br /></p><div class="codebox"><pre><code>
DropFilesA( FileList, wTitle=&quot;&quot;, Ctrl=&quot;&quot;, X=0, Y=0, NCA=0 )
{
    offset := 20
    VarSetCapacity(dropFiles, StrPut(fileList) + offset + 2, 0)
    loop parse, fileList, `n, `r
        StrPut(A_LoopField, &amp;dropFiles + offset, StrLen(A_LoopField), &quot;CP0&quot;)
        , offset += StrLen(A_LoopField) + 1
    NumPut(0, &amp;DROPFILES + offset, &quot;UInt&quot;)   ; завершиться должно 2-мя нулями подряд
    nSize := offset + 4
    pDP:=&amp;DROPFILES
    NumPut(20, pDP+0, &quot;UInt&quot;)
    NumPut(X, pDP+4, &quot;UInt&quot;)
    NumPut(Y, pDP+8, &quot;UInt&quot;)
    NumPut(NCA, pDP+12, &quot;UInt&quot;)
    NumPut(0, pDP+16, &quot;UInt&quot;)
    hDrop := DllCall( &quot;GlobalAlloc&quot;, UInt, 0x42, UInt, nSize, Ptr )
    pData := DllCall( &quot;GlobalLock&quot;, Ptr, hDrop, Ptr )
    DllCall( &quot;RtlMoveMemory&quot;, Ptr, pData, Ptr, pDP, UInt, nSize )
    DllCall( &quot;GlobalUnlock&quot;, Ptr, hDrop )
    PostMessage, 0x233, hDrop, 0, %Ctrl%, %wTitle% ; WM_DROPFILES := 0x233
}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sat, 11 May 2013 11:09:51 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=72018#p72018</guid>
		</item>
	</channel>
</rss>
