<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=6231</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=6231&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Запуск скрипта не по кнопке, а при событии создания файла».]]></description>
		<lastBuildDate>Wed, 07 Jun 2023 13:56:55 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=158491#p158491</link>
			<description><![CDATA[<p>Но зато события не теряются.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Wed, 07 Jun 2023 13:56:55 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=158491#p158491</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=158490#p158490</link>
			<description><![CDATA[<p>Та функция мне не нравится тем, что там не используется полноценно механизм событий, там таймер.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 07 Jun 2023 13:40:47 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=158490#p158490</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=158488#p158488</link>
			<description><![CDATA[<p>Тогда проще watchfolder использовать:<br /><a href="https://www.autohotkey.com/boards/viewtopic.php?t=8384">https://www.autohotkey.com/boards/viewtopic.php?t=8384</a></p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Wed, 07 Jun 2023 12:05:01 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=158488#p158488</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=158486#p158486</link>
			<description><![CDATA[<p>Наверно можно, но я бы эту функцию в таком виде вообще не использовал. Оказалось, что она не буфферизирует или не отлавливает множество изменений, произошедших за короткое время, например, переименование сразу большой группы файлов. Туда нужно WaitForMultipleObjects вместо WaitForSingleObject присобачить.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 07 Jun 2023 04:47:58 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=158486#p158486</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=158484#p158484</link>
			<description><![CDATA[<p>В коде из 90 поста стоило бы OnMessage заменить на RegisterCallback(), чтобы не терялись оповещания во время открытия меню.<br /><a href="https://www.autohotkey.com/boards/viewtopic.php?p=492064#p492064">https://www.autohotkey.com/boards/viewt … 64#p492064</a></p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Wed, 07 Jun 2023 02:58:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=158484#p158484</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=150084#p150084</link>
			<description><![CDATA[<p>Первый знак процента лишний.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 15 Oct 2021 15:39:52 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=150084#p150084</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=150083#p150083</link>
			<description><![CDATA[<p>Точно, вот так заработало:<br /></p><div class="codebox"><pre><code>OnDirectoryChanged1(filePath, event) {
   global folderPath1
   res := % [&quot;Added&quot;, &quot;Removed&quot;, &quot;Modified&quot;, &quot;Renamed, old name&quot;, &quot;Renamed, new name&quot;][event] &quot;: &quot; filePath
   MsgBox, %folderPath1%\%res%
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (peterverhovensky)]]></author>
			<pubDate>Fri, 15 Oct 2021 15:36:40 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=150083#p150083</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=150082#p150082</link>
			<description><![CDATA[<p>А приставить путь к корневой папке не вариант?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 15 Oct 2021 15:24:18 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=150082#p150082</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=150080#p150080</link>
			<description><![CDATA[<p>Как задать отображение полного пути папки folderPath1/folderPath2, в которой произошло изменение? Чтобы отображение было в формате полного пути, второй вариант? -<br /></p><div class="codebox"><pre><code>Added: Новая папка\Новый текстовый документ.txt</code></pre></div><div class="codebox"><pre><code>Added: F:\TMP\Новая папка\Новый текстовый документ.txt</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (peterverhovensky)]]></author>
			<pubDate>Fri, 15 Oct 2021 14:13:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=150080#p150080</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=150079#p150079</link>
			<description><![CDATA[<p>Спасибо!</p>]]></description>
			<author><![CDATA[null@example.com (peterverhovensky)]]></author>
			<pubDate>Fri, 15 Oct 2021 13:40:50 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=150079#p150079</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=150078#p150078</link>
			<description><![CDATA[<p>Я когда-то писал такое:<br /></p><div class="codebox"><pre><code>#NoEnv
SetBatchLines -1

FILE_NOTIFY_CHANGE_FILE_NAME  := 0x1
FILE_NOTIFY_CHANGE_DIR_NAME   := 0x2
FILE_NOTIFY_CHANGE_ATTRIBUTES := 0x4
FILE_NOTIFY_CHANGE_SIZE       := 0x8

notifyFilter := FILE_NOTIFY_CHANGE_FILE_NAME
              | FILE_NOTIFY_CHANGE_DIR_NAME
              | FILE_NOTIFY_CHANGE_ATTRIBUTES
              | FILE_NOTIFY_CHANGE_SIZE

folderPath1 := A_Desktop
folderPath2 := A_ScriptDir

Inst1 := new FileMonitoring(folderPath1, notifyFilter, &quot;OnDirectoryChanged1&quot;, true)
Inst2 := new FileMonitoring(folderPath2, notifyFilter, &quot;OnDirectoryChanged2&quot;, false)
Return

OnDirectoryChanged1(filePath, event) {
   MsgBox, % [&quot;Added&quot;, &quot;Removed&quot;, &quot;Modified&quot;, &quot;Renamed, old name&quot;, &quot;Renamed, new name&quot;][event] &quot;: &quot; filePath
}

OnDirectoryChanged2(filePath, event) {
   MsgBox, % [&quot;Added&quot;, &quot;Removed&quot;, &quot;Modified&quot;, &quot;Renamed, old name&quot;, &quot;Renamed, new name&quot;][event] &quot;: &quot; filePath
}

class FileMonitoring
{
   __New(folderPath, notifyFilter, UserFunc, watchSubtree := false) {
      this.Event := new this._Event()
      this.SetCapacity(&quot;buffer&quot;, 1024)
      pBuffer := this.GetAddress(&quot;buffer&quot;)
      this.SetCapacity(&quot;overlapped&quot;, A_PtrSize*3 + 8)
      this.pOverlapped := this.GetAddress(&quot;overlapped&quot;)
      this.Directory := new this._ReadDirectoryChanges( folderPath, notifyFilter, watchSubtree
                                                      , pBuffer, this.pOverlapped, this.Event.handle )
      this.EventSignal := new this._EventSignal(this.Directory, this.Event.handle, pBuffer, UserFunc)
      this.Directory.Read()
   }
   
   __Delete() {
      DllCall(&quot;CancelIoEx&quot;, &quot;Ptr&quot;, this.Directory.handle, &quot;Ptr&quot;, this.pOverlapped)
      this.Event.Set()
      this.EventSignal.Clear()
      this.Directory.Clear()
      this.SetCapacity(&quot;buffer&quot;, 0)
      this.buffer := &quot;&quot;
   }
   
   class _Event {
      __New() {
         this.handle := DllCall(&quot;CreateEvent&quot;, &quot;Int&quot;, 0, &quot;Int&quot;, 0, &quot;Int&quot;, 0, &quot;Int&quot;, 0, &quot;Ptr&quot;)
      }
      Set() {
         DllCall(&quot;SetEvent&quot;, &quot;Ptr&quot;, this.handle)
      }
      __Delete() {
         DllCall(&quot;CloseHandle&quot;, &quot;Ptr&quot;, this.handle)
      }
   }
   
   class _ReadDirectoryChanges {
      __New(dirPath, notifyFilter, watchSubtree, pBuffer, pOverlapped, hEvent) {
         static OPEN_EXISTING := 3
              , access := (FILE_SHARE_READ := 1) | (FILE_SHARE_WRITE := 2)
              , flags := (FILE_FLAG_OVERLAPPED := 0x40000000) | (FILE_FLAG_BACKUP_SEMANTICS := 0x2000000)
              
         for k, v in [&quot;notifyFilter&quot;, &quot;watchSubtree&quot;, &quot;pBuffer&quot;, &quot;pOverlapped&quot;, &quot;hEvent&quot;]
            this[v] := %v%
         this.handle := DllCall(&quot;CreateFile&quot;, &quot;Str&quot;, dirPath, &quot;UInt&quot;, 1, &quot;UInt&quot;, access, &quot;Int&quot;, 0
                                            , &quot;UInt&quot;, OPEN_EXISTING, &quot;UInt&quot;, flags, &quot;Int&quot;, 0, &quot;Ptr&quot;)
      }
      
      Read() {
         DllCall(&quot;RtlZeroMemory&quot;, &quot;Ptr&quot;, this.pOverlapped, &quot;Ptr&quot;, A_PtrSize*3 + 8)
         NumPut(this.hEvent, this.pOverlapped + A_PtrSize*2 + 8, &quot;Ptr&quot;)
         ; there is only a Unicode version of this api
         Return DllCall(&quot;ReadDirectoryChangesW&quot;, &quot;Ptr&quot;, this.handle, &quot;Ptr&quot;, this.pBuffer, &quot;UInt&quot;, 1024, &quot;UInt&quot;, this.watchSubtree
                                               , &quot;UInt&quot;, this.notifyFilter, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, this.pOverlapped, &quot;Ptr&quot;, 0)
      }
      
      Clear() {
         DllCall(&quot;CloseHandle&quot;, &quot;Ptr&quot;, this.handle)
      }
   }
   
   class _EventSignal {
      __New(Directory, hEvent, pBuffer, UserFunc) {
         this.WM_EVENTSIGNAL := DllCall(&quot;RegisterWindowMessage&quot;, &quot;Str&quot;, &quot;WM_EVENTSIGNAL&quot;, &quot;UInt&quot;)
         for k, v in [&quot;Directory&quot;, &quot;hEvent&quot;, &quot;pBuffer&quot;]
            this[v] := %v%
         this.UserFunc := IsObject(UserFunc) ? UserFunc : Func(UserFunc)
         this.OnEvent := ObjBindMethod(this, &quot;On_WM_EVENTSIGNAL&quot;)
         OnMessage(this.WM_EVENTSIGNAL, this.OnEvent)
         this.startAddress := this.CreateWaitFunc(this.hEvent, A_ScriptHwnd, this.WM_EVENTSIGNAL)
         this.Thread := new this._Thread(this.startAddress)
      }
      
      On_WM_EVENTSIGNAL(wp) {
         if !( wp = this.hEvent
            &amp;&amp; DllCall(&quot;GetOverlappedResult&quot;, &quot;Ptr&quot;, this.hEvent, &quot;Ptr&quot;, this.pBuffer, &quot;UIntP&quot;, written, &quot;UInt&quot;, false) )
            Return
         
         addr := this.pBuffer
         offset := 0
         Loop {
            addr += offset
            eventType  := NumGet(addr + 4, &quot;UInt&quot;)
            objectName := StrGet(addr + 12, NumGet(addr + 8, &quot;UInt&quot;)//2, &quot;UTF-16&quot;) ; always in Unicode
            timer := this.UserFunc.Bind(objectName, eventType)
            SetTimer, % timer, -10
         } until !offset := NumGet(addr + 0, &quot;UInt&quot;)
         this.Thread.Wait()
         this.Thread := new this._Thread(this.startAddress)
         this.Directory.Read()
      }

      CreateWaitFunc(Handle, hWnd, Msg, Timeout := -1) {
         static params := [&quot;UInt&quot;, MEM_COMMIT := 0x1000, &quot;UInt&quot;, PAGE_EXECUTE_READWRITE := 0x40, &quot;Ptr&quot;]
         ptr := DllCall(&quot;VirtualAlloc&quot;, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, A_PtrSize = 4 ? 49 : 85, params*)
         hModule := DllCall(&quot;GetModuleHandle&quot;, &quot;Str&quot;, &quot;kernel32.dll&quot;, &quot;Ptr&quot;)
         pWaitForSingleObject := DllCall(&quot;GetProcAddress&quot;, &quot;Ptr&quot;, hModule, &quot;AStr&quot;, &quot;WaitForSingleObject&quot;, &quot;Ptr&quot;)
         hModule := DllCall(&quot;GetModuleHandle&quot;, &quot;Str&quot;, &quot;user32.dll&quot;, &quot;Ptr&quot;)
         pPostMessageW := DllCall(&quot;GetProcAddress&quot;, &quot;Ptr&quot;, hModule, &quot;AStr&quot;, &quot;PostMessageW&quot;, &quot;Ptr&quot;)
         NumPut(pWaitForSingleObject, ptr*1)
         NumPut(pPostMessageW, ptr + A_PtrSize)
         if (A_PtrSize = 4) {
            NumPut(0x68, ptr + 8, &quot;UChar&quot;)
            NumPut(Timeout, ptr + 9, &quot;UInt&quot;), NumPut(0x68, ptr + 13, &quot;UChar&quot;)
            NumPut(Handle, ptr + 14), NumPut(0x15FF, ptr + 18, &quot;UShort&quot;)
            NumPut(ptr, ptr + 20), NumPut(0x6850, ptr + 24, &quot;UShort&quot;)
            NumPut(Handle, ptr + 26), NumPut(0x68, ptr + 30, &quot;UChar&quot;)
            NumPut(Msg, ptr + 31, &quot;UInt&quot;), NumPut(0x68, ptr + 35, &quot;UChar&quot;)
            NumPut(hWnd, ptr + 36), NumPut(0x15FF, ptr + 40, &quot;UShort&quot;)
            NumPut(ptr+4, ptr + 42), NumPut(0xC2, ptr + 46, &quot;UChar&quot;), NumPut(4, ptr + 47, &quot;UShort&quot;)
         }
         else {
            NumPut(0x53, ptr + 16, &quot;UChar&quot;)
            NumPut(0x20EC8348, ptr + 17, &quot;UInt&quot;), NumPut(0xBACB8948, ptr + 21, &quot;UInt&quot;)
            NumPut(Timeout, ptr + 25, &quot;UInt&quot;), NumPut(0xB948, ptr + 29, &quot;UShort&quot;)
            NumPut(Handle, ptr + 31), NumPut(0x15FF, ptr + 39, &quot;UShort&quot;)
            NumPut(-45, ptr + 41, &quot;UInt&quot;), NumPut(0xB849, ptr + 45, &quot;UShort&quot;)
            NumPut(Handle, ptr + 47), NumPut(0xBA, ptr + 55, &quot;UChar&quot;)
            NumPut(Msg, ptr + 56, &quot;UInt&quot;), NumPut(0xB948, ptr + 60, &quot;UShort&quot;)
            NumPut(hWnd, ptr + 62), NumPut(0xC18941, ptr + 70, &quot;UInt&quot;)
            NumPut(0x15FF, ptr + 73, &quot;UShort&quot;), NumPut(-71, ptr + 75, &quot;UInt&quot;)
            NumPut(0x20C48348, ptr + 79, &quot;UInt&quot;), NumPut(0xC35B, ptr + 83, &quot;UShort&quot;)
         }
         Return ptr + A_PtrSize*2
      }
      
      class _Thread {
         __New(startAddress) {
            if !this.handle := DllCall(&quot;CreateThread&quot;, &quot;Int&quot;, 0, &quot;Int&quot;, 0, &quot;Ptr&quot;, startAddress, &quot;Int&quot;, 0, &quot;UInt&quot;, 0, &quot;Int&quot;, 0, &quot;Ptr&quot;)
               throw Exception(&quot;Failed to create thread.`nError code: &quot; . A_LastError)
         }
         Wait() {
            DllCall(&quot;WaitForSingleObject&quot;, &quot;Ptr&quot;, this.handle, &quot;Int&quot;, -1)
         }
         __Delete() {
            DllCall(&quot;CloseHandle&quot;, &quot;Ptr&quot;, this.handle)
         }
      }
      
      Clear() {
         this.Thread.Wait()
         OnMessage(this.WM_EVENTSIGNAL, this.OnEvent, 0)
         this.OnEvent := &quot;&quot;
         DllCall(&quot;VirtualFree&quot;, &quot;Ptr&quot;, this.startAddress - A_PtrSize*2, &quot;Ptr&quot;, A_PtrSize = 4 ? 49 : 85, &quot;UInt&quot;, MEM_DECOMMIT := 0x4000)
      }
   }
}</code></pre></div><p>Последний параметр (true/false) отвечает за мониторинг подпапок.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 15 Oct 2021 12:09:43 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=150078#p150078</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=150075#p150075</link>
			<description><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p><a href="http://forum.script-coding.com/viewtopic.php?pid=83808#p83808">Решил всё-таки помудрить и по мотивам скрипта Александра написал версию, работающую для обеих битностей и кодировок</a></p></blockquote></div><p>Может ли скрипт использоваться с учётом изменений в под-дерикториях - с выводом полных путей файлов?</p>]]></description>
			<author><![CDATA[null@example.com (peterverhovensky)]]></author>
			<pubDate>Thu, 14 Oct 2021 21:58:37 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=150075#p150075</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=98197#p98197</link>
			<description><![CDATA[<p>Покопался поглубже.<br />При создании текстовых файлов .txt - только одно оповещание.<br />С остальными же 2.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Sun, 25 Oct 2015 14:21:48 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=98197#p98197</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=98196#p98196</link>
			<description><![CDATA[<p>Это при любом событии?</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 25 Oct 2015 14:15:18 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=98196#p98196</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=98194#p98194</link>
			<description><![CDATA[<p>Странно.<br />У меня (Unicode 32-bit). OS: Win7x64 и при закоментированном лог-файле выскакивает всегда один тултип.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Sun, 25 Oct 2015 13:44:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=98194#p98194</guid>
		</item>
	</channel>
</rss>
