Googler
Сообщения: 3665
Благодарности: 1563
|
Профиль
|
Отправить PM
| Цитировать
Цитата:
ярлык в принципе запускается и начинается процесс настройки Маткада. Но в самом конце, он пишет что задан неправильный параметр ярлыка
|
как последняя альтернатива - произвести двойной клик на ярлыке, но для этого нужно знать его координаты на рабочем столе... пошарившись по офсайту почему-то не нашел готового решения (может плохо искал? ![Idontnow](images/smilies/idontnow.gif) ), поэтому пришлось сваять самому:
Код: ![Выделить весь код](images/misc/selectcode.png)
#include <ListViewConstants.au3>
$a = _GetDesktopItemList('Мой компьютер')
;~ свернуть все окна
Send("#d")
;~ запустить ярлык
MouseClick ("left", $a[0], $a[1], 2, 1)
;~ По имени элемента рабочего стола (ярлыка) возвращает его местоположение:
;~ x-координата, y-координата.
;~ Если не задан конкретный элемент, то возвращает двумерный массив всех элементов рабочего стола:
;~ имя элемента, x-координата, y-координата;
;~ первый элемент массива содержит количество записей.
Func _GetDesktopItemList($sItemName='')
Local $i, $ret, $hWnd, $hProc, $pMem, $IconList, $IconInfo[2], $IconList[1][3] = [[0]]
Local Const $iMaxSize = 254
;~ Создаем структуры данных API
Local $uPID = DllStructCreate("long")
Local $uBuffer = DllStructCreate("long;long;int;int;int;int;int;ptr;int;int;int;int;int;int;int;int;int;char["& $iMaxSize &"]")
Local $uPOINTAPI = DllStructCreate("long;long", DllStructGetPtr($uBuffer,1))
Local $uLVITEM = DllStructCreate("int;int;int;int;int;ptr;int;int;int;int;int;int;int;int;int", DllStructGetPtr($uBuffer,3))
Local $uTEXT = DllStructCreate("char["& $iMaxSize &"]",DllStructGetPtr($uBuffer,18))
;~ Ищем GUI - список элементов рабочего стола
$hWnd = DLLCall ("user32.dll", "hwnd", "FindWindow", "str", "Progman", "str", "Program Manager" )
$hWnd = DLLCall ("user32.dll", "hwnd", "FindWindowEx", "hwnd", $hWnd[0], "int", 0 , "str", "SHELLDLL_DefView", "int", 0 )
$hWnd = DLLCall ("user32.dll", "hwnd", "FindWindowEx", "hwnd", $hWnd[0], "int", 0 , "str", "SysListView32", "int", 0 )
;~ Находим количество элементов списка и готовим массив
$ret = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd[0], "int", $LVM_GETITEMCOUNT, "int", 0, "ptr", 0 )
If $ret[0]=0 Then Return SetError(1, 0, -1)
ReDim $IconList[$ret[0]+1][3]
$IconList[0][0]=$ret[0]
;~ Находим процесс, которому принадлежит список
$ret = DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $hWnd[0], "ptr", DllStructGetPtr($uPID))
$hProc = DllCall('kernel32.dll', 'int', 'OpenProcess', "int", 0x38, "int", 0, "int", DllStructGetData($uPID,1))
;~ Резервируем и заполняем память в чужом процессе
$pMem = DllCall('kernel32.dll', 'int', 'VirtualAllocEx', _
"int", $hProc[0], "ptr", 0, "int", DllStructGetSize($uBuffer), "int", 0x3000, "int", 0x4)
DllStructSetData($uLVITEM, 1, $LVIF_TEXT)
DllStructSetData($uLVITEM, 6, $pMem[0]+DllStructGetSize($uPOINTAPI)+DllStructGetSize($uLVITEM))
DllStructSetData($uLVITEM, 7, $iMaxSize)
$ret = DllCall("kernel32", "int", "WriteProcessMemory", _
"int", $hProc[0], "ptr", $pMem[0], "ptr", DllStructGetPtr($uBuffer), "int", DllStructGetSize($uBuffer), "ptr", 0)
;~ Считываем параметры каждого элемента списка
For $i=0 To $IconList[0][0]-1
$ret = DllCall("user32.dll", "int", "SendMessage", _
"hwnd", $hWnd[0], "int", $LVM_FIRST+16, "int", $i, "ptr", $pMem[0])
$ret = DllCall("user32.dll", "int", "SendMessage", _
"hwnd", $hWnd[0], "int", $LVM_GETITEMTEXTA, "int", $i, "ptr", $pMem[0]+DllStructGetSize($uPOINTAPI))
$ret = DllCall("kernel32", "int", "ReadProcessMemory", _
"int", $hProc[0], "ptr", $pMem[0], "ptr", DllStructGetPtr($uBuffer), "int", DllStructGetSize($uBuffer), "ptr", 0)
$IconList[$i+1][0]=DllStructGetData($uTEXT,1)
$IconList[$i+1][1]=DllStructGetData($uPOINTAPI,1)
$IconList[$i+1][2]=DllStructGetData($uPOINTAPI,2)
Next
;~ Освобождаем память
$ret = DllCall('kernel32.dll', 'int', 'VirtualFreeEx', "int", $hProc[0], "ptr", $pMem[0], "int", 0, "int", 0x8000)
$ret = DllCall("kernel32.dll", "int", "CloseHandle", "int", $hProc[0])
;~ Возвращаем данные
If $sItemName = '' Then Return $IconList
For $i=1 To $IconList[0][0]
If $IconList[$i][0]=$sItemName Then ExitLoop
Next
If $i=$IconList[0][0]+1 Then Return SetError(2, 0, -1)
$IconInfo[0]=$IconList[$i][1]
$IconInfo[1]=$IconList[$i][2]
Return $IconInfo
EndFunc
|