musicstashall
Знающий
- Сообщения
- 322
- Репутация
- 7
Необходимо получить текущие координаты положения папок проводника на рабочем столе. Это координаты, в которых система располагает все вновь открытые папки проводника на раб столе. Параметры хранятся в реестре: HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags\AllFolders\Shell
Набросал такую функу, проверьте на своих мониторах, правильно ли определяет. А быть может существуют стандартные средства AutoIt?
Не понятно, из чего состоит значение параметра WinPos1920x1080x96(2).top. Ширина, высота, а что такое 96 и (2)? Есть значения так же и (1) в конце.
Переключил мониторы, меньший поставил основным, теперь параметры пишутся в WinPos1680x1050x96(2).top. Как определить, какие параметры надо читать?
Набросал такую функу, проверьте на своих мониторах, правильно ли определяет. А быть может существуют стандартные средства AutoIt?
Код:
#include <WinAPIGdi.au3>
#include <Array.au3>
Global $_HKEY_LOCAL_MACHINE, $_HKEY_CLASSES_ROOT, $_HKEY_CURRENT_USER, $_HKEY_USERS
DetectInfrastructure()
Local $tRect = _GetRectAllFolders()
Local $Pos = _WinAPI_GetPosFromRect($tRect)
_ArrayDisplay($Pos)
Func _GetRectAllFolders()
Local $string = 'WinPos' & @DesktopWidth & 'x' & @DesktopHeight
Local $Key = $_HKEY_CURRENT_USER & '\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags\AllFolders\Shell'
Local $data = _GetEnumValue($Key, True)
Local $aiResult = _ArrayFindAll($data, $string, 0, 0, 0, 1)
If UBound($aiResult) < 4 Then Return SetError(1, 0, 0)
Local $aData = _ArrayExtract($data, $aiResult[UBound($aiResult) -4], $aiResult[UBound($aiResult) -1], 0, 1) ; берем снизу четыре последние
If UBound($aData) < 4 Then Return SetError(1, 0, 0)
Local $tRect = DllStructCreate($tagRECT)
For $i = 0 To 3
DllStructSetData($tRect, $i + 1, $aData[$i][1])
Next
Return SetError(0, 0, $tRect)
EndFunc
Func _GetEnumValue($Key, $param = False, $Flag = True) ; возвращает список всех параметров в ключе, флаг — кол-во в нулевой ячейке, $Param — возвращает двух-мерный массив со значениями
Local $data[0], $i = 1, $read
If $param Then Dim $data[0][2]
If $Flag Then _ArrayAdd($data, 0)
If $param Then _ArrayAdd($data, '||' & RegRead($Key, ''), 0, '||')
While 1
$read = RegEnumVal($Key, $i)
If @error Then ExitLoop
If Not $param Then _ArrayAdd($data, $read)
If $param Then _ArrayAdd($data, $read & '||' & RegRead($Key, $read), 0, '||')
$i += 1
Wend
If $Flag And Not $param Then $data[0] = UBound($data) -1
If $Flag And $param Then $data[0][0] = UBound($data) -1
Return $data
EndFunc
Func DetectInfrastructure()
If @OSTYPE = "WIN32_WINDOWS" Then
Else
If Not @AutoItX64 And @OSArch = "X86" Or (@OSArch = "X64" And @AutoItX64) Then
$_HKEY_LOCAL_MACHINE = "HKEY_LOCAL_MACHINE"
$_HKEY_CLASSES_ROOT = 'HKEY_CLASSES_ROOT'
$_HKEY_CURRENT_USER = 'HKEY_CURRENT_USER'
$_HKEY_USERS = 'HKEY_USERS'
Else
$_HKEY_LOCAL_MACHINE = "HKEY_LOCAL_MACHINE64"
$_HKEY_CLASSES_ROOT = "HKEY_CLASSES_ROOT64"
$_HKEY_CURRENT_USER = "HKEY_CURRENT_USER64"
$_HKEY_USERS = 'HKEY_USERS64'
EndIf
EndIf
Return @OSArch
EndFunc ;==>DetectInfrastructure
Не понятно, из чего состоит значение параметра WinPos1920x1080x96(2).top. Ширина, высота, а что такое 96 и (2)? Есть значения так же и (1) в конце.
Переключил мониторы, меньший поставил основным, теперь параметры пишутся в WinPos1680x1050x96(2).top. Как определить, какие параметры надо читать?
Последнее редактирование: