Что нового

Сохранение дескриптора окна для последующего использования в новой сессии работы скрипта

SergiUX

Новичок
Сообщения
4
Репутация
0
Всем привет!
Ситуация: работает скрипт, он находит заданное окно и получает его дескриптор. Этот дескриптор нужно сохранить в какой-либо форме в реестре или в файл. После сохранения скрипт завершает свою работу. Потом через какое-то время запускается новая копия скрипта, она должна прочитать сохраненный ранее дескриптор, проверить по нему сущестует ли до сих пор окно, которое ему соответствует и выполнить ряд действий. Загвоздка собственно в сохранении дескриптора. Как его сохранить? В справке написано что дескриптор - это не число и не строка, это особенный тип данных. Вопрос: какой тип данных это? Бинарный? Я пробовал сохранить в реестр как строку, используя BinaryToString и StringToBinary при чтении. Получалось не то после чтения и скрипт уже не находил окно по прочитанному из реестра дескриптору. Прошу помочь в понимании механизма дескрипторов. Какой это тип данных? как его правильно сохранить во внешнюю среду и потом правильно без искажений снова прочитать?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
Local $hHandle = WinGetHandle('Этот компьютер')
FileWrite('handle.txt', $hHandle)
Sleep(3000)
Local $sRH = FileRead('handle.txt')
;~ WinClose(HWnd($sRH))
WinClose($sRH)

работает в обоих случаях. конкретно функция
Код:
HWnd

переводит строку в дескриптор
 
Последнее редактирование:

Alecsis

Осваивающий
Сообщения
101
Репутация
41
Этот дескриптор нужно сохранить в какой-либо форме […] После сохранения скрипт завершает свою работу. Потом через какое-то время запускается новая копия скрипта, она должна прочитать сохраненный ранее дескриптор,
Как именно сохранить дескриптор — не вопрос, joiner всё «по полочкам разложил»©
Остался скользкий момент: кто сказал, что за время, что прошло до запуска новой копии скрипта, то окно, чей hWnd сохранён по всей науке, не закрылось (само или это сделал злоумышленник)? А раз закрылось — так хендл ни о чём. И теоретически не исключено, что может появиться совершенно другое окно с таким же hWnd, и оно вообще не имеет никакого отношения к предыдущему.
Ясен пень, вероятность такого залёта практически нулевая, но морально надо быть готовым…
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Для реестра попробуй "4 REG_DWORD". Особенность не требует конвертирования числа в строку или строки в число. Число записал, число прочитал. Для проверки является ли дескриптор существующий IsHWnd(). Ну и как выше было сказано проверь ещё заголововк окна и класс окна, чтобы удостовериться что дескриптор соответствует ещё и правильному окну.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
Код:
$sTitle = 'Загрузки'
$hWnd = WinGetHandle($sTitle, '')

ConsoleWrite('Reg: ---------------------'& @CRLF)
ConsoleWrite(@TAB& 'Write - '& $hWnd& @CRLF)
RegWrite('HKCU\Test', 'hWnd', 'REG_DWORD', $hWnd)
$hWnd = RegRead('HKCU\Test', 'hWnd')
ConsoleWrite(@TAB& 'Read - '& $hWnd& @CRLF)
ConsoleWrite(@TAB& 'Exist - '& WinExists($hWnd)& @CRLF)
$hWnd = HWnd($hWnd)
ConsoleWrite(@TAB& 'HWnd - '& $hWnd& @CRLF)
ConsoleWrite(@TAB& 'Exist - '& WinExists($hWnd)& @CRLF)

ConsoleWrite('File: --------------------'& @CRLF)
ConsoleWrite(@TAB& 'Write - '& $hWnd& @CRLF)
FileDelete('Test.txt')
FileWrite('Test.txt', $hWnd)
$hWnd = FileRead('Test.txt')
ConsoleWrite(@TAB& 'Read - '& $hWnd& @CRLF)
ConsoleWrite(@TAB& 'Exist - '& WinExists($hWnd)& @CRLF)
$hWnd = HWnd($hWnd)
ConsoleWrite(@TAB& 'HWnd - '& $hWnd& @CRLF)
ConsoleWrite(@TAB& 'Exist - '& WinExists($hWnd)& @CRLF)

ConsoleWrite('--------------------------'& @CRLF)
 
Верх