Автор Тема: Расширение стандартной AutoIt библиотеки WinAPI.au3  (Прочитано 177230 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн firex [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 940
  • Репутация: 202
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Violence
Понятное дело, что исключительно эти цифры вам ничего не дадут. Более того, парочкой WinAPI функций тут не обойтись.

Можете начать изучение с этого примера:
http://www.delphisources.ru/pages/sources/system/2010-year/process-cpu-usage.html

С удовольствием набросал бы вам пример, но как то очень лень  ;)

Русское сообщество AutoIt

Re: Расширение стандартной AutoIt библиотеки WinAPI.au3
« Ответ #210 Отправлен: Май 08, 2015, 17:48:28 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Вот вам пример для вычисления загрузки процесса. Замените функцию GetProcessTimes() на GetThreadTimes() и получите тоже самое, но только для потока.


Думай, прежде чем говорить.

Оффлайн Kasper [?]

  • Новичок
  • *
  • Сообщений: 70
  • Репутация: 8
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
А можно ли использовать эту библиотеку на версии AutoIt 3.3.12.0 ?

Оффлайн alex33 [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1359
  • Репутация: 171
  • Пол: Мужской
    • alekssamos ВКонтакте
    • Награды
  • Версия AutoIt: 3.3.12.0
А можно ли использовать эту библиотеку на версии AutoIt 3.3.12.0 ?
Она уже там есть по умолчанию.

Русское сообщество AutoIt

Re: Расширение стандартной AutoIt библиотеки WinAPI.au3
« Ответ #213 Отправлен: Август 16, 2015, 11:41:57 »

Оффлайн Andrey_A [?]

  • Новичок
  • *
  • Сообщений: 99
  • Репутация: 0
  • Пол: Мужской
    • TC IMAGE & GROPE
    • Награды
В функции _WinAPI_SaveHICONToFile() 3-й параметр True ,как я понял, должен сжимать png размером 256х256 для меньшего размера получаемой иконки. Но этого не происходит. Подскажите в чём может быть проблема? Версия Autoit 3.3.15.0


Код: AutoIt [Выделить]
#include <WinAPIGdi.au3>
#include <WinAPIShellEx.au3>

Local $aIcon[4] = [256,48, 32, 16]

For $i = 0 To UBound($aIcon) - 1
    $aIcon[$i] = _WinAPI_Create32BitHICON(_WinAPI_ShellExtractIcon(@SystemDir & '\imageres.dll', 3, $aIcon[$i], $aIcon[$i]), 1)
Next
_WinAPI_SaveHICONToFile('C:\test.ico', $aIcon,True)
For $i = 0 To UBound($aIcon) - 1
    _WinAPI_DestroyIcon($aIcon[$i])
Next


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Я не знаю, что там изменил jpm, но после того, как он куда-либо залезет своими кривыми ручонками, это сразу перестает работать. Andrey_A, замените функцию _WinAPI_CompressBitmapBits() в официальной сборке на функцию из первого поста, впрочем, вот она.

Код: AutoIt [Выделить]
Func _WinAPI_CompressBitmapBits($hBitmap, ByRef $pBuffer, $iCompression = 0, $iQuality = 100)

    Local $Size[2], $Count, $Format, $Length, $Mime, $Ret, $hDC, $hSv, $hMem, $tBits, $tInfo, $tData, $pData, $Error = 1
    Local $hSource = 0, $hImage = 0, $hToken = 0, $pEncoder = 0, $pStream = 0, $tParam = 0
    Local $tDIB = DllStructCreate($tagDIBSECTION)

    If Not __DLL('gdiplus.dll') Then
        Return SetError(3, 0, 0)
    EndIf

    Do
        Switch $iCompression
            Case 0
                $Mime = 'image/png'
            Case 1
                $Mime = 'image/jpeg'
            Case Else
                ExitLoop
        EndSwitch
        While $hBitmap
            If Not _WinAPI_GetObject($hBitmap, DllStructGetSize($tDIB), DllStructGetPtr($tDIB)) Then
                ExitLoop 2
            EndIf
            If (DllStructGetData($tDIB, 'bmBitsPixel') = 32) And (Not DllStructGetData($tDIB, 'biCompression')) Then
                ExitLoop
            EndIf
            If $hSource Then
                ExitLoop 2
            EndIf
            $hSource = _WinAPI_CreateDIB(DllStructGetData($tDIB, 'bmWidth'), DllStructGetData($tDIB, 'bmHeight'))
            If @error Then
                ExitLoop 2
            EndIf
            $hDC = _WinAPI_CreateCompatibleDC(0)
            $hSv = _WinAPI_SelectObject($hDC, $hSource)
            If _WinAPI_DrawBitmap($hDC, 0, 0, $hBitmap) Then
                $hBitmap = $hSource
            Else
                $hBitmap = 0
            EndIf
            _WinAPI_SelectObject($hDC, $hSv)
            _WinAPI_DeleteDC($hDC)
        WEnd
        If Not $hBitmap Then
            ExitLoop
        EndIf
        For $i = 0 To 1
            $Size[$i] = DllStructGetData($tDIB, $i + 2)
        Next
        $tBits = DllStructCreate('byte[' & ($Size[0] * $Size[1] * 4) & ']')
        If Not _WinAPI_GetBitmapBits($hBitmap, DllStructGetSize($tBits), DllStructGetPtr($tBits)) Then
            ExitLoop
        EndIf
        $tData = DllStructCreate('uint;ptr;int;int')
        DllStructSetData($tData, 1, 1)
        $Ret = DllCall('gdiplus.dll', 'uint', 'GdiplusStartup', 'ptr*', 0, 'ptr', DllStructGetPtr($tData), 'ptr', 0)
        If (@error) Or ($Ret[0]) Then
            ExitLoop
        EndIf
        If _WinAPI_IsAlphaBitmap($hBitmap) Then
            $Format = 0x0026200A
        Else
            $Format = 0x00022009
        EndIf
        $hToken = $Ret[1]
        $Ret = DllCall('gdiplus.dll', 'uint', 'GdipCreateBitmapFromScan0', 'int', $Size[0], 'int', $Size[1], 'uint', $Size[0] * 4, 'uint', $Format, 'ptr', DllStructGetPtr($tBits), 'ptr*', 0)
        If (@error) Or ($Ret[0]) Then
            ExitLoop
        EndIf
        $hImage = $Ret[6]
        $Ret = DllCall('gdiplus.dll', 'uint', 'GdipGetImageEncodersSize', 'uint*', 0, 'uint*', 0)
        If (@error) Or ($Ret[0]) Then
            ExitLoop
        EndIf
        $Count = $Ret[1]
        $tData = DllStructCreate('byte[' & $Ret[2] & ']')
        If @error Then
            ExitLoop
        EndIf
        $pData = DllStructGetPtr($tData)
        $Ret = DllCall('gdiplus.dll', 'uint', 'GdipGetImageEncoders', 'uint', $Count, 'uint', $Ret[2], 'ptr', $pData)
        If (@error) Or ($Ret[0]) Then
            ExitLoop
        EndIf
        For $i = 1 To $Count
            $tInfo = DllStructCreate('byte[16];byte[16];ptr[5];dword[4];ptr[2]', $pData)
            If Not StringInStr(_WinAPI_WideCharToMultiByte(DllStructGetData($tInfo, 3, 5)), $Mime) Then
                $pData += DllStructGetSize($tInfo)
            Else
                $pEncoder = $pData
                ExitLoop
            EndIf
        Next
        If Not $pEncoder Then
            ExitLoop
        EndIf
        Switch $iCompression
            Case 0
                ; Nothing
            Case 1
                $tParam = DllStructCreate('dword;byte[16];dword;dword;ptr;ulong')
                DllStructSetData($tParam, 1, 1)
                DllStructSetData($tParam, 3, 1)
                DllStructSetData($tParam, 4, 4)
                DllStructSetData($tParam, 5, DllStructGetPtr($tParam, 6))
                DllStructSetData($tParam, 6, $iQuality)
                $Ret = DllCall('ole32.dll', 'uint', 'CLSIDFromString', 'wstr', '{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}', 'ptr', DllStructGetPtr($tParam, 2))
                If (@error) Or ($Ret[0]) Then
                    $tParam = 0
                EndIf
        EndSwitch
        $pStream = _WinAPI_CreateStreamOnHGlobal()
        $Ret = DllCall('gdiplus.dll', 'uint', 'GdipSaveImageToStream', 'ptr', $hImage, 'ptr', $pStream, 'ptr', $pEncoder, 'ptr', DllStructGetPtr($tParam))
        If (@error) Or ($Ret[0]) Then
            ExitLoop
        EndIf
        $hMem = _WinAPI_GetHGlobalFromStream($pStream)
        $Ret = DllCall('kernel32.dll', 'ulong_ptr', 'GlobalSize', 'ptr', $hMem)
        If (@error) Or (Not $Ret[0]) Then
            ExitLoop
        EndIf
        $Length = $Ret[0]
        $Ret = DllCall('kernel32.dll', 'ptr', 'GlobalLock', 'ptr', $hMem)
        If (@error) Or (Not $Ret[0]) Then
            ExitLoop
        EndIf
        $pBuffer = __HeapReAlloc($pBuffer, $Length, 1)
        If Not @error Then
            If _WinAPI_MoveMemory($pBuffer, $Ret[0], $Length) Then
                $Error = 0
            EndIf
        EndIf
    Until 1
    If $pStream Then
        _WinAPI_ReleaseStream($pStream)
    EndIf
    If $hImage Then
        DllCall('gdiplus.dll', 'uint', 'GdipDisposeImage', 'ptr', $hImage)
    EndIf
    If $hToken Then
        DllCall('gdiplus.dll', 'none', 'GdiplusShutdown', 'ptr', $hToken)
    EndIf
    If $hSource Then
        _WinAPI_DeleteObject($hSource)
    EndIf
    If $Error Then
        Return SetError(1, 0, 0)
    EndIf
    Return $Length
EndFunc   ;==>_WinAPI_CompressBitmapBits


Оффлайн Andrey_A [?]

  • Новичок
  • *
  • Сообщений: 99
  • Репутация: 0
  • Пол: Мужской
    • TC IMAGE & GROPE
    • Награды
Yashied, спасибо!

Оффлайн HFShak [?]

  • Новичок
  • *
  • Сообщений: 2
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Добрый день!
Подскажите, где можно скачать winapiex.au3? Ресурс недоступен

Русское сообщество AutoIt

Re: Расширение стандартной AutoIt библиотеки WinAPI.au3
« Ответ #217 Отправлен: Сентябрь 14, 2016, 10:51:47 »

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1171
  • Репутация: 164
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Вообще-то UDF WinAPIEx.au3 уже присутствует по умолчанию в Autoit
(только это уже видоизмененная и переработанная другими авторами версия).
Если вам нужен именно оригинал, то вот пожалуйста:

Для AutoIt 3.3.6.x: ZIP (архив), EXE (инсталлятор)
Для AutoIt 3.3.8.x: ZIP (архив), EXE (инсталлятор)

Так как на форуме выложено огромное количество скриптов, которые используют WinAPIEx UDF разных версий, а полной совместимости между версиями нет, то я добавил в первый пост ссылку на архив всех версий этой библиотеки, начиная с 2.5. В большинстве случаев проще использовать ту версию AutoIt и WinAPIEx UDF, для которых был написан тот или иной скрипт, нежели отслеживать все изменения и адаптировать под них код.

Архив версий v3.0-3.7
« Последнее редактирование: Март 31, 2017, 20:38:51 от Alofa »

Оффлайн MRGYV [?]

  • Новичок
  • *
  • Сообщений: 17
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Что-то не могу скачать. Пишет нет файла. Скиньте, пожалуйста, ссылку.

Русское сообщество AutoIt

Re: Расширение стандартной AutoIt библиотеки WinAPI.au3
« Ответ #219 Отправлен: Март 31, 2017, 18:42:53 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
10595 Просмотров
Последний ответ Октябрь 24, 2016, 02:41:58
от Alofa
0 Ответов
2100 Просмотров
Последний ответ Октябрь 17, 2011, 09:18:51
от Yashied
14 Ответов
4465 Просмотров
Последний ответ Август 18, 2017, 14:31:25
от VadimKHL
6 Ответов
3531 Просмотров
Последний ответ Январь 24, 2013, 11:48:08
от beliy
7 Ответов
2213 Просмотров
Последний ответ Февраль 03, 2015, 22:10:56
от madmasles
4 Ответов
2046 Просмотров
Последний ответ Февраль 04, 2015, 15:37:07
от babanty
8 Ответов
2781 Просмотров
Последний ответ Май 27, 2015, 20:26:03
от AZJIO
2 Ответов
1251 Просмотров
Последний ответ Ноябрь 05, 2015, 12:25:38
от ВиталийВВ
2 Ответов
1392 Просмотров
Последний ответ Февраль 26, 2016, 23:23:22
от BlackPhreaker
2 Ответов
420 Просмотров
Последний ответ Июнь 27, 2017, 23:46:42
от Vovsla