<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Windows7 и SysHeader321]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=8645&amp;type=atom" />
	<updated>2014-07-13T08:43:45Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=8645</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=84740#p84740" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Через WMI, в общих чертах так:<br /></p><div class="codebox"><pre><code>for k in ComObjGet(&quot;winmgmts:&quot;).InstancesOf(&quot;Win32_Process&quot;)
   Text .= &quot;`r`n&quot; k.Name A_Tab k.ProcessId A_Tab (k.WorkingSetSize//1024)

Sort, Text
Text := &quot;Имя образа&quot; A_Tab &quot;ID процесса&quot; A_Tab &quot;Память`r`n&quot; Text

Run, notepad.exe,,, PID
WinWait, ahk_pid %PID%
ControlSetText, Edit1, % Text</code></pre></div><p>Если пояснишь подробнее, что именно нужно (все процессы, или только некоторые, какие столбцы), могу написать что-то более конкретное.</p></blockquote></div><p>Помогите пожалуйста получить список существующих процессов с выводом в блокнот. </p><div class="quotebox"><blockquote><p>, Имя.exe `n</p></blockquote></div><p>&quot;Запятая&quot; &quot;пробелл&quot; &quot;Имя процесса.*&quot; &quot;Переход на следущую строку&quot;. <br /> В заранее спасибо.</p><div class="quotebox"><blockquote><p>Спасибо, с этим уже разобрался.</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[Selja8]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32415</uri>
			</author>
			<updated>2014-07-13T08:43:45Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=84740#p84740</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75221#p75221" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Вот так у меня работает при любом запуске Диспетчера задач</p></blockquote></div><p>Спасибо, список хэндлов получил.<br />Буду вживлять в свой скрипт.</p>]]></content>
			<author>
				<name><![CDATA[pserg]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=17198</uri>
			</author>
			<updated>2013-09-05T06:33:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75221#p75221</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75220#p75220" />
			<content type="html"><![CDATA[<p>Вот так у меня работает при любом запуске Диспетчера задач. Проверял на Win7 SP1 64 и XP SP2 32.<br /></p><div class="codebox"><pre><code>
#Persistent
#NoEnv
PathRoot = %A_Temp%\
    If not WinExist(&quot;Диспетчер задач Windows&quot;) {
      Run, Taskmgr.exe
      WinWait, Диспетчер задач Windows
    }
    ; Переключиться на вкладку &quot;Процессы&quot;
    SendMessage, 0x1330, 1,, SysTabControl321     ; 0x1330 is TCM_SETCURFOCUS.
    Sleep, 0
    SendMessage, 0x130C, 1,, SysTabControl321     ; 0x130C is TCM_SETCURSEL.
    ControlGet, hwndHeader, Hwnd,, SysHeader321   ; Хэндл заголовочного контрола.
    Headers := HeaderGetText(hwndHeader)          ; Список заголовков.

    MsgBox, % Headers

    Loop, Parse, Headers, `n ;(%A_Tab% OR %A_Space%)
      {
        FileAppend, `;%A_LoopField%`n, %PathRoot%File.csv
      }
      
HeaderGetText(hWnd)    ; ======== Функция, возвращающая список заголовков Диспетчера задач Windows=======
{
  MaxName := 100     ; Максимальная длина заголовка.
  Delimiter := &quot;`n&quot;  ; Разделитель заголовков в списке.
  
  PROCESS_VM_OPERATION := 0x8, PROCESS_VM_READ := 0x10
  PROCESS_VM_WRITE := 0x20,    MEM_COMMIT := 0x1000
  MEM_DECOMMIT := 0x4000,      PAGE_READWRITE := 0x4
  HDI_TEXT := 0x2,             HDM_GETITEMCOUNT := 0x1200
  HDM_GETITEMW := 0x120B,      PROCESS_QUERY_INFORMATION := 0x400
  
   ; PID процесса, создавшего заголовочный контрол.
  DllCall(&quot;GetWindowThreadProcessId&quot;, &quot;ptr&quot;,   hWnd
                                    , &quot;uint *&quot;, PID)

  hProcess := DllCall(&quot;OpenProcess&quot;, &quot;uint&quot;, PROCESS_VM_READ
                                           | PROCESS_VM_WRITE
                                           | PROCESS_VM_OPERATION
                                           | PROCESS_QUERY_INFORMATION
                                   , &quot;int&quot;, FALSE
                                   , &quot;uint&quot;, PID
                                   , &quot;ptr&quot;)
  If (hProcess = 0) {
    MsgBox, Не удалось открыть процесс.
    Return
  }

  StructSize := 48
  TextMaxOffset := 16

  If (A_Is64bitOS) {
     Wow64 = 0
    DllCall(&quot;IsWow64Process&quot;, &quot;ptr&quot;, hProcess, &quot;uint *&quot;, Wow64)
    If (!Wow64) {
        StructSize := 64
        TextMaxOffset := 24
     }
  }

  VarSetCapacity(Buf, MaxName * 2, 0) ; Буфер под заголовок.
  VarSetCapacity(hdi, StructSize, 0)  ; Структура HDITEM, её размер 48 или 64 байта.
                                      ; В неё будет скидываться информация о каждом
                                      ; заголовке в ответ на сообщение HDM_GETITEM.

  ; Выделение памяти в адресном пространстве процесса
  ; под структуру HDITEM и строку заголовка.
  phdi := DllCall(&quot;VirtualAllocEx&quot;, &quot;ptr&quot;, hProcess
                                  , &quot;ptr&quot;, 0
                                  , &quot;uint&quot;, StructSize + (MaxName + 1) * 2
                                  , &quot;uint&quot;, MEM_COMMIT
                                  , &quot;uint&quot;, PAGE_READWRITE
                                  , &quot;ptr&quot;)
  If (phdi = 0) {
    MsgBox, Ошибка выделения памяти в процессе.
    Goto, Close
  }

  ; Запись нужных значений в структуру.
  NumPut(HDI_TEXT, hdi, 0, &quot;uint&quot;), NumPut(phdi+StructSize, hdi, 8, &quot;ptr&quot;)
  NumPut(MaxName, hdi, TextMaxOffset, &quot;uint&quot;)

  ; Структура копируется в память процесса.
  Ret := DllCall(&quot;WriteProcessMemory&quot;, &quot;ptr&quot;, hProcess
                                     , &quot;ptr&quot;, phdi
                                     , &quot;ptr&quot;, &amp;hdi
                                     , &quot;ptr&quot;, StructSize
                                     , &quot;ptr&quot;, 0)
  If (Ret = 0) {
    MsgBox, Ошибка записи в память процесса.
    Goto, Free
  }

  ; Запрос количества заголовков.
  Count := DllCall(&quot;SendMessageW&quot;, &quot;ptr&quot;, hWnd
                                 , &quot;uint&quot;, HDM_GETITEMCOUNT
                                 , &quot;ptr&quot;, 0
                                 , &quot;ptr&quot;, 0)
  If (Count &lt; 0) {
    MsgBox, Ошибка определения количества заголовков.
    Goto, Free
  }

  Loop, % Count  ; Запрос информации о каждом заголовке.
  {
    DllCall(&quot;SendMessageW&quot;, &quot;ptr&quot;, hWnd
                          , &quot;uint&quot;, HDM_GETITEMW
                          , &quot;ptr&quot;, A_Index - 1
                          , &quot;ptr&quot;, phdi)

    ; Заголовок копируется из памяти процесса в местный буфер.
    Ret := DllCall(&quot;ReadProcessMemory&quot;, &quot;ptr&quot;, hProcess
                                      , &quot;ptr&quot;, phdi + StructSize
                                      , &quot;ptr&quot;, &amp;Buf
                                      , &quot;ptr&quot;, MaxName * 2
                                      , &quot;ptr&quot;, 0)
    If (Ret = 0) {
      MsgBox, Ошибка чтения из памяти процесса.
      Goto, Free
    }

    VarSetCapacity(Buf, -1)  ; Обновление переменной.
    Headers .= Buf . (A_Index != Count ? Delimiter : &quot;&quot;)
  }

  Free:  ; Освобождение памяти в процессе.
  DllCall(&quot;VirtualFreeEx&quot;, &quot;ptr&quot;, hProcess
                         , &quot;ptr&quot;, phdi
                         , &quot;ptr&quot;, StructSize + (MaxName + 1) * 2
                         , &quot;uint&quot;, MEM_DECOMMIT)

  Close:  ; Освобождение хэндла процесса.
  DllCall(&quot;CloseHandle&quot;, &quot;ptr&quot;, hProcess)

  Return Headers
}            ; ======== End  =======
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2013-09-05T05:12:55Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75220#p75220</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75206#p75206" />
			<content type="html"><![CDATA[<p>Что касается того скрипта, читающего заголовки, то, как оказалось, запускать его от админа не надо — надо как-то определять битность процесса Диспетчера задач. В Win7 x64 этот процесс 64-битный, если Диспетчер запущен вручную. Если же он запущен 32-битным скриптом, тогда он тоже 32-битный. Для этих двух случаев нужно использовать разные смещения в структуре HDITEM. Пока не знаю, как определить битность другого процесса.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2013-09-04T16:37:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75206#p75206</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75203#p75203" />
			<content type="html"><![CDATA[<p>Без диспетчера:<br /></p><div class="codebox"><pre><code>strProcrssesNames := &quot;autohotkey.exe|explorer.exe|smss.exe&quot;   ; список имён процессов через |, можно задавать через ini-файл
keys := 1|2|4|8|16|256|1024   ; необходимые ключи, описаны в функции. Это не строка, без кавычек!

PI := GetProcessesInfo(strProcrssesNames, keys)

for k, v in PI
{
   Text .= (A_Index = 1 ? &quot;&quot; : &quot;`r`n`r`n&quot;)
   for k, v in v
      Text .= (A_Index = 1 ? &quot;&quot; : &quot;`r`n&quot;) v.Description &quot; = &quot; v.Value
}

Run, notepad.exe,,, PID
WinWait, ahk_pid %PID%
ControlSetText, Edit1, % Text

GetProcessesInfo(StringProcesses, keys)
{
/*
Имя образа                      = 1
ИД процесса                     = 2
ЦП                              = 4
Память (частный рабочий набор)  = 8
Выделенная память               = 16
Дескрипторы                     = 32
Счетчик потоков                 = 64
Объекты USER                    = 128
Объекты GDI                     = 256
Описание                        = 512
Пользователь                    = 1024
*/
   SetBatchLines, -1
   WMI := ComObjGet(&quot;winmgmts:&quot;), ProcessesInfo := []
   Loop, parse, StringProcesses, |
   {
      Processes := WMI.ExecQuery(&quot;Select * from Win32_Process Where Name = &#039;&quot; A_LoopField &quot;&#039;&quot;)
      if (Processes.Count = 0)
      {
         ProcessesInfo.Insert(&quot;&quot;)
         continue
      }
      
      For Process in Processes
      {
         Info := {}, PID := Process.ProcessId
         
         if (keys &amp; 4 || keys &amp; 8 || keys &amp; 16)
            Collection := WMI.ExecQuery(&quot;Select * from Win32_PerfFormattedData_PerfProc_Process Where IDProcess=&quot; PID)
         
         keys &amp; 1 ? Info.1 := {Value: Process.Name, Description: &quot;Имя образа&quot;}
         
         keys &amp; 2 ? Info.2 := {Value: PID, Description: &quot;ИД процесса&quot;}
         
         if keys &amp; 4
            for k in Collection
               Info.4 := {Value: k.PercentProcessorTime, Description: &quot;ЦП&quot;}
         
         if keys &amp; 8
            for k in Collection
               Info.8 := {Value: (k.WorkingSetPrivate)//1024, Description: &quot;Память (частный рабочий набор)&quot;}
            
         if keys &amp; 16
            for k in Collection
               Info.16 := {Value: (k.PrivateBytes)//1024, Description: &quot;Выделенная память&quot;}
         
         keys &amp; 32 ? Info.32 := {Value: Process.HandleCount, Description: &quot;Дескрипторы&quot;}
         
         keys &amp; 64 ? Info.64 := {Value: Process.ThreadCount, Description: &quot;Счетчик потоков&quot;}
         
         keys &amp; 128 ? Info.128 := {Value: GetGuiResources(PID, 1), Description: &quot;Объекты USER&quot;}
         
         keys &amp; 256 ? Info.256 := {Value: GetGuiResources(PID, 0), Description: &quot;Объекты GDI&quot;}
         
         keys &amp; 512 ? Info.512 := {Value: Process.Description, Description: &quot;Описание&quot;}
         
         (keys &amp; 1024 &amp;&amp; Process.GetOwner((Sid := ComVar()).ref) = 0) ? Info.1024 := {Value: Sid[], Description: &quot;Пользователь&quot;}

         ProcessesInfo.Insert(Info)
      }
   }
   return ProcessesInfo
}

GetGuiResources(PID, flag)
{
   hProcess := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_QUERY_INFORMATION := 0x400, UInt, 0, UInt, PID)
   Count := DllCall(&quot;GetGuiResources&quot;, Ptr, hProcess, UInt, flag)
   DllCall(&quot;CloseHandle&quot;, Ptr, hProcess)
   Return Count
}

ComVar(Type=0xC)   ; http://l.autohotkey.net/docs/commands/ComObjActive.htm#ByRefEx
{
    static base := { __Get: &quot;ComVarGet&quot;, __Set: &quot;ComVarSet&quot;, __Delete: &quot;ComVarDel&quot; }
    ; Create an array of 1 VARIANT.  This method allows built-in code to take
    ; care of all conversions between VARIANT and AutoHotkey internal types.
    arr := ComObjArray(Type, 1)
    ; Lock the array and retrieve a pointer to the VARIANT.
    DllCall(&quot;oleaut32\SafeArrayAccessData&quot;, &quot;ptr&quot;, ComObjValue(arr), &quot;ptr*&quot;, arr_data)
    ; Store the array and an object which can be used to pass the VARIANT ByRef.
    return { ref: ComObjParameter(0x4000|Type, arr_data), _: arr, base: base }
}
ComVarGet(cv, p*) { ; Called when script accesses an unknown field.
    if p.MaxIndex() = &quot;&quot; ; No name/parameters, i.e. cv[]
        return cv._[0]
}
ComVarSet(cv, v, p*) { ; Called when script sets an unknown field.
    if p.MaxIndex() = &quot;&quot; ; No name/parameters, i.e. cv[]:=v
        return cv._[0] := v
}
ComVarDel(cv) { ; Called when the object is being freed.
    ; This must be done to allow the internal array to be freed.
    DllCall(&quot;oleaut32\SafeArrayUnaccessData&quot;, &quot;ptr&quot;, ComObjValue(cv._))
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2013-09-04T16:23:23Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75203#p75203</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75194#p75194" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>YMP<br />Вы какую версию АНК используете?</p></blockquote></div><p>использую версию AutoHotkeyU32.exe 1.1.9.1, т.к. запускать полученные скрипты приходится и под 32-разрядными ОС.</p>]]></content>
			<author>
				<name><![CDATA[pserg]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=17198</uri>
			</author>
			<updated>2013-09-04T11:15:26Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75194#p75194</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75191#p75191" />
			<content type="html"><![CDATA[<p><strong>pserg</strong><br />В семёрке надо скрипт запускать с правами администратора. Тогда доступ к Диспетчеру задач он получает. Но это не все проблемы, конечно. Надо, вероятно, подгонять размеры под x64, и есть ещё вопрос кодировки строк. Вы какую версию АНК используете?</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2013-09-04T09:22:07Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75191#p75191</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75189#p75189" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Если пояснишь подробнее, что именно нужно (все процессы, или только некоторые, какие столбцы), могу написать что-то более конкретное.</p></blockquote></div><p>Спасибо за ответ.<br />Подробнее о задаче: Для проверки работы полигона запускаю приложение (в состав может входить разное количество процессов, в зависимости от проекта). По-хорошему, хотелось бы выводить список процессов с возможностью установки флагов для выбора, но что-то это у меня не получилось. <br />Список желаемых столбцов (взял из tsskmgr w7): Имя образа, Ид процесса, ЦП, Память (частный рабочий набор), Выделенная память, Дескрипторы, Счетчик потоков, Объекты USER, Объекты GDI. Вроде все, но могут потребоваться Описание и Пользователь.</p>]]></content>
			<author>
				<name><![CDATA[pserg]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=17198</uri>
			</author>
			<updated>2013-09-04T08:59:10Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75189#p75189</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75185#p75185" />
			<content type="html"><![CDATA[<p>Через WMI, в общих чертах так:<br /></p><div class="codebox"><pre><code>for k in ComObjGet(&quot;winmgmts:&quot;).InstancesOf(&quot;Win32_Process&quot;)
   Text .= &quot;`r`n&quot; k.Name A_Tab k.ProcessId A_Tab (k.WorkingSetSize//1024)

Sort, Text
Text := &quot;Имя образа&quot; A_Tab &quot;ID процесса&quot; A_Tab &quot;Память`r`n&quot; Text

Run, notepad.exe,,, PID
WinWait, ahk_pid %PID%
ControlSetText, Edit1, % Text</code></pre></div><p>Если пояснишь подробнее, что именно нужно (все процессы, или только некоторые, какие столбцы), могу написать что-то более конкретное.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2013-09-03T20:30:21Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75185#p75185</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75184#p75184" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>А как он должен был работать?</p></blockquote></div><p>получаем список заголовков столбцов, затем в цикле выводим их через &quot;;&quot; в CSV-файл. дальше получаем список нужных процессов с данными из тех же столбцов диспетчера задач и также пишем их в файл. Данные собираются и анализируются после прогона - не было ли утечек памяти, роста загрузки ядра, не падал ли процесс во время прогона (менялся ли PID) и т.п. Удобнее, чем счетчики производительности, тем более, настраивать ничего не нужно, универсально для любой ОС (работало на NT 4.0, w2000, w2k3, Vista, XP). Единственно, один раз выбрать нужные столбцы в диспетчере - и все.</p><div class="quotebox"><blockquote><p>чтобы получить любую информацию о процессах, обращаться к диспетчеру задач нет необходимости</p></blockquote></div><p>Если можно пояснить, как это применительно к моему случаю, буду рад.</p>]]></content>
			<author>
				<name><![CDATA[pserg]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=17198</uri>
			</author>
			<updated>2013-09-03T18:57:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75184#p75184</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75183#p75183" />
			<content type="html"><![CDATA[<p>А как он должен был работать? Есть подозрение, что восстанавливать работоспособность сего не имеет смысла, т. к. чтобы получить любую информацию о процессах, обращаться к диспетчеру задач нет необходимости.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2013-09-03T18:18:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75183#p75183</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Windows7 и SysHeader321]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75178#p75178" />
			<content type="html"><![CDATA[<p>Здравствуйте!<br />Была для XP написана программка, в которой шло обращение к диспетчеру задач и выбирались заголовки вкладки &quot;Процессы&quot; и записи по нужным процессам.<br />Запускаю эту программу в Win7 x64 - список процессов есть, а заголовки пропали.<br />Вот кусок из той программы (проверял - в XP пишет в файл список заголовков, в w7 - нет):<br /></p><div class="codebox"><pre><code>
;SetTitleMatchMode, RegEx
#Persistent
#NoEnv
PathRoot = %A_Temp%\
    If not WinExist(&quot;Диспетчер задач Windows&quot;) {
      Run, Taskmgr.exe
      WinWait, Диспетчер задач Windows
    }
    ; Переключиться на вкладку &quot;Процессы&quot;
    SendMessage, 0x1330, 1,, SysTabControl321      ; 0x1330 is TCM_SETCURFOCUS.
    Sleep, 0
    SendMessage, 0x130C, 1,, SysTabControl321     ; 0x130C is TCM_SETCURSEL.
    ControlGet, hwndHeader, Hwnd,, SysHeader321      ; Хэндл заголовочного контрола.
    Headers := HeaderGetText(hwndHeader)         ; Список заголовков.
    Loop, Parse, Headers, `n ;(%A_Tab% OR %A_Space%)
      {
        FileAppend,
              (
;%A_LoopField%`n
), %PathRoot%File.csv
      }
      
HeaderGetText(hWnd)    ; ======== Функция, возвращающая список заголовков Диспетчера задач Windows=======
{
  MaxName := 100     ; Максимальная длина заголовка.
  Delimiter := &quot;`n&quot;  ; Разделитель заголовков в списке.

  PROCESS_VM_OPERATION := 0x8, PROCESS_VM_READ := 0x10
  PROCESS_VM_WRITE := 0x20,    MEM_COMMIT := 0x1000
  MEM_DECOMMIT := 0x4000,      PAGE_READWRITE = 0x4
  HDI_TEXT := 0x2,             HDM_GETITEMCOUNT := 0x1200
  HDM_GETITEMA := 0x1203

  VarSetCapacity(Buf, MaxName, 0)  ; Буфер под заголовок.
  VarSetCapacity(hdi, 48, 0)       ; Структура HDITEM, её размер 48 байт.
                                   ; В неё будет скидываться информация о каждом
                                   ; заголовке в ответ на сообщение HDM_GETITEM.

  ; PID процесса, создавшего заголовочный контрол.
  DllCall(&quot;GetWindowThreadProcessId&quot;, &quot;uint&quot;,   hWnd
                                    , &quot;uint *&quot;, PID)

  hProcess := DllCall(&quot;OpenProcess&quot;, &quot;uint&quot;, PROCESS_VM_READ
                                           | PROCESS_VM_WRITE
                                           | PROCESS_VM_OPERATION
                                   , &quot;int&quot;, FALSE
                                   , &quot;uint&quot;, PID)
  If (hProcess = 0) {
    MsgBox, Не удалось открыть процесс.
    Return
  }

  ; Выделение памяти в адресном пространстве процесса
  ; под структуру HDITEM и строку заголовка.
  phdi := DllCall(&quot;VirtualAllocEx&quot;, &quot;uint&quot;, hProcess
                                  , &quot;uint&quot;, 0
                                  , &quot;uint&quot;, MaxName + 48
                                  , &quot;uint&quot;, MEM_COMMIT
                                  , &quot;uint&quot;, PAGE_READWRITE)
  If (phdi = 0) {
    MsgBox, Ошибка выделения памяти в процессе.
    Goto, Close
  }

  ; Запись нужных значений в структуру.
  NumPut(HDI_TEXT, hdi), NumPut(phdi+48, hdi, 8), NumPut(MaxName, hdi, 16)

  ; Структура копируется в память процесса.
  Ret := DllCall(&quot;WriteProcessMemory&quot;, &quot;uint&quot;, hProcess
                                     , &quot;uint&quot;, phdi
                                     , &quot;uint&quot;, &amp;hdi
                                     , &quot;uint&quot;, 48
                                     , &quot;uint&quot;, 0)
  If (Ret = 0) {
    MsgBox, Ошибка записи в память процесса.
    Goto, Free
  }

  ; Запрос количества заголовков.
  Count := DllCall(&quot;SendMessageA&quot;, &quot;uint&quot;, hWnd
                                 , &quot;uint&quot;, HDM_GETITEMCOUNT
                                 , &quot;uint&quot;, 0
                                 , &quot;uint&quot;, 0)
  If (Count &lt; 0) {
    MsgBox, Ошибка определения количества заголовков.
    Goto, Free
  }

  Loop, % Count  ; Запрос информации о каждом заголовке.
  {
    DllCall(&quot;SendMessageA&quot;, &quot;uint&quot;, hWnd
                          , &quot;uint&quot;, HDM_GETITEMA
                          , &quot;uint&quot;, A_Index - 1
                          , &quot;uint&quot;, phdi)

    ; Заголовок копируется из памяти процесса в местный буфер.
    Ret := DllCall(&quot;ReadProcessMemory&quot;, &quot;uint&quot;, hProcess
                                      , &quot;uint&quot;, phdi+48
                                      , &quot;uint&quot;, &amp;Buf
                                      , &quot;uint&quot;, MaxName
                                      , &quot;uint&quot;, 0)
    If (Ret = 0) {
      MsgBox, Ошибка чтения из памяти процесса.
      Goto, Free
    }

    VarSetCapacity(Buf, -1)  ; Обновление переменной.
    Headers .= Buf . (A_Index != Count ? Delimiter : &quot;&quot;)
  }

  Free:  ; Освобождение памяти в процессе.
  DllCall(&quot;VirtualFreeEx&quot;, &quot;uint&quot;, hProcess
                         , &quot;uint&quot;, phdi
                         , &quot;uint&quot;, MaxName+48
                         , &quot;uint&quot;, MEM_DECOMMIT)

  Close:  ; Освобождение хэндла процесса.
  DllCall(&quot;CloseHandle&quot;, &quot;uint&quot;, hProcess)

  Return Headers
}            ; ======== End  =======
</code></pre></div><p>Прошу помощи в восстановлении работоспособности!</p>]]></content>
			<author>
				<name><![CDATA[pserg]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=17198</uri>
			</author>
			<updated>2013-09-03T11:52:29Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75178#p75178</id>
		</entry>
</feed>
