Тема: AHK: Windows7 и SysHeader321
Здравствуйте!
Была для XP написана программка, в которой шло обращение к диспетчеру задач и выбирались заголовки вкладки "Процессы" и записи по нужным процессам.
Запускаю эту программу в Win7 x64 - список процессов есть, а заголовки пропали.
Вот кусок из той программы (проверял - в XP пишет в файл список заголовков, в w7 - нет):
;SetTitleMatchMode, RegEx
#Persistent
#NoEnv
PathRoot = %A_Temp%\
If not WinExist("Диспетчер задач Windows") {
Run, Taskmgr.exe
WinWait, Диспетчер задач Windows
}
; Переключиться на вкладку "Процессы"
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 := "`n" ; Разделитель заголовков в списке.
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("GetWindowThreadProcessId", "uint", hWnd
, "uint *", PID)
hProcess := DllCall("OpenProcess", "uint", PROCESS_VM_READ
| PROCESS_VM_WRITE
| PROCESS_VM_OPERATION
, "int", FALSE
, "uint", PID)
If (hProcess = 0) {
MsgBox, Не удалось открыть процесс.
Return
}
; Выделение памяти в адресном пространстве процесса
; под структуру HDITEM и строку заголовка.
phdi := DllCall("VirtualAllocEx", "uint", hProcess
, "uint", 0
, "uint", MaxName + 48
, "uint", MEM_COMMIT
, "uint", PAGE_READWRITE)
If (phdi = 0) {
MsgBox, Ошибка выделения памяти в процессе.
Goto, Close
}
; Запись нужных значений в структуру.
NumPut(HDI_TEXT, hdi), NumPut(phdi+48, hdi, 8), NumPut(MaxName, hdi, 16)
; Структура копируется в память процесса.
Ret := DllCall("WriteProcessMemory", "uint", hProcess
, "uint", phdi
, "uint", &hdi
, "uint", 48
, "uint", 0)
If (Ret = 0) {
MsgBox, Ошибка записи в память процесса.
Goto, Free
}
; Запрос количества заголовков.
Count := DllCall("SendMessageA", "uint", hWnd
, "uint", HDM_GETITEMCOUNT
, "uint", 0
, "uint", 0)
If (Count < 0) {
MsgBox, Ошибка определения количества заголовков.
Goto, Free
}
Loop, % Count ; Запрос информации о каждом заголовке.
{
DllCall("SendMessageA", "uint", hWnd
, "uint", HDM_GETITEMA
, "uint", A_Index - 1
, "uint", phdi)
; Заголовок копируется из памяти процесса в местный буфер.
Ret := DllCall("ReadProcessMemory", "uint", hProcess
, "uint", phdi+48
, "uint", &Buf
, "uint", MaxName
, "uint", 0)
If (Ret = 0) {
MsgBox, Ошибка чтения из памяти процесса.
Goto, Free
}
VarSetCapacity(Buf, -1) ; Обновление переменной.
Headers .= Buf . (A_Index != Count ? Delimiter : "")
}
Free: ; Освобождение памяти в процессе.
DllCall("VirtualFreeEx", "uint", hProcess
, "uint", phdi
, "uint", MaxName+48
, "uint", MEM_DECOMMIT)
Close: ; Освобождение хэндла процесса.
DllCall("CloseHandle", "uint", hProcess)
Return Headers
} ; ======== End =======
Прошу помощи в восстановлении работоспособности!

