<?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=6231&amp;type=atom" />
	<updated>2023-06-07T13:56:55Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=6231</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=158491#p158491" />
			<content type="html"><![CDATA[<p>Но зато события не теряются.</p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2023-06-07T13:56:55Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=158491#p158491</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=158490#p158490" />
			<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>2023-06-07T13:40:47Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=158490#p158490</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=158488#p158488" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2023-06-07T12:05:01Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=158488#p158488</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=158486#p158486" />
			<content type="html"><![CDATA[<p>Наверно можно, но я бы эту функцию в таком виде вообще не использовал. Оказалось, что она не буфферизирует или не отлавливает множество изменений, произошедших за короткое время, например, переименование сразу большой группы файлов. Туда нужно WaitForMultipleObjects вместо WaitForSingleObject присобачить.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-06-07T04:47:58Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=158486#p158486</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=158484#p158484" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2023-06-07T02:58:13Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=158484#p158484</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=150084#p150084" />
			<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>2021-10-15T15:39:52Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=150084#p150084</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=150083#p150083" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[peterverhovensky]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=41360</uri>
			</author>
			<updated>2021-10-15T15:36:40Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=150083#p150083</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=150082#p150082" />
			<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>2021-10-15T15:24:18Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=150082#p150082</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=150080#p150080" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[peterverhovensky]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=41360</uri>
			</author>
			<updated>2021-10-15T14:13:26Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=150080#p150080</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=150079#p150079" />
			<content type="html"><![CDATA[<p>Спасибо!</p>]]></content>
			<author>
				<name><![CDATA[peterverhovensky]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=41360</uri>
			</author>
			<updated>2021-10-15T13:40:50Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=150079#p150079</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=150078#p150078" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2021-10-15T12:09:43Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=150078#p150078</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=150075#p150075" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[peterverhovensky]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=41360</uri>
			</author>
			<updated>2021-10-14T21:58:37Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=150075#p150075</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=98197#p98197" />
			<content type="html"><![CDATA[<p>Покопался поглубже.<br />При создании текстовых файлов .txt - только одно оповещание.<br />С остальными же 2.</p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2015-10-25T14:21:48Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=98197#p98197</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=98196#p98196" />
			<content type="html"><![CDATA[<p>Это при любом событии?</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2015-10-25T14:15:18Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=98196#p98196</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запуск скрипта не по кнопке, а при событии создания файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=98194#p98194" />
			<content type="html"><![CDATA[<p>Странно.<br />У меня (Unicode 32-bit). OS: Win7x64 и при закоментированном лог-файле выскакивает всегда один тултип.</p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2015-10-25T13:44:59Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=98194#p98194</id>
		</entry>
</feed>
