Re: AHK: Замена "Window Spy"
ypppu, так он хочет не получить, а изменить.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы Назад 1 … 4 5 6 7 8 … 19 Далее
Чтобы отправить ответ, вы должны войти или зарегистрироваться
ypppu, так он хочет не получить, а изменить.
Ну тогда не знаю, только левую часть строки состояния могу предложить:
ControlSetText , msctls_statusbar321, NewText, AutoHotkey Script.ahk - Блокнот
Не в курсе.
Запрещается поиск на форуме программ и алгоритмов для взлома
Честно говоря, не понял какое это имеет отношение к моему вопросу.
ypppu, спасибо, в "Блокноте" даже вот так работает:
ControlSetText,msctls_statusbar321,123,A
А, например, в паинте не хочет. Какая-то разница во внутренней структуре статусбара? Можно что-то сделать, чтобы хотя бы первое поле, как в блокноте, менялось?
У меня работает. В Paint надпись "Для получения справки..." меняется на "NewText".
Windows XP SP3
Paint 5.1.2600.5512
AutoHotkey.exe 1.1.23.5 Unicode 32 bit
Что-то я не помню даже надписи такой в тех версиях.
У меня Win7 x64
Paint 6.1.7600.16385
AHK Version v1.1.22.03 x64
В строке статуса поля по порядку:
1. координаты курсора
2. размер выделения
3. размер рисунка
4. масштаб с ползунком.
Ни одно не меняется.
Честно говоря, не понял какое это имеет отношение к моему вопросу.
Ну вы же спросили как ломать.
Можно что-то сделать, чтобы хотя бы первое поле, как в блокноте, менялось?
По идее можно попробовать отсылать сообщение SB_SETTEXT, но у меня не получается.
f11::
SendMessage, 0x401, 0, NewText,, A
А через АСС можно менять текст?
Malcev, я просто не понял что вы имеете под этим "ломать" ввиду. И сейчас не совсем понимаю. "Ломать" подразумевает какую-то порчу, незаконное использование, что-то такое. Мой вопрос к этому никаким боком не относится.
Alectric, у меня не меняет.
Kurskador, я имел ввиду вообще, можно ли менять через АСС, вопрос ко всем.
https://msdn.microsoft.com/en-us/librar … s.85).aspx
Name больше не поддерживается. Можно только value.
Malcev, я просто не понял что вы имеете под этим "ломать" ввиду. И сейчас не совсем понимаю
Декомпилировать, модифицировать и скомпилировать.
Нет, мне такой метод не подходит.
Вообще как-то странно, что определяется в разных приложениях одинаково, а менять можно не во всех.
Вроде понял почему этот код
f11::
SendMessage, 0x401, 0, NewText,, A ; SB_SETTEXT
не срабатывает:
http://forum.script-coding.com/viewtopic.php?id=3440
Но сделать его работоспособным сам не смогу.
Такое что ли надо?
text := "NewText"
part := 0
Return
F11::
ControlGet, hSB, hwnd,, msctls_statusbar321, A
StatusBarSetText(text, hSB, part)
Return
StatusBarSetText(text, hSB, index) {
static SB_SETTEXT := 0x401
VarSetCapacity(var, StrPut(text, "CP0"))
StrPut(text, &var, "CP0")
WinGet, PID, PID, ahk_id %hSB%
size := StrLen(text)
buff := new RemoteBuffer(PID, size)
buff.Write(&var, size)
SendMessage, SB_SETTEXT, index, buff.ptr,, ahk_id %hSB%
}
Class RemoteBuffer
{
__New(PID, size)
{
static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
, MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
Return
if !(this.ptr := DllCall("VirtualAllocEx", UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
Return, "", DllCall("CloseHandle", Ptr, this.hProc)
}
__Delete()
{
DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
DllCall("CloseHandle", Ptr, this.hProc)
}
Read(size, offset = 0)
{
static LocalBuff
VarSetCapacity(LocalBuff, size, 0)
if !DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &LocalBuff, UInt, size, UInt, 0)
Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось прочитать данные`nОшибка """ A_LastError """", Str, "", UInt, 0)
VarSetCapacity(LocalBuff, -1)
Return &LocalBuff
}
Write(pLocalBuff, size, offset = 0)
{
res := DllCall("WriteProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
Return res ? res : 0, (!res) ? DllCall("MessageBox", Ptr, 0, Str, "Не удалось записать данные`nОшибка """ A_LastError """", Str, "", UInt, 0)
}
}
Работает отлично, спасибо!
serzh82saratov, спасибо за работу! Отличный скрипт! Давно им пользуюсь и доволен, как слон, но есть небольшое замечание, если позволите:
В контекстном меню пункты "Memory position" и "Memory size" было бы лучше так:
Remember position
Remember size
или
Keep position
Keep size
Memory в переводе - память (сущ.)
Remember - запоминать, помнить
Keep - сохранять
Извините, если что не так ....
А можно как-то отдельно получить и значения поля "Description"? А то эта замечательная прога показывает, а я никак не могу получить нужное.
freeZer0K
Переделал на Remember.
serzh82saratov
А нет желания настроить своё детище под текущий масштаб?
Flasher
Прочитал пост, но не прочитал тему.
Речь про -DPIScale. А зачем? Плохо отображается?
serzh82saratov
Запускается же с Mouse & Control, по высоте попадает только процентов 60, про ширину вообще молчу.
Получается много лишних телодвижений с прокруткой/ресайзингом.
Может уменьшить шрифт, или увеличить размер окна (последний может сохранятся).
У всех выглядит также, всё не уместить, а в мелком шрифте копатся я нелюбитель.
Так понимаю -DPIScale тут не причём?
DPIScale по идее должен улучшать положение, но пока смотрится неорганично. Шрифт 12-м поставил.
Размер зафиксировал. Я же пишу об автоподгоне под текст. Или это за гранью?
Хотя бы дефолтный размер для паблика увеличить не помешает.
Я же пишу об автоподгоне под текст.
Подгонять ширину окна?
Хотя бы дефолтный размер для паблика увеличить не помешает.
Это где?
Ос какая, знаю что на 10 выглядит криво.
Кстати, по поводу дрожания рамки.
http://forum.script-coding.com/viewtopi … 679#p85679
Если заменить эту строчку:
ShowMarker(WinX2+CtrlX, WinY2+CtrlY, CtrlW, CtrlH)
на эту:
ShowMarker(WinX2+CtrlX+5, WinY2+CtrlY+5, CtrlW-10, CtrlH-10)
То дрожание пропадает.
Из этого можно сделать вывод, что дрожание проявляется при одинаковых координатах ShowAccMarker() и ShowMarker().
Нет ли желания сделать такой пункт в меню - выбора, что показывать:
1) ShowMarker()
2) ShowAccMarker()
3) ShowMarker()+ ShowAccMarker()
Подгонять ширину окна?
Да и высоту тоже.
Это где?
Ос какая, знаю что на 10 выглядит криво.
Что где? Win7 x32. Не то чтобы криво, скорее несколько неказисто.
Malcev
AccMarker можно выключить в меню, может добавлю ещё Marker, и упраздню пункт полного отключения. Всё же странно что у других такого нет, я ведь и с твоими настройками пробовал.
Хотя бы дефолтный размер для паблика увеличить не помешает.
Многое можно сделать под себя прописав в AhkSpyInclude.ahk.
Подгонять размеры под содержимое, может и возможно, но я не сторонник таких мельканий на экране.
Определил что надо, нажал Ф11.
Многое можно сделать под себя
Речь о паблике. Это совет. 3, 4 строчки больше всего места занимают. Можно изначально растянуть под них.
но я не сторонник таких мельканий на экране.
Для высоты только при первом запуске этой проблемы не будет.
нажал Ф11.
Не пользуюсь. Не то приложение, чтобы весь экран занимать.
Не пользуюсь. Не то приложение, чтобы весь экран занимать.
А если содержимое весь экран займёт.
Речь о паблике.
Ху из паблик - шмаблик.
Для высоты только при первом запуске этой проблемы не будет.
?
А если содержимое весь экран займёт.
Маловероятно. По крайней мере выбрать какую-то относительно приемлемую ширину не помешает.
Ху из паблик - шмаблик.
Public (паблик) - публика, общественность. "Выложить в паблик" такое же устоявшееся сетевое выражение как и "выложить на шару".
Есть ещё такое понятие "public float" (публичное размещение).
? - По максимальному числу строк. Нет?
Изменить размер общественности...
Маловероятно. По крайней мере выбрать какую-то относительно приемлемую ширину не помешает.
Ну так надо тогда просто пользоватся окном в таком размере.
Изменить размер общественности...
Предлог "для" отчего пропущен?
Ну так надо тогда просто пользоватся окном в таком размере.
Ну, пусть будет изначально неудобно, ОК. Хозяин — барин.
Ну так я же говорю, размер для публики или общественности можно изменить в инклуде, обновления если и затронут инклуд, то "раз в 5 лет", ведь кому то из общественности такие нововведения в основной версии могут показатся спорными "преимуществами", например мне.
Ну, пусть будет изначально неудобно
Пусть.
Позиция ясна. Собственно, поэтому я в большинстве случаев предпочитаю вызвать более удобную спецутилиту.
Так как я, увы для себя таковую не нашёл, то для себя же и пришлось написать то что получилось. Не понятно зачем те кому данный сабж никуда не упёрся, хотят всё же что то в нём поменять, видимо они переживают за тех кто этой ерундой пользуется.
Но проще наверное просто рассказать всем про что то более удобное, ТС тоже перестал бы мучатся, посмотрел бы наглядно к чему стремится, а скорее всего удалил бы тему за ненадобностью, раз велосипед давно уже изобретен.
Не советую спешить с выводами. Ключевое тут -
в большинстве
Всё же странно что у других такого нет, я ведь и с твоими настройками пробовал.
Можно еще раз попробовать. Я на 5 компах проверял.
Трястись синяя линия начинает при отключенном "enable desktop composition" и "Use visual styles on windows and buttons".
Хорошо видно на рабочем столе, либо при наведении на иконки в трее.
Трясутся только те части синий линии, которые лежат на красной.
При том минимизированные окна, иконки с выбором языка, часы и "показать рабочий стол" не трясутся, а все остальные да.
Flasher
Так я и не претендую на утилиту для всех случаев, потому например и добавил запуск iWB2 Learner.ahk и AccViewer Source.ahk из интерфейса, о чём упомянуто в описании, хотя поверхностно их функционал и присутствует, но тяжело полностью скопировать его в рамках программы. Часто оно просто позволяет понять требуется ли их использование.
Malcev
Хватает "Включение композиции рабочего стола", не знаю почему до этого не заметил. Но вроде не так уже бросается в глаза.
Как это починить не знаю, это 2 окна AlwaysOnTop, сначало одно выходит на передний план, потом другое.
Не показывать снова если в тех же координатах, не вариант.
Надо что то химичить, выводя одним окном, или WinSet, Region отрезать места накладки друг на друга.
это 2 окна AlwaysOnTop, сначало одно выходит на передний план, потом другое.
При том минимизированные окна, иконки с выбором языка, часы и "показать рабочий стол" не трясутся, а все остальные да.
Почему так, тоже вопрос. Также как - почему не мелькает при включенной композиции.
Если создать простейший пример с 2 гуи и с мельканиями, то можно будет спросить на оф.форуме.
Что-то в этой теме, не упомянули про "AutoIt Window Info", как замене "Window Spy".
Если создать простейший пример с 2 гуи и с мельканиями, то можно будет спросить на оф.форуме.
Буду ждать новостей.
Что-то в этой теме не упомянули про "AutoIt Window Info", как замене "Window Spy".
Это замечательно, как пользователь другой утилиты приведите относительные плюсы AutoIt Window Info, или минусы этой, будет конструктивно.
приведите относительные плюсы AutoIt Window Info
Плюс в том, что после определения данных, их можно выделить и скопировать в буфер обмена. В Window Spy, они сразу удаляются, как только сдвигается курсор. Минусов пока не обнаружил, хотя перепробовал уже много подобных программ. А ваша утилита, у меня выдается ошибку:
Error: Parameter #4 must be blank in this case.
Specifically: 3
Line#
1586: }
1588: {
1589: For k,v in Arr
1590: if (v == Val)
1591: Return,k
1592: }
1594: {
---> 1595: Transform,str,HTML,%str%,3
The program will exit.
Я имел ввиду относительно AhkSpy.
А ваша утилита, у меня выдается ошибку:
Примечания:
Код предназначен только для AutoHotkey_L Unicode.
Мне кажется, ошибка как-то связанна с Internet Explorer.
ошибка как-то связанна с Internet Explorer
В системе должен быть установлен Internet Explorer не ниже 9 версии.
кажется
То есть нет смысла запустить под AutoHotkey_L Unicode. Тогда плюс неоспорим, ваша утилита запускается, в отличие от сабжа.
То есть, нет смысла запустить под AutoHotkey_L Unicode
Я запустил под AutoHotkey_L Unicode, все равно ошибка. В этом и заключается минус вашей программы, что она как-то связана с Internet Explorer.
Я запустил под AutoHotkey_L Unicode, все равно ошибка.
Та же ошибка?
serzh82saratov, да.
---> 1595: Transform,str,HTML,%str%,3
В Unicode такой ошибки не должно быть.
А почему вы думаете что эта ошибка связана с Internet Explorer?
После того, как поставил обновления, Internet Explorer 11 не открывал страницы. Потом удалил и поставил Internet Explorer 10, он работает, есть какая-то неисправность в Internet Explorer. Вот и ваша программа не запустилась тоже. Все должно было работать, ведь IE работает.
Так почему надо грешить на IE, если ошибка не дающая запустить код вообще не про это?
serzh82saratov, а это слово в ошибке что значит "HTML,%str%,3".
Ничего, просто в анси у Transform нет последнего параметра.
Вам виднее, но слово "HTML" в ошибке, указывает на IE.
Converts String into its HTML equivalent by translating characters whose ASCII values are above 127 to their HTML names (e.g. £ becomes £). In addition, the four characters "&<> are translated to "&<>. Finally, each linefeed (`n) is translated to <br>`n (i.e. <br> followed by a linefeed). The Flags parameter is ignored.
Каким образом перевод символов указывает на IE?
Тогда, в чем может быть ошибка?
В анси.
Да, кодировку поменял заработало (ни там поменял). Нормальная программа вроде. Определение виртуальных кнопок, думаю, пригодится. Минус сам собой напрашивается - не работает в ANSI кодировки.
Минус в использовании ANSI.
Добавил:
Window or control backlight - Показывать красную рамку для окна или контрола
Ctrl+Wheel(Down|Up) - Изменить размер шрифта.
Remember font size - Запоминать размер шрифта
Плюс в том, что после определения данных, их можно выделить и скопировать в буфер обмена. В Window Spy, они сразу удаляются, как только сдвигается курсор.
Там внизу окна есть подсказка: Win+A to freeze display. После этого можно копировать.
serzh82saratov
Сейчас стало явно получше. Вот ещё что. Если фокус в окне программы, то заход указателя за пределы его окна не даёт результата в отличии от программ "аналогов". Надо бы поправить или внести опцию.
P.S.: И, может, всё-таки в будущем снизойдёте до AhkSpy 2.0 в уже фиксированном диалоговом представлении с квадратными кнопками-иконками копирования в буфер, т.к. фокусироваться указателем на сменяемых позициях данных с последующим аккуратным выделением их частей немного раздражительно. А ведь хочется подвинуть мышь на кнопку, жмякнуть ЛКМ да забыть.
Если фокус в окне программы, то заход указателя за пределы его окна не даёт результата
Удерживать Shift+Tab. Заход указателя за пределы его окна не очень удобно когда выходишь за край не желая этого, и данные пропадают. Для деактивации окна есть ещё клик по "цветному прямоугольнику" (между кнопками "Mouse && Control" и "Button") деактивирует окно (Alt+Escape).
фиксированном диалоговом представлении
Мне ненравится такое представление, большую часть данных не видно, все поля в "одну страницу" не поместишь, всё равно листать.
На многих заголовках есть кнопки копирования, выделенное копируется RButton. Shift+Wheel(Down|Up) или F1 и F2 - Навигация по заголовкам (удобно если много данных).
Удерживать Shift+Tab
Накладно. Всё же предлагаю добавить опцию переключения такого свойства.
большую часть данных не видно
А мне, например, и не надо видеть заголовок целиком, если будет копирование по кнопке. К тому же можно сделать отображение тултипа при подводе указателя. Все остальные данные, ИМХО, вполне можно разместить в окне так, чтобы умещалось.
все поля в "одну страницу" не поместишь, всё равно листать
Думаю, вполне всё поместится. Можете сделать скриншот с подобным? Посмотрим, подумаем.
На многих заголовках есть кнопки копирования
На основных верхних (до Name) их нет.
выделенное копируется
Так мне как раз чаще удобней ничего не выделять, а просто кликать.
Shift+Wheel(Down|Up) или F1 и F2 - Навигация по заголовкам (удобно если много данных).
Нажимаю/вращаю - ничего не происходит.
serzh82saratov, судя по опытам виноват WinSet, TransParent.
Lexikos, тут объясняет:
https://autohotkey.com/board/topic/5122 … setparent/
Можно попробовать делать прозрачность через gdi+.
https://msdn.microsoft.com/en-us/library/ms633556.aspx
Кстати, у teadrinker была такая же проблема:
Если вы используете в Windows 7 тему "Классика", при выделении ячейки цветом может
происходить неприятное мелькание текста. В этом случае через меню «Вид» можно
указать цвет выделения равный цвету фона ячейки, тогда при наведении курсора на
ячейку её цвет меняться не будет.
На основных верхних (до Name) их нет.
Конечно нет, там много разных мелких параметров, если на каждый делать кнопку да ещё и поле отдельное, не знаю в размер какого окна это всё поместится.
Может автоматом выделять весь параметр когда мышь над ним, и кликать правой...
Нажимаю/вращаю - ничего не происходит.
У меня когда много текста по высоте, то перемещается между заголовками (те что с красными линиями).
судя по опытам виноват WinSet, TransParent.
Может посмотрю на досуге, но ты наверное быстрее разберёшся.
Конечно нет, там много разных мелких параметров
Так они-то и нужны прежде всего. Те-то мне зачем? И, кстати, эти кнопки не работают, если окно не в фокусе.
Может автоматом выделять весь параметр когда мышь над ним, и кликать правой..
Хотелось бы не только выделять, но и сразу копировать. Только в придачу нужно придумать и клик для комбинаций, например, при подводе указателя к границе (<5 px) между объектами данных.
У меня когда много текста по высоте, то перемещается между заголовками (те что с красными линиями).
А, понятно. Это если окошко совсем маленьким по высоте сделать, то смысл в этом, вероятно, появляется. )
Так опцию вкл./выкл. независимого от фокуса поиска добавите? Очень надо.
Кстати, может, справшивали, а почему меню не на русском? Мы ж не на autohotkey.com/boards, да и шапка на русском.
Напрягать каждый раз мозг с переводом и одновременным поиском нужного пункта особо не радует.
По-хорошему, надо все надписи брать из файла настроек и сделать переключение языка. Тогда можно и на буржуйском форуме выложить. Думаю, там тоже заинтересуются.
YMP
Согласен.
Там внизу окна есть подсказка: Win+A to freeze display.
Все равно - Au3Info для меня получше будет.
Каждый же может взять из AhkSpy понравившиеся плюшки и сделать удобную для себя прогаммулину.
По-хорошему, надо все надписи брать из файла настроек и сделать переключение языка. Тогда можно и на буржуйском форуме выложить.
Так и сейчас можно. Меню же всё на английском.
Так и сейчас можно.
Сделать переключение языка? Нет, нельзя.
Я имею в виду сейчас уже можно выложить на оф.форуме.
Для этого не надо делать переключение языка.
Заметил такой недочёт: грузит процессор на 3 — 5%, даже если курсор остаётся на месте.
Да, у меня тоже грузит.
Я имею в виду сейчас уже можно выложить на оф.форуме.
Т.е. я поймал на оверквотинге?
Для этого не надо делать переключение языка.
Переключение языка нужно явно не для выкладки на оффорум.
А, понятно. Это если окошко совсем маленьким по высоте сделать, то смысл в этом, вероятно, появляется. )
Ну это если у пользователя совсем запущенный случай... А так например если в "Control Text" большой текст, и надо перейти в "AccInfo", то наверное смысл очевиден.
Так опцию вкл./выкл. независимого от фокуса поиска добавите? Очень надо.
Добавил - "Work with the active window".
Заметил такой недочёт: грузит процессор на 3 — 5%, даже если курсор остаётся на месте.
Ну а как он ещё узнает что что то изменилось под курсором не собрав всю информацию. Или у тебя над окном сабжа грузит, или когда свёрнуто?
сделать переключение языка
Описание пунктов меню есть на русском, один раз настроил и забыл, если какие то часто выбираешь, то машинально. В инглише не силён, но вроде всё понятно читая пункты при поиске нужного. Делать поддержку разных языков пока желания нет, ради чего этим усложнять код тоже не ясно.
Ну это если у пользователя совсем запущенный случай.
Наверно. Благо у меня не он.
Добавил - "Work with the active window".
Спасибо.
если какие то часто выбираешь, то машинально
Автору легко говорить. Я же постоянно глаза ломаю, напряжно.
ради чего этим усложнять код тоже не ясно
По-моему, прочесть из ini значения ключей - это самое простое, что можно сделать в подобном коде. Так себе усложнение.
Что по кнопкам?
Ну а как он ещё узнает что что то изменилось под курсором не собрав всю информацию.
А зачем всю-то? Нужно только хэндл объекта (или accObject) и его координаты. Если эти данные не изменились, всё остальное получать скорее всего не нужно. Понятно, что может измениться какой-то текст, но вряд ли это так принципиально. Потом, нагрузка, скорее всего, из-за использования WMI, без которого можно обойтись.
Flasher, не вижу здесь оверквотинга.
По-моему, всё понятно, что я хотел сказать.
- По-хорошему, надо все надписи брать из файла настроек и сделать переключение языка. Тогда можно и на буржуйском форуме выложить.
- Так и сейчас можно. Меню же всё на английском.
Malcev
Вы неверно трактуете мысль. Под "Тогда" подразумевалось не "И в этом случае уже", а "Вдобавок к этому уже".
Никогда не встречал такое трактование слова "тогда".
http://gramota.ru/slovari/dic/?word=%D1 … &all=x
Трактовать мысль - не то же, что слово. С союзом "и" предложение носит добавочный (побочный) характер, т.е. в значении "при данных обстоятельствах".
На этом заключении данный оффтопик тут сворачиваем. YMP, если захочет, уточнит.
Я имел в виду, что если есть разнобой в языке надписей, то после его устранения можно выложить и там. Мы и так можем пользоваться, а на буржуйском форуме русского не знают. Но если всё на английском, то этого препятствия нет.
Если эти данные не изменились, всё остальное получать скорее всего не нужно. Понятно, что может измениться какой-то текст, но вряд ли это так принципиально.
Кто его знает, что иногда может понадобится, по мне так пусть грузит, всё равно окно свернёшь если определять ничего не надо.
Потом, нагрузка, скорее всего, из-за использования WMI, без которого можно обойтись.
Ты про GetCommandLineProc? Это работает в 1000+ раз быстрее, можно заменить. Но при замене, на общую нагрузку, насколько я заметил, принциниально не влияет.
teadrinker
SeDebugPrivilege() нужен только при старте скрипта?
Да, один раз для процесса. GetCommandLine также заодно и ProcessPath возвращает:
F11::
WinGet, PID, PID, A
obj := GetCommandLine(PID, true, true)
MsgBox, % "CommandLine = " obj.cmd "`nImagePath = " obj.path
Return
GetCommandLine(PID, SetDebugPrivilege := false, GetImagePath := false) {
static SetDebug := 0, PROCESS_QUERY_INFORMATION := 0x400, PROCESS_VM_READ := 0x10, STATUS_SUCCESS := 0
if (SetDebugPrivilege && !SetDebug) {
if !res := SeDebugPrivilege()
SetDebug := 1
else {
MsgBox, 4, Ошибка SeDebugPrivilege(), Не удалось установить привилегии.`nОшибка %res%`nПродолжить?
IfMsgBox, No
Return
}
}
hProc := DllCall("OpenProcess", UInt, PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, Int, 0, UInt, PID, Ptr)
(A_Is64bitOS && DllCall("IsWow64Process", Ptr, hProc, UIntP, IsWow64))
if (!A_Is64bitOS || IsWow64)
PtrSize := 4, PtrType := "UInt", pPtr := "UIntP", offsetCMD := 0x40
else
PtrSize := 8, PtrType := "Int64", pPtr := "Int64P", offsetCMD := 0x70
hModule := DllCall("GetModuleHandle", "str", "Ntdll", Ptr)
if (A_PtrSize < PtrSize) { ; скрипт 32, целевой процесс 64
if !QueryInformationProcess := DllCall("GetProcAddress", Ptr, hModule, AStr, "NtWow64QueryInformationProcess64", Ptr)
failed := "NtWow64QueryInformationProcess64"
if !ReadProcessMemory := DllCall("GetProcAddress", Ptr, hModule, AStr, "NtWow64ReadVirtualMemory64", Ptr)
failed := "NtWow64ReadVirtualMemory64"
info := 0, szPBI := 48, offsetPEB := 8
}
else {
if !QueryInformationProcess := DllCall("GetProcAddress", Ptr, hModule, AStr, "NtQueryInformationProcess", Ptr)
failed := "NtQueryInformationProcess"
ReadProcessMemory := "ReadProcessMemory"
if (A_PtrSize > PtrSize) ; скрипт 64, целевой процесс 32
info := 26, szPBI := 8, offsetPEB := 0
else ; скрипт и целевой процесс одной битности
info := 0, szPBI := PtrSize * 6, offsetPEB := PtrSize
}
if failed {
DllCall("CloseHandle", Ptr, hProc)
MsgBox, Не удалось получить указатель на функцию %failed%
Return
}
VarSetCapacity(PBI, 48, 0)
if DllCall(QueryInformationProcess, Ptr, hProc, UInt, info, Ptr, &PBI, UInt, szPBI, UIntP, bytes) != STATUS_SUCCESS {
DllCall("CloseHandle", Ptr, hProc)
Return
}
pPEB := NumGet(&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, &buff, PtrType, szCMD, UIntP, bytes)
obj := { cmd: StrGet(&buff, "UTF-16") }
if (GetImagePath && 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, &buff, PtrType, szPATH, UIntP, bytes)
obj.path := StrGet(&buff, "UTF-16") . (IsWow64 ? " *32" : "")
}
DllCall("CloseHandle", Ptr, hProc)
Return obj
}
SeDebugPrivilege() {
static PROCESS_QUERY_INFORMATION := 0x400, TOKEN_ADJUST_PRIVILEGES := 0x20, SE_PRIVILEGE_ENABLED := 0x2
hProc := DllCall("OpenProcess", UInt, PROCESS_QUERY_INFORMATION, Int, false, UInt, DllCall("GetCurrentProcessId"), Ptr)
DllCall("Advapi32\OpenProcessToken", Ptr, hProc, UInt, TOKEN_ADJUST_PRIVILEGES, PtrP, token)
DllCall("Advapi32\LookupPrivilegeValue", Ptr, 0, Str, "SeDebugPrivilege", Int64P, luid)
VarSetCapacity(TOKEN_PRIVILEGES, 16, 0)
NumPut(1, TOKEN_PRIVILEGES, "UInt")
NumPut(luid, TOKEN_PRIVILEGES, 4, "Int64")
NumPut(SE_PRIVILEGE_ENABLED, TOKEN_PRIVILEGES, 12, "UInt")
DllCall("Advapi32\AdjustTokenPrivileges", Ptr, token, Int, false, Ptr, &TOKEN_PRIVILEGES, UInt, 0, Ptr, 0, Ptr, 0)
res := A_LastError
DllCall("CloseHandle", Ptr, token)
DllCall("CloseHandle", Ptr, hProc)
Return res ; в случае удачи 0
}
Отлично, ещё забрал разрядность процесса для 64 bit OS.
GetCommandLine также заодно и ProcessPath возвращает:
Почему-то, если забросить в окно программы новый файл, то CommandLine возвращает адрес об изначально открытом файле.
DD, ничего не понял. О каком окне идёт речь?
teadrinker, в смысле — программы, из которой по F11 возвращаем адрес. К примеру, из стандартного Блокнота: если открыть через него файл, а потом перетащить в его окно другой файл — данные по F11 будут о первом файле. Хотя, возможно, это не считается за командную строку.
Есть у кого возможность вытянуть из "Window Spy" код, относящийся к получению URL'ов?
DD, командную строку процесса можно посмотреть в диспетчере задач.
Есть у кого возможность вытянуть из "Window Spy" код, относящийся к получению URL'ов?
А разве там есть такой функционал?
Malcev
То есть, там такая графа есть — «URL: ...». Например, он показывает локальные адреса из CHM и Universal Viewer (чего в последнем случае у меня другие скрипты не делали).
DD
Можно скриншот Window Spy с таким параметром. И что за другие скрипты?
Собственно в сабже URL: в CHM есть, чем не устраивает.