View previous topic :: View next topic |
Author |
Message |
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Thu Jun 09, 2016 14:20 Post subject: |
|
|
В TC9.0b1 добавлено
Quote: | - Send WM_USER+50 with wparam=1..29 -> returns window handle of control. Controls are: 1=leftlist, 2=rightlist, 3=active list, 4=inactive list, 5=leftheader, 6=rightheader, 7=leftsize, 8=rightsize, 9=leftpath, 10=rightpath, 11=leftinfo, 12=rightinfo, 13=leftdrives, 14=rightdrives, 15=leftpanel, 16=rightpanel, 17=bottompanel, 18=lefttree, 19=righttree, 20=cmdline, 21=curdirpanel, 22=inplaceedit, 23=splitpanel, 24=leftdrivepanel, 25=rightdrivepanel, 26=lefttabs, 27=righttabs, 28=buttonbar, 29=buttonbarvertical64)
- Send WM_USER+50 with wparam set to 1000 to get active panel: 1=left, 2=right
- Send WM_USER+50 with wparam set to 1001/1002 to get number of items in left/right list
- Send WM_USER+50 with wparam set to 1003/1004 to get total number of items (including those hidden by quick filter
- Send WM_USER+50 with wparam set to 1005/1006 to get total number of selected items
- Send WM_USER+50 with wparam set to 1007/1008 to get index of current item (caret)
- Send WM_USER+50 with wparam set to 1011/1012 to get index of first file in list (-1 if there are no files)
- Send WM_USER+50 with wparam set to 1009/1010 to get index of first item (0 if there is no updir, 1 otherwise)
- Send WM_USER+50 with wparam set to 1011/1012 to get index of first file in list (-1 if there are no files) |
Добавлено:
Тема на оффоруме
Last edited by Skif_off on Fri Jul 01, 2016 15:01; edited 1 time in total |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Sun Jun 12, 2016 02:21 Post subject: |
|
|
К посту выше: не понял, почему Гислер пишет window handle of control, если возвращется ControlID, но работает всё. Расписывать на знакомых мне языках не буду, простейший вызов DllCall (SendMessage) возвращет массив с ControlID (или просто число с wparam=10хх), дескриптором главного окна ТС, значением wparam, 1075 (WM_USER+50 или WM_USER+51?) и что-то ещё (видимо, отсутствие ошибки - 0). Нужное - в первой ячейке массива ([0]), если элемент выключен, то в первой ячейке массива возвращает 0.
Добавлено спустя 11 минут:
P.S. А может и не всё: загнал всё в массив и в цикле слал х32-версии - поленился прогнать всё снова на х64.
P.P.S. Number of items включает в себя строку "..". |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Fri Jul 01, 2016 15:32 Post subject: |
|
|
Отсюда:
Quote: | 1. Наверно не WM_USER+50 а WM_USER+51
2. Мне выдаёт хендлы |
1. Наверное, нет: у меня WM_USER+51 не срабатывет. WM_USER+51 для вызова внутренних команд в wParam, включая команды с параметрами в ТС9.
2. У меня выдаёт ID контролов (AutoIt 3.3.8.1, 3.3.12.0)
Quote: | а) Из первых 4-х 2 точно должны быть одинаковыми , т.к. левая, правая, активная, неактивная панели (оказывается 3 и 4 - это хендлы панелей инструментов)
б) 5 и 6 пусто, хотя заголовок физически есть
в) с 11 по 14 leftinfo... что это? это точно не хендл...
г) 28 и 29 пусто , хотя оба бара включены |
а) Точно одинаковые и именно списки файлов/папок, никаких панелей инструментов.
б) Не пусто, но не понял, что это, и не удалось забрать текст из контрола (ControlGetText() возвращает пустую строку).
в) Размер и свободное место дисков над файловыми панелями, потом комбобоксы с дисками (Окно выбора дисков)
г) У меня работает в ТС обеих разрядностей.
Мой скрипт для проверки Code: | #include <Array.au3>
Global Const $WM_USER = 0x400
Local $hTC, $i, $Result
$hTC = WinGetHandle('[CLASS:TTOTAL_CMD]')
If @error Then
MsgBox(48 + 4096, 'GoToDirectoryHotlist.au3', 'Окно ТС не найдено!')
Exit
EndIf
Local $aWparam[43]
$aWparam[0] = 42
$aWparam[1] = 1
$aWparam[2] = 2
$aWparam[3] = 3
$aWparam[4] = 4
$aWparam[5] = 5
$aWparam[6] = 6
$aWparam[7] = 7
$aWparam[8] = 8
$aWparam[9] = 9
$aWparam[10] = 10
$aWparam[11] = 11
$aWparam[12] = 12
$aWparam[13] = 13
$aWparam[14] = 14
$aWparam[15] = 15
$aWparam[16] = 16
$aWparam[17] = 17
$aWparam[18] = 18
$aWparam[19] = 19
$aWparam[20] = 20
$aWparam[21] = 21
$aWparam[22] = 22
$aWparam[23] = 23
$aWparam[24] = 24
$aWparam[25] = 25
$aWparam[26] = 26
$aWparam[27] = 27
$aWparam[28] = 28
$aWparam[29] = 29
$aWparam[30] = 1000
$aWparam[31] = 1001
$aWparam[32] = 1002
$aWparam[33] = 1003
$aWparam[34] = 1004
$aWparam[35] = 1005
$aWparam[36] = 1006
$aWparam[37] = 1007
$aWparam[38] = 1008
$aWparam[39] = 1009
$aWparam[40] = 1010
$aWparam[41] = 1011
$aWparam[42] = 1012
For $i = 1 To $aWparam[0]
$Result = _SendMessage($hTC, $WM_USER + 50, $aWparam[$i])
If @error Then
MsgBox(4096, $aWparam[$i], "_SendMessage Error: " & @error)
ContinueLoop
EndIf
If IsArray($Result) Then
_ArrayDisplay($Result, $aWparam[$i])
Else
MsgBox(4096, $aWparam[$i], $Result)
EndIf
Next
Func _SendMessage($hWnd, $iMsg, $wParam = 0, $lParam = 0, $iReturn = 0, $wParamType = "wparam", $lParamType = "lparam", $sReturnType = "lresult")
Local $aResult = DllCall("user32.dll", $sReturnType, "SendMessageW", "hwnd", $hWnd, "uint", $iMsg, $wParamType, $wParam, $lParamType, $lParam)
If @error Then Return SetError(@error, @extended, "")
;If $iReturn >= 0 And $iReturn <= 4 Then Return $aResult[$iReturn]
Return $aResult
EndFunc ;==>_SendMessage |
Собственно, кое-что уже использую. |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
(Separately) Posted: Fri Jul 01, 2016 19:55 Post subject: |
|
|
У меня вроде все пучком.
По мотивам сообщений с 10** нацарапал скрипт на PowerPro PanelInfo Code: | local hwnd = win.handle("c=TTOTAL_CMD")
local Left = "Left: "
local Right = "Right: "
local f1L = win.sendmessage(hwnd, 0x400+50, 1011, 0) //index of first file in list (-1 if there are no files)
local f1R = win.sendmessage(hwnd, 0x400+50, 1012, 0)
Left ++= ifelse(f1L == -1, "Only dirs, ", f1L - 1 ++ " dirs, ")
Right ++= ifelse(f1R == -1, "Only dirs, ", f1R - 1 ++ " dirs, ")
local i1L = win.sendmessage(hwnd, 0x400+50, 1009, 0) //index of first item (0 if there is no updir, 1 otherwise)
local i1R = win.sendmessage(hwnd, 0x400+50, 1010, 0)
Left ++= ifelse(i1L, "updir, ", "no updir, ")
Right ++= ifelse(i1R, "updir, ", "no updir, ")
local CurL = win.sendmessage(hwnd, 0x400+50, 1007, 0) //index of current item (caret)
local CurR = win.sendmessage(hwnd, 0x400+50, 1008, 0)
Left ++= "index " ++ CurL ++ ", "
Right ++= "index " ++ CurR ++ ", "
Left ++= ifelse(CurL, ifelse(not f1L || CurL < f1L, "dir", "file"), ifelse(i1L, "updir", "dir")) ++ " is current, "
Right ++= ifelse(CurR, ifelse(not f1R || CurR < f1R, "dir", "file"), ifelse(i1R, "updir", "dir")) ++ " is current, "
local SelL = win.sendmessage(hwnd, 0x400+50, 1005, 0) //total number of selected items
local SelR = win.sendmessage(hwnd, 0x400+50, 1006, 0)
local TotL = win.sendmessage(hwnd, 0x400+50, 1003, 0) //total number of items
local TotR = win.sendmessage(hwnd, 0x400+50, 1004, 0)
Left ++= SelL ++ " of " ++ TotL - i1L ++ " selected, "
Right ++= SelR ++ " of " ++ TotR - i1R ++ " selected, "
local NumL = win.sendmessage(hwnd, 0x400+50, 1001, 0) //number of items
local NumR = win.sendmessage(hwnd, 0x400+50, 1002, 0)
Left ++= NumL - i1L ++ " total. "
Right ++= NumR - i1R ++ " total. "
win.debug(Left,Right)
quit |
Что касается сообщений с параметрами от 1 до 30, то скрипт еще проще: Code: | local hwnd = win.handle("c=TTOTAL_CMD")
local i, Hand
for(i = 1; i < 30; i++)
Hand = win.sendmessage(hwnd, 0x400+50, i, 0)
win.debug(i, Hand, win.gettext(Hand))
endfor |
Что конкретно не устраивает? Какой хендл/текст не удается получить? Quote: | P.P.S. Number of items включает в себя строку ".." | У меня нет. Тестил на:
* Директориях с файлами и директориями (общий случай);
* То же, только с файлами;
* То же, только с директориями;
* Пустых директориях;
* Сетевом окружении.
Надо учитывать, что updir тоже считается за "элемент". Quote: | 5 и 6 пусто, хотя заголовок физически есть | Header - это загаловки колонок. Какой текст ты хочешь там увидеть? Возможно, ссылку на массив, где находятся тексты заголовков всех колонок. Даже если это так, я вижу в этом мало смысла. Ведь эти заголовки суть произвольный текст, введенный пользователем.
Вообще я бы предпочел программно получать текущий набор колонок и, главное - способ сортировки (номер колонки и маркер прямой/обратный).
Гислера можно понять. Всяческие скрипто- и утилитописцы (я в том числе) давно просили у него расширения способов программного управления Тоталом. Он сказал: "Вам хочется хендлов? Их есть у меня", и вывалил список параметров сообщений. Знаешь, что это - пользуйся, не знаешь - не обращай внимания.
Например, коды 11 и 12 позволяют узнать свободное место на текущих дисках. Кому-то, глядишь, и пригодится. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Sat Jul 02, 2016 01:28 Post subject: |
|
|
Вахмурка wrote: | У меня нет. Тестил на:
...
Надо учитывать, что updir тоже считается за "элемент". |
Так "нет" или "считается"? Например, в папке три каталога - ТС показывает 4 элемента, у меня везде, где есть "..", number на единицу больше реального количества папок/файлов (сетевое окружение не проверял). |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
(Separately) Posted: Sat Jul 02, 2016 01:33 Post subject: |
|
|
Я тебя не понял. Я думал, что число элементов выдается как "..2", например. Ты использовал нестандартную терминологию. Не нравится updir, скажи "вход в директорию" или, согласно переводу Власова-Казакова: "элемент [..]" _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Sat Jul 02, 2016 13:33 Post subject: |
|
|
Вахмурка
Число - оно и есть число, откуда там точки в начале?
Прошу прощения, с LB_GETTEXT возился в подробном виде, проверка была попутной - вот и ляпнул "строка" вместо "элемент". И у меня почему-то первая бета запустилась без квадратных скобок в именах каталогов (в wincmd.ini только UseIniInProgramDir=7), поэтому написал "..", а не "[..]", что было бы понятнее, наверное. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Thu Jul 28, 2016 01:37 Post subject: |
|
|
; 08.06.16 Added: Send WM_USER+50 with wparam set to 1003/1004 to get total number of items (including those hidden by quick filter (32/64)
; 08.06.16 Added: Send WM_USER+50 with wparam set to 1001/1002 to get number of items in left/right list (32/64)
А в чём разница?
Посылаю 1002 и 1004 - в обоих случаях получаю одинаковый ответ.
Активирую Ignore List и добавляю туда несколько файлов. Опять посылаю 1002 и 1004 - получаю одинаковый ответ (в обоих случаях скрытые файлы не учитываются). _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Jul 28, 2016 01:54 Post subject: |
|
|
По описанию первый случай и должен отличаться от второго только в случае сокращения списка при быстрой фильтрации. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Thu Jul 28, 2016 02:13 Post subject: |
|
|
Flasher wrote: | По описанию первый случай и должен отличаться от второго только в случае сокращения списка при быстрой фильтрации. |
Всё, понял.
Сразу не сообразил, что за фильтрация имелась в виду.
Тут ещё вроде баг нарисовался с 1011/1012. Судя по описанию, должно возвращать -1 в случае отсутствия файлов в панели. У меня другой результат получается (на чистом Тотале). Проверьте, отпишитесь:
http://www.ghisler.ch/board/viewtopic.php?t=45068 _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Thu Jul 28, 2016 16:16 Post subject: |
|
|
LonerD
Win7x64, на AutoIt пробовал так:
Hidden text Code: | #NoTrayIcon
Global Const $WM_USER = 0x400
Local $hTC, $aResult
$hTC = WinGetHandle('[CLASS:TTOTAL_CMD]')
$aResult = DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hTC, "uint", $WM_USER + 50, "wparam", 1011, "lparam", 0)
MsgBox(48 + 4096, 'GoToDirectoryHotlist.au3', $aResult[0]) |
(AutoIt3.exe)
Возвразщает "4294967295" только при сочетании AutoItx64 + TCx86.
Last edited by Skif_off on Tue Aug 02, 2016 05:33; edited 1 time in total |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Thu Jul 28, 2016 21:44 Post subject: |
|
|
Да, точно. Я ж не написал как получаю этот результат. Добавил в багрепорт.
AutoHotkey последней версии 32х битный (только такой всегда использую) и обе версии Тотала х32 и х64.
Скрипт самый простейший
Code: | #NoEnv
#NoTrayIcon
SendMessage, 1074, 1011, 0, , ahk_class TTOTAL_CMD
MsgBox, % ErrorLevel
ExitApp |
_________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Tue Aug 02, 2016 06:08 Post subject: |
|
|
LonerD
Не понял, признано баг-репортом или нет? Посмотрел ещё раз про ErrorLevel, похоже, не баг и вам (автору скрипта) самому нужно пересчитывать?
Похоже, тип возвращаемого параметра должен быть "int", а не "lresult"? |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Tue Aug 02, 2016 14:20 Post subject: |
|
|
Я тоже не понял. Вроде как сошлись на том, что не баг.
Почему у меня при первых попытках получалось 75 в конце числа вместо 95 - не знаю (я человек невнимательный, но помню, что тогда очень старательно выписывал результат, стараясь не ошибиться). _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Tue Aug 02, 2016 23:53 Post subject: |
|
|
LonerD wrote: | очень старательно выписывал результат, стараясь не ошибиться |
А буфер обмена на что?
Наверное, можно проверять значение и при получении 4294967295 - использовать 1003/1004 для проверки (не хочется менять канонiчную функцию в AutoIt). |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|