<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Возвращение пути к PDF-файлу]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=17515</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=17515&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Возвращение пути к PDF-файлу».]]></description>
		<lastBuildDate>Thu, 15 Dec 2022 12:34:04 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Возвращение пути к PDF-файлу]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=156002#p156002</link>
			<description><![CDATA[<div class="quotebox"><cite>peterverhovensky пишет:</cite><blockquote><p>процесс при запуске имеет ком. строку первого окна</p></blockquote></div><p>Просто в первом окне открывается файл, указанный в командной строке. Можно в том же окне открыть потом другой файл, командная строка от этого, конечно, не изменится.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 15 Dec 2022 12:34:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=156002#p156002</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Возвращение пути к PDF-файлу]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=156001#p156001</link>
			<description><![CDATA[<p>Судя по всему, процесс при запуске имеет ком. строку первого окна, которая для последующих окон не меняется, поэтому получить ее для следующих окон невозможно.</p>]]></description>
			<author><![CDATA[null@example.com (peterverhovensky)]]></author>
			<pubDate>Thu, 15 Dec 2022 12:10:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=156001#p156001</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Возвращение пути к PDF-файлу]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=156000#p156000</link>
			<description><![CDATA[<p>Попробую путём обхода всех окон и сбора ком. строк, с сравнением с заголовками окон.</p>]]></description>
			<author><![CDATA[null@example.com (peterverhovensky)]]></author>
			<pubDate>Thu, 15 Dec 2022 11:39:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=156000#p156000</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Возвращение пути к PDF-файлу]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=155999#p155999</link>
			<description><![CDATA[<p>Командная строка не относится к окну, она относится к процессу.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 15 Dec 2022 11:33:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=155999#p155999</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Возвращение пути к PDF-файлу]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=155998#p155998</link>
			<description><![CDATA[<p><strong>teadrinker</strong></p><p>А если он выводит командную строку процесса, не относящуюся к данному окну — где искать валидную инфу? Или эта инфа замещается самим просмотрщиком и она не доступна? Кстати говоря, пробовал я это в &quot;Adobe Reader&quot;, и в &quot;STDU Viewer&quot;.</p>]]></description>
			<author><![CDATA[null@example.com (peterverhovensky)]]></author>
			<pubDate>Thu, 15 Dec 2022 11:30:13 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=155998#p155998</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Возвращение пути к PDF-файлу]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=155997#p155997</link>
			<description><![CDATA[<div class="quotebox"><cite>peterverhovensky пишет:</cite><blockquote><p>Следующий код по клавише F11 выводит путь к файлу, открытому в PDF-просмотрщике.</p></blockquote></div><p>Нет, он выводит, судя по коду, командную строку процесса.</p><div class="quotebox"><cite>peterverhovensky пишет:</cite><blockquote><p>Как правильно получить путь для активного окна?</p></blockquote></div><p>Думаю, это зависит от того, как устроен «PDF-просмотрщик».</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 15 Dec 2022 11:16:30 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=155997#p155997</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Возвращение пути к PDF-файлу]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=155991#p155991</link>
			<description><![CDATA[<p>Следующий код по клавише F11 выводит путь к файлу, открытому в PDF-просмотрщике. Но в случае, когда открыто несколько окон, путь определяется неверно. Как правильно получить путь для активного окна?</p><div class="codebox"><pre><code>#SingleInstance Force

F11:: 
   WinGet, PID, PID, A
   obj := GetCommandLine2(PID, true, true)
   ;MsgBox, % &quot;CommandLine = &quot; obj.cmd &quot;`nImagePath = &quot; obj.path
   MsgBox, % obj.cmd
   Return

GetCommandLine2(PID, SetDebugPrivilege := false, GetImagePath := false)  {
   static SetDebug := 0, PROCESS_QUERY_INFORMATION := 0x400, PROCESS_VM_READ := 0x10, STATUS_SUCCESS := 0
   
   if (SetDebugPrivilege &amp;&amp; !SetDebug)  {
      if !res := SeDebugPrivilege()
         SetDebug := 1
      else  {
         MsgBox, 4, Ошибка SeDebugPrivilege(), Не удалось установить привилегии.`nОшибка %res%`nПродолжить?
         IfMsgBox, No
            Return
      }
   }
   hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, Int, 0, UInt, PID, Ptr)
   (A_Is64bitOS &amp;&amp; DllCall(&quot;IsWow64Process&quot;, Ptr, hProc, UIntP, IsWow64))
   if (!A_Is64bitOS || IsWow64)
      PtrSize := 4, PtrType := &quot;UInt&quot;, pPtr := &quot;UIntP&quot;, offsetCMD := 0x40
   else
      PtrSize := 8, PtrType := &quot;Int64&quot;, pPtr := &quot;Int64P&quot;, offsetCMD := 0x70

   hModule := DllCall(&quot;GetModuleHandle&quot;, &quot;str&quot;, &quot;Ntdll&quot;, Ptr)
   if (A_PtrSize &lt; PtrSize)  {            ; скрипт 32, целевой процесс 64
      if !QueryInformationProcess := DllCall(&quot;GetProcAddress&quot;, Ptr, hModule, AStr, &quot;NtWow64QueryInformationProcess64&quot;, Ptr)
         failed := &quot;NtWow64QueryInformationProcess64&quot;
      if !ReadProcessMemory := DllCall(&quot;GetProcAddress&quot;, Ptr, hModule, AStr, &quot;NtWow64ReadVirtualMemory64&quot;, Ptr)
         failed := &quot;NtWow64ReadVirtualMemory64&quot;
      info := 0, szPBI := 48, offsetPEB := 8
   }
   else  {
      if !QueryInformationProcess := DllCall(&quot;GetProcAddress&quot;, Ptr, hModule, AStr, &quot;NtQueryInformationProcess&quot;, Ptr)
         failed := &quot;NtQueryInformationProcess&quot;
      ReadProcessMemory := &quot;ReadProcessMemory&quot;
      if (A_PtrSize &gt; PtrSize)            ; скрипт 64, целевой процесс 32
         info := 26, szPBI := 8, offsetPEB := 0
      else                                ; скрипт и целевой процесс одной битности
         info := 0, szPBI := PtrSize * 6, offsetPEB := PtrSize
   }
   if failed  {
      DllCall(&quot;CloseHandle&quot;, Ptr, hProc)
      MsgBox, Не удалось получить указатель на функцию %failed%
      Return
   }
   VarSetCapacity(PBI, 48, 0)
   if DllCall(QueryInformationProcess, Ptr, hProc, UInt, info, Ptr, &amp;PBI, UInt, szPBI, UIntP, bytes) != STATUS_SUCCESS  {
      DllCall(&quot;CloseHandle&quot;, Ptr, hProc)
      Return
   }
   pPEB := NumGet(&amp;PBI + offsetPEB, PtrType)
   DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pPEB + PtrSize * 4, pPtr, pRUPP, PtrType, PtrSize, UIntP, bytes)
   DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pRUPP + offsetCMD, UShortP, szCMD, PtrType, 2, UIntP, bytes)
   DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pRUPP + offsetCMD + PtrSize, pPtr, pCMD, PtrType, PtrSize, UIntP, bytes)
   
   VarSetCapacity(buff, szCMD, 0)
   DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pCMD, Ptr, &amp;buff, PtrType, szCMD, UIntP, bytes)
   obj := { cmd: StrGet(&amp;buff, &quot;UTF-16&quot;) }
   
   if (GetImagePath &amp;&amp; obj.cmd)  {
      DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pRUPP + offsetCMD - PtrSize*2, UShortP, szPATH, PtrType, 2, UIntP, bytes)
      DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pRUPP + offsetCMD - PtrSize, pPtr, pPATH, PtrType, PtrSize, UIntP, bytes)
      
      VarSetCapacity(buff, szPATH, 0)
      DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pPATH, Ptr, &amp;buff, PtrType, szPATH, UIntP, bytes)
      obj.path := StrGet(&amp;buff, &quot;UTF-16&quot;) . (IsWow64 ? &quot; *32&quot; : &quot;&quot;)
   }
   DllCall(&quot;CloseHandle&quot;, Ptr, hProc)
   Return obj
}

SeDebugPrivilege()  {
   static PROCESS_QUERY_INFORMATION := 0x400, TOKEN_ADJUST_PRIVILEGES := 0x20, SE_PRIVILEGE_ENABLED := 0x2
   
   hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_QUERY_INFORMATION, Int, false, UInt, DllCall(&quot;GetCurrentProcessId&quot;), Ptr)
   DllCall(&quot;Advapi32\OpenProcessToken&quot;, Ptr, hProc, UInt, TOKEN_ADJUST_PRIVILEGES, PtrP, token)
   
   DllCall(&quot;Advapi32\LookupPrivilegeValue&quot;, Ptr, 0, Str, &quot;SeDebugPrivilege&quot;, Int64P, luid)
   VarSetCapacity(TOKEN_PRIVILEGES, 16, 0)
   NumPut(1, TOKEN_PRIVILEGES, &quot;UInt&quot;)
   NumPut(luid, TOKEN_PRIVILEGES, 4, &quot;Int64&quot;)
   NumPut(SE_PRIVILEGE_ENABLED, TOKEN_PRIVILEGES, 12, &quot;UInt&quot;)
   DllCall(&quot;Advapi32\AdjustTokenPrivileges&quot;, Ptr, token, Int, false, Ptr, &amp;TOKEN_PRIVILEGES, UInt, 0, Ptr, 0, Ptr, 0)
   res := A_LastError
   DllCall(&quot;CloseHandle&quot;, Ptr, token)
   DllCall(&quot;CloseHandle&quot;, Ptr, hProc)
   Return res  ; в случае удачи 0
}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (peterverhovensky)]]></author>
			<pubDate>Thu, 15 Dec 2022 02:26:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=155991#p155991</guid>
		</item>
	</channel>
</rss>
