Что нового

Видимое содержимое невидимого окна

mathem

Новичок
Сообщения
44
Репутация
0
Здравствуйте! Возникла потребность такого. На память пришел пример Clock.au3 из папки примеров автоита. Давай я оттуда удалять все лишнее, стремясь получить минимальный код, выполняющий это. На текущий момент дошел до следующего кода:
Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

Global Const $iOpacity = 128

Global Const $iRadius = 200

Global Const $AC_SRC_ALPHA = 1

Global Enum $eScrDC = 0, $eMemDC, $eBitmap, $eWidth, $eHeight, $eGraphic, $eLast

    $hDial = GUICreate("Clock", 200 * 2, 200 * 2, -1, -1, 0, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
    $label = GUICtrlCreateLabel ("mama myla ramu", 140, 130)
    GUICtrlSetData($Label, 'dfghjk')
    GUISetState()
    
    ; Initialize GDI+ library
    _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hDial)
        
       ; _GDIPlus_GraphicsDrawString($hGraphic, "Hello colored world", 140, 210, Default, Default, Default, 0xFF007F)

    ; Hook non client hit test message so we can move the clock
    
    $aDial = ResourceInit()
    
    _GDIPlus_GraphicsDrawEllipse($aDial[$eGraphic], 130, 100, 140, 70)
    $label_1 = _GDIPlus_GraphicsDrawString($aDial[$eGraphic], "Hello world", 140, 110)
    $label_2 = _GDIPlus_GraphicsDrawString($aDial[$eGraphic], "", 140, 130)

    ResourceSet($aDial)
    ;ResourceDone($aDial)

Func ResourceInit()
    Local $aInfo[$eLast + 1]

    $aInfo[$eScrDC] = _WinAPI_GetDC(0)
    $aInfo[$eMemDC] = _WinAPI_CreateCompatibleDC(_WinAPI_GetDC(0))
    $aInfo[$eBitmap] = _WinAPI_CreateCompatibleBitmap($aInfo[$eScrDC], $iRadius * 2, $iRadius * 2)
    _WinAPI_SelectObject($aInfo[$eMemDC], $aInfo[$eBitmap])
    $aInfo[$eWidth] = $iRadius * 2
    $aInfo[$eHeight] = $iRadius * 2
    $aInfo[$eGraphic] = _GDIPlus_GraphicsCreateFromHDC($aInfo[$eMemDC])
;    _GDIPlus_GraphicsFillRect($aInfo[$eGraphic], 0, 0, $iRadius * 2, $iRadius * 2)
    Return $aInfo
EndFunc   ;==>ResourceInit

Func ResourceSet($aInfo)
    Local $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

    ;If $iAlpha = -1 Then $iAlpha = $iOpacity
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iRadius * 2)
    DllStructSetData($tSize, "Y", $iRadius * 2)
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", -1)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hDial, _WinAPI_GetDC(0), 0, $pSize, $aInfo[$eMemDC], $pSource, 0, $pBlend, $ULW_ALPHA)
EndFunc   ;==>ResourceSet

While 1
    $msg = GUIGetMsg()
    
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

Этот код работает, да. Но создавать аж 2 специальной функции для такой, на мой взгляд, не такой и сложной задачи кажется мне стрельбой из пушки по воробьям. Мне кажется, в Автоите должно найтись более простое средство для получения этого. Вопрос, какое? Вы не подскажете мне что-нибудь?
 

Prog

Продвинутый
Сообщения
620
Репутация
80
Но создавать аж 2 специальной функции для такой, на мой взгляд, не такой и сложной задачи кажется мне стрельбой из пушки по воробьям.
Это относительно мало кода. Когда речь заходит о WinAPI кода может быть гораздо больше.
Если мешает, перенесите часть в другой файл и подключите директивой #include.
 
Автор
M

mathem

Новичок
Сообщения
44
Репутация
0
Если мешает, перенесите часть в другой файл и подключите директивой #include.
Оно не столько мешает, сколько не работает. Например, при запуске скрипта
Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPISys.au3>
#Include <WinAPIEx.au3>

#Include <GuiButton.au3>
#include <GuiImageList.au3>

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>

Global Const $iCenter = 200
Global Const $iDotOpacity = 250
Global Const $iHourRad = 140
Global Const $iMinRad = 200
Global Const $iOpacity = 128
Global Const $nPI = 3.1415926535897932384626433832795
Global Const $iRadius = 200
Global Const $iSecRad = 200
Global Const $iTickLen = 0.02

Global Const $AC_SRC_ALPHA = 1

Global Enum $eScrDC = 0, $eMemDC, $eBitmap, $eWidth, $eHeight, $eGraphic, $ePen, $eCap, $eBrush, $eFormat, $eFamily, $eFont, $eLayout, $eLast

Global $hDial, $hTime, $hHour, $hMin, $hSec, $hDot, $aTime, $aHour, $aMin, $aSec, $aCurr[3][2], $aLast[3][2]

    Global $hDial = GUICreate("Clock", $iRadius * 2, $iRadius * 2, -1, -1, 0, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
   
    GUISetState()
   
    ; Initialize GDI+ library
    _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hDial)

    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
DialDraw()

Func DialDraw()
$Graphic = GuiCtrlCreateGraphic(90, 90, 375,340)
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x0000ff, 0xff0000)
GUICtrlSetGraphic(-1,$GUI_GR_ELLIPSE, 80,80, 50,80)
GUICtrlSetGraphic(-1,$GUI_GR_DOT, 15,8)


    Local $aDial, $hPen1, $hPen2, $iI, $iN, $iX1, $iY1, $iX2, $iY2

     $aDial = ResourceInit($iRadius * 2, $iRadius * 2)
    $hPen1 = _GDIPlus_PenCreate()
    $hPen2 = _GDIPlus_PenCreate(0xFF0000FF, 4)
   
    For $iI = 0 To 2 * $nPI Step $nPI / 30
        $iX1 = $iCenter + Cos($iI) * ($iRadius * (1.00 - $iTickLen))
        $iY1 = $iCenter - Sin($iI) * ($iRadius * (1.00 - $iTickLen))
        $iX2 = $iCenter + Cos($iI) * $iRadius
        $iY2 = $iCenter - Sin($iI) * $iRadius
        If Mod($iN, 5) = 0 Then
    ;        _GDIPlus_GraphicsDrawLine($aDial[$eGraphic], $iX1, $iY1, $iX2, $iY2, $hPen2)
        Else
            _GDIPlus_GraphicsDrawLine($aDial[$eGraphic], $iX1, $iY1, $iX2, $iY2, $hPen1)
            
        EndIf
        $iN += 1
    Next
    _GDIPlus_GraphicsDrawEllipse($aDial[$eGraphic], 130, 100, 140, 70)
    _GDIPlus_GraphicsDrawString($aDial[$eGraphic], "Hello world", 140, 110)
    _GDIPlus_GraphicsDrawString($aDial[$eGraphic], "Kz", 145, 125)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_PenDispose($hPen1)

    ResourceSet($hDial, $aDial)
    ;ResourceDone($aDial)
EndFunc   ;==>DialDraw


Func ResourceInit($iWidth, $iHeight)
    Global $aInfo[$eLast + 1]

    $aInfo[$eScrDC] = _WinAPI_GetDC(0)
    $aInfo[$eMemDC] = _WinAPI_CreateCompatibleDC($aInfo[$eScrDC])
    $aInfo[$eBitmap] = _WinAPI_CreateCompatibleBitmap($aInfo[$eScrDC], $iWidth, $iHeight)
    _WinAPI_SelectObject($aInfo[$eMemDC], $aInfo[$eBitmap])
    $aInfo[$eWidth] = $iWidth
    $aInfo[$eHeight] = $iHeight
    $aInfo[$eGraphic] = _GDIPlus_GraphicsCreateFromHDC($aInfo[$eMemDC])
    _GDIPlus_GraphicsFillRect($aInfo[$eGraphic], 0, 0, $iRadius * 2, $iRadius * 2)
    Return $aInfo
EndFunc   ;==>ResourceInit


Func ResourceSet($hGUI, ByRef $aInfo, $iAlpha = -1)
    Local $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

    If $iAlpha = -1 Then $iAlpha = $iOpacity
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $aInfo[$eWidth])
    DllStructSetData($tSize, "Y", $aInfo[$eHeight])
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iAlpha)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $aInfo[$eScrDC], 0, $pSize, $aInfo[$eMemDC], $pSource, 0, $pBlend, $ULW_ALPHA)
EndFunc   ;==>ResourceSet

Const $LANG_RUS = 0x0419 ;Русский
Const $LANG_ENG = 0x0409 ;Англиский

AdlibRegister('_BatteryStatus', 1000)

While 1
    $msg = GUIGetMsg()
   
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

Func _BatteryStatus()  
$GetLang = '0x' & Hex(BitAND(_WinAPI_GetKeyboardLayout(WinGetHandle('[ACTIVE]')), 0xFFFF), 4)
Select
Case  $GetLang = $LANG_RUS
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hDial)
$hPen = _GDIPlus_PenCreate (0xffffffff,20)
 ;   _GDIPlus_GraphicsDrawLine ($hGraphic, 10, 0, 390, 150, $hPen)
_GDIPlus_GraphicsDrawRect ( $hGraphic, 150, 130, 40, 10, $hPen)
_GDIPlus_GraphicsDrawString($aDial[$eGraphic], "RU", 145, 120)
_GDIPlus_Shutdown()
Case $GetLang = $LANG_ENG
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hDial)
$hPen = _GDIPlus_PenCreate (0xffffffff,20)
 ;   _GDIPlus_GraphicsDrawLine ($hGraphic, 10, 0, 390, 150, $hPen)
_GDIPlus_GraphicsDrawRect ( $hGraphic, 250, 0, 40, 10, $hPen)
_GDIPlus_GraphicsDrawString($hGraphic, "EN", 245, 0)
_GDIPlus_Shutdown()
EndSelect
EndFunc   ;==>_BatteryStatus

при русской текущей раскладке клавы (пока сделал только для русской) выдается следующая ошибка:
TyMsg09N4V7NAdAOXYkvHXqw9DgTJKNZKSQRlifq.png


, хотя при выполнении этого же кода, но без функции _BatteryStatus(), но с командой
Код:
_GDIPlus_GraphicsDrawString($aDial[$eGraphic], "Hello world", 140, 110)

Все замечательно получается. Очевидно, тут дело в том, что переменная $eGraphic не протаскивается в функцию _BatteryStatus(). Только вот что с этим делать??? На названия функций не обращайте внимания: это - осколки других скриптов. Потом дам нормальные имена.
Сообщение автоматически объединено:

Интересная, однако, штука. При замене в
Код:
_GDIPlus_GraphicsDrawString($aDial[$eGraphic], "Hello world", 140, 110)

$aDial[$eGraphic] своим значением надпись, создаваемая этой командой, перестает отображаться.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
620
Репутация
80
При замене в $aDial[$eGraphic] своим значением
Значение будет отличаться при каждом создании объекта. То есть перезапуск скрипта изменит его.

Массив $aDial объявлен локальным и его область видимости ограничена функцией DialDraw().
 

Prog

Продвинутый
Сообщения
620
Репутация
80
Так не помогает и
Картинку в окне обновляете?
Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPISys.au3>
#Include <WinAPIEx.au3>

#Include <GuiButton.au3>
#include <GuiImageList.au3>

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>

Global Const $iCenter = 200
Global Const $iDotOpacity = 250
Global Const $iHourRad = 140
Global Const $iMinRad = 200
Global Const $iOpacity = 128
Global Const $nPI = 3.1415926535897932384626433832795
Global Const $iRadius = 200
Global Const $iSecRad = 200
Global Const $iTickLen = 0.02

Global Const $AC_SRC_ALPHA = 1

Global Enum $eScrDC = 0, $eMemDC, $eBitmap, $eWidth, $eHeight, $eGraphic, $ePen, $eCap, $eBrush, $eFormat, $eFamily, $eFont, $eLayout, $eLast

Global $hDial, $hTime, $hHour, $hMin, $hSec, $hDot, $aTime, $aHour, $aMin, $aSec, $aCurr[3][2], $aLast[3][2]

    Global $hDial = GUICreate("Clock", $iRadius * 2, $iRadius * 2, -1, -1, 0, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))

    GUISetState()

    ; Initialize GDI+ library
    _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hDial)

    ;GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
DialDraw()

Func DialDraw()
$Graphic = GuiCtrlCreateGraphic(90, 90, 375,340)
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x0000ff, 0xff0000)
GUICtrlSetGraphic(-1,$GUI_GR_ELLIPSE, 80,80, 50,80)
GUICtrlSetGraphic(-1,$GUI_GR_DOT, 15,8)


    global $aDial, $hPen1, $hPen2, $iI, $iN, $iX1, $iY1, $iX2, $iY2

     $aDial = ResourceInit($iRadius * 2, $iRadius * 2)
    $hPen1 = _GDIPlus_PenCreate()
    $hPen2 = _GDIPlus_PenCreate(0xFF0000FF, 4)

    For $iI = 0 To 2 * $nPI Step $nPI / 30
        $iX1 = $iCenter + Cos($iI) * ($iRadius * (1.00 - $iTickLen))
        $iY1 = $iCenter - Sin($iI) * ($iRadius * (1.00 - $iTickLen))
        $iX2 = $iCenter + Cos($iI) * $iRadius
        $iY2 = $iCenter - Sin($iI) * $iRadius
        If Mod($iN, 5) = 0 Then
    ;        _GDIPlus_GraphicsDrawLine($aDial[$eGraphic], $iX1, $iY1, $iX2, $iY2, $hPen2)
        Else
            _GDIPlus_GraphicsDrawLine($aDial[$eGraphic], $iX1, $iY1, $iX2, $iY2, $hPen1)

        EndIf
        $iN += 1
    Next
    _GDIPlus_GraphicsDrawEllipse($aDial[$eGraphic], 130, 100, 140, 70)
    _GDIPlus_GraphicsDrawString($aDial[$eGraphic], "Hello world", 140, 110)
    _GDIPlus_GraphicsDrawString($aDial[$eGraphic], "Kz", 145, 125)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_PenDispose($hPen1)

    ResourceSet($hDial, $aDial)
    ;ResourceDone($aDial)
EndFunc   ;==>DialDraw


Func ResourceInit($iWidth, $iHeight)
    Global $aInfo[$eLast + 1]

    $aInfo[$eScrDC] = _WinAPI_GetDC(0)
    $aInfo[$eMemDC] = _WinAPI_CreateCompatibleDC($aInfo[$eScrDC])
    $aInfo[$eBitmap] = _WinAPI_CreateCompatibleBitmap($aInfo[$eScrDC], $iWidth, $iHeight)
    _WinAPI_SelectObject($aInfo[$eMemDC], $aInfo[$eBitmap])
    $aInfo[$eWidth] = $iWidth
    $aInfo[$eHeight] = $iHeight
    $aInfo[$eGraphic] = _GDIPlus_GraphicsCreateFromHDC($aInfo[$eMemDC])
    _GDIPlus_GraphicsFillRect($aInfo[$eGraphic], 0, 0, $iRadius * 2, $iRadius * 2)
    Return $aInfo
EndFunc   ;==>ResourceInit


Func ResourceSet($hGUI, ByRef $aInfo, $iAlpha = -1)
    Local $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

    If $iAlpha = -1 Then $iAlpha = $iOpacity
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $aInfo[$eWidth])
    DllStructSetData($tSize, "Y", $aInfo[$eHeight])
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iAlpha)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $aInfo[$eScrDC], 0, $pSize, $aInfo[$eMemDC], $pSource, 0, $pBlend, $ULW_ALPHA)
EndFunc   ;==>ResourceSet

Const $LANG_RUS = 0x0419 ;Русский
Const $LANG_ENG = 0x0409 ;Англиский

AdlibRegister('_BatteryStatus', 1000)

While 1
    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

Func _BatteryStatus()
$GetLang = '0x' & Hex(BitAND(_WinAPI_GetKeyboardLayout(WinGetHandle('[ACTIVE]')), 0xFFFF), 4)
Select
Case  $GetLang = $LANG_RUS
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hDial)
$hPen = _GDIPlus_PenCreate (0xffffffff,20)
 ;   _GDIPlus_GraphicsDrawLine ($hGraphic, 10, 0, 390, 150, $hPen)
_GDIPlus_GraphicsDrawRect ( $hGraphic, 150, 130, 40, 10, $hPen)
_GDIPlus_GraphicsDrawString($aDial[$eGraphic], "RU", 145, 120)
_GDIPlus_Shutdown()
Case $GetLang = $LANG_ENG
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hDial)
$hPen = _GDIPlus_PenCreate (0xffffffff,20)
 ;   _GDIPlus_GraphicsDrawLine ($hGraphic, 10, 0, 390, 150, $hPen)
;~ _GDIPlus_GraphicsDrawRect ( $hGraphic, 250, 0, 40, 10, $hPen)
;~ _GDIPlus_GraphicsDrawString($hGraphic, "EN", 245, 0)
_GDIPlus_GraphicsDrawRect ( $hGraphic, 50, 130, 40, 10, $hPen)
_GDIPlus_GraphicsDrawString($aDial[$eGraphic], "EN", 185, 120)
_GDIPlus_Shutdown()
EndSelect
ConsoleWrite($GetLang&@CRLF)
ResourceSet($hDial, $aDial)
EndFunc   ;==>_BatteryStatus
Добавьте стирание предыдущей надписи языка.
 
Автор
M

mathem

Новичок
Сообщения
44
Репутация
0
Ничего не могу понять. Выполняю код:
Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPISys.au3>
#Include <WinAPIEx.au3>

#Include <GuiButton.au3>
#include <GuiImageList.au3>

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>

Global Const $iCenter = 200
Global Const $iDotOpacity = 250
Global Const $iHourRad = 140
Global Const $iMinRad = 200
Global Const $iOpacity = 128
Global Const $nPI = 3.1415926535897932384626433832795
Global Const $iRadius = 200
Global Const $iSecRad = 200
Global Const $iTickLen = 0.02

Global Const $AC_SRC_ALPHA = 1

Global Enum $eScrDC = 0, $eMemDC, $eBitmap, $eWidth, $eHeight, $eGraphic, $ePen, $eCap, $eBrush, $eFormat, $eFamily, $eFont, $eLayout, $eLast

Global $hDial, $hTime, $hHour, $hMin, $hSec, $hDot, $aTime, $aHour, $aMin, $aSec, $aCurr[3][2], $aLast[3][2]

    Global $hDial = GUICreate("Clock", $iRadius * 2, $iRadius * 2, -1, -1, 0, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))

    GUISetState()

    ; Initialize GDI+ library
    _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hDial)

    ;GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
DialDraw()

Func DialDraw()
$Graphic = GuiCtrlCreateGraphic(90, 90, 375,340)
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x0000ff, 0xff0000)
GUICtrlSetGraphic(-1,$GUI_GR_ELLIPSE, 80,80, 50,80)
GUICtrlSetGraphic(-1,$GUI_GR_DOT, 15,8)


    global $aDial, $hPen1, $hPen2, $iI, $iN, $iX1, $iY1, $iX2, $iY2

     $aDial = ResourceInit($iRadius * 2, $iRadius * 2)
    $hPen1 = _GDIPlus_PenCreate()
    $hPen2 = _GDIPlus_PenCreate(0xFF0000FF, 4)

    For $iI = 0 To 2 * $nPI Step $nPI / 30
        $iX1 = $iCenter + Cos($iI) * ($iRadius * (1.00 - $iTickLen))
        $iY1 = $iCenter - Sin($iI) * ($iRadius * (1.00 - $iTickLen))
        $iX2 = $iCenter + Cos($iI) * $iRadius
        $iY2 = $iCenter - Sin($iI) * $iRadius
        If Mod($iN, 5) = 0 Then
    ;        _GDIPlus_GraphicsDrawLine($aDial[$eGraphic], $iX1, $iY1, $iX2, $iY2, $hPen2)
        Else
            _GDIPlus_GraphicsDrawLine($aDial[$eGraphic], $iX1, $iY1, $iX2, $iY2, $hPen1)

        EndIf
        $iN += 1
    Next
    _GDIPlus_GraphicsDrawEllipse($aDial[$eGraphic], 130, 100, 140, 70)
    _GDIPlus_GraphicsDrawString($aDial[$eGraphic], "Hello world", 140, 110)
    _GDIPlus_GraphicsDrawString($aDial[$eGraphic], "Kz", 145, 125)
    
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFfE88BB) ;color format AARRGGBB (hex)

        _GDIPlus_GraphicsFillEllipse($aDial[$eGraphic], 200, 50, 28.25, 50.75, $hBrush)
        _GDIPlus_GraphicsFillRect($aDial[$eGraphic], 190.5, 50.1, 50.25, 15.55, $hBrush)
        
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_PenDispose($hPen1)

    ResourceSet($hDial, $aDial)
    ;ResourceDone($aDial)
EndFunc   ;==>DialDraw


Func ResourceInit($iWidth, $iHeight)
    Global $aInfo[$eLast + 1]

    $aInfo[$eScrDC] = _WinAPI_GetDC(0)
    $aInfo[$eMemDC] = _WinAPI_CreateCompatibleDC($aInfo[$eScrDC])
    $aInfo[$eBitmap] = _WinAPI_CreateCompatibleBitmap($aInfo[$eScrDC], $iWidth, $iHeight)
    _WinAPI_SelectObject($aInfo[$eMemDC], $aInfo[$eBitmap])
    $aInfo[$eWidth] = $iWidth
    $aInfo[$eHeight] = $iHeight
    $aInfo[$eGraphic] = _GDIPlus_GraphicsCreateFromHDC($aInfo[$eMemDC])
    _GDIPlus_GraphicsFillRect($aInfo[$eGraphic], 0, 0, $iRadius * 2, $iRadius * 2)
    Return $aInfo
EndFunc   ;==>ResourceInit


Func ResourceSet($hGUI, ByRef $aInfo, $iAlpha = -1)
    Local $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

    If $iAlpha = -1 Then $iAlpha = $iOpacity
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $aInfo[$eWidth])
    DllStructSetData($tSize, "Y", $aInfo[$eHeight])
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iAlpha)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $aInfo[$eScrDC], 0, $pSize, $aInfo[$eMemDC], $pSource, 0, $pBlend, $ULW_ALPHA)
EndFunc   ;==>ResourceSet

Const $LANG_RUS = 0x0419 ;Русский
Const $LANG_ENG = 0x0409 ;Англиский

AdlibRegister('_BatteryStatus', 1000)

While 1
    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

Func _BatteryStatus()
$GetLang = '0x' & Hex(BitAND(_WinAPI_GetKeyboardLayout(WinGetHandle('[ACTIVE]')), 0xFFFF), 4)
Select
Case  $GetLang = $LANG_RUS
_GDIPlus_Startup()
;_GDIPlus_GraphicsClear($aDial[$eGraphic], 0xFFF0F0F0)
_GDIPlus_GraphicsDrawString($aDial[$eGraphic], "RU", 145, 160)
_GDIPlus_Shutdown()
Case $GetLang = $LANG_ENG
_GDIPlus_Startup()
;_GDIPlus_GraphicsClear($aDial[$eGraphic], 0xFFF0F0F0)
_GDIPlus_GraphicsDrawString($aDial[$eGraphic], "EN", 145, 160)
_GDIPlus_Shutdown()
EndSelect
ConsoleWrite($GetLang&@CRLF)
ResourceSet($hDial, $aDial)
EndFunc   ;==>_BatteryStatus

Заливной эллипс хорошо виден, а прямоугольник - нет!!! Его, конечно, можно увидеть, но не при любом фоне под ним. Еще он виден, когда мышкой наводишь на значок Автоита выполняемого кода на панели задач, но это совсем не то, что нужно. Как так-то. Вот определение функции _GDIPlus_GraphicsFillEllipse из файла GDIPlus.au3:
Код:
Func _GDIPlus_GraphicsFillEllipse($hGraphics, $nX, $nY, $nWidth, $nHeight, $hBrush = 0)
    __GDIPlus_BrushDefCreate($hBrush)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipFillEllipse", "handle", $hGraphics, "handle", $hBrush, "float", $nX, "float", $nY, _
            "float", $nWidth, "float", $nHeight)
    __GDIPlus_BrushDefDispose() ; does destroyed @error, @extended
    If @error Then Return SetError(@error, @extended, False)
    If $aResult[0] Then Return SetError(10, $aResult[0], False)

    Return True
EndFunc   ;==>_GDIPlus_GraphicsFillEllipse

А вот определение функции _GDIPlus_GraphicsFillRect из того же файла:
Код:
Func _GDIPlus_GraphicsFillRect($hGraphics, $nX, $nY, $nWidth, $nHeight, $hBrush = 0)
    __GDIPlus_BrushDefCreate($hBrush)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipFillRectangle", "handle", $hGraphics, "handle", $hBrush, "float", $nX, "float", $nY, _
            "float", $nWidth, "float", $nHeight)
    __GDIPlus_BrushDefDispose() ; does destroyed @error, @extended
    If @error Then Return SetError(@error, @extended, False)
    If $aResult[0] Then Return SetError(10, $aResult[0], False)

    Return True
EndFunc   ;==>_GDIPlus_GraphicsFillRect

Структурно эти команды, как и можно было бы предположить еще до того, как взглянул на эти определения, совершенно идентичны. Идентичны-то они идентичны, но почему такая большая разница в том, что они выдают???
 

Prog

Продвинутый
Сообщения
620
Репутация
80
Библиотека GDIPlus.au3 это обвертка над функциями GDI+ Чтобы эффективно ее использовать нужно хорошо знать особенности GDI+.
Эту задачу может быть проще решить на другом языке полностью или частично (графика в dll остальное на AutoIt) где есть более удобная графическая библиотека, а не просто обвертка над функциями ОС.
Небольшой пример во вложении.
 

Вложения

  • DrawImage.zip
    49.5 КБ · Просмотры: 4
Автор
M

mathem

Новичок
Сообщения
44
Репутация
0
Эту задачу может быть проще решить на другом языке полностью или частичн
Увы, другие ЯП (C++ и Python) я знаю еще хуже, чем Автоит). Так что этот путь в настоящий момент для меня просто неподъемен. Ладно, есть идея рисовать прямоугольники просто толстыми отрезками.

Ваш пример у меня не работает: у меня 32-разрядная винда 7.
 

Prog

Продвинутый
Сообщения
620
Репутация
80
Ваш пример у меня не работает: у меня 32-разрядная винда 7.
Думал что сейчас никто не использует 32 бит, потому что 4 ГБ памяти мало для современных приложений.
Скомпилировал в 32 бита. В архиве есть исходник. Он представляет больший интерес чем exe.
 

Вложения

  • DrawImage x86.zip
    38.5 КБ · Просмотры: 3

InnI

AutoIT Гуру
Сообщения
4,974
Репутация
1,459
@mathem
Что вы сделать-то хотите? Рисовать в прозрачном окне? Попробуйте так
Код:
#include <GDIPlus.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

; клики проходят сквозь рисование
; $Frame = GUICreate("", 400, 400, -1, -1, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED, $WS_EX_TRANSPARENT))

; клики НЕ проходят сквозь рисование (нет $WS_EX_TRANSPARENT)
$Frame = GUICreate("", 400, 400, -1, -1, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED))

GUISetBkColor(0xABCDEF)
_WinAPI_SetLayeredWindowAttributes($Frame, 0xABCDEF, 0, $LWA_COLORKEY)
GUISetState()

_GDIPlus_Startup()
$hGraph = _GDIPlus_GraphicsCreateFromHWND($Frame)
$hBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000)
_GDIPlus_GraphicsFillRect($hGraph, 50, 50, 70, 50, $hBrush)
_GDIPlus_GraphicsFillEllipse($hGraph, 100, 100, 70, 50, $hBrush)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraph)
_GDIPlus_Shutdown()

Do
Until GUIGetMsg() = -3
 
Автор
M

mathem

Новичок
Сообщения
44
Репутация
0
@InnI , извините, пожалуйста, за большую паузу, просто сам делал и, казалось, вот-вот, вот-вот получится. Да, лно, в принципе, и получилось, только что, может быть, можно проще. Подскажите, пожалуйста. Короче
Что вы сделать-то хотите?
Дело в следующем. У меня на компе включено Залипание клавиш . При этом из трея в область значков уведомлений можно вытащить такой значок:
Значок залипания клавиш.png
Как видно, этот значок состоит их четырех прямоугольников и, когда, например, нажата м удерживается клавиша Shift, становится черным верхний прямоугольник, когда клавиша Shift становится ненажатой, этот прямоугольник обратно становится белым. Точно так же, когда становится нажатой м удерживаемой клавиша Ctrl, становится черным нижний левый прямоугольник, а когда отжимаешь эту клавишу, этот прямоугольник обратно становится белым, и т. д. Когда становятся нажатыми и удерживаемыми, например, клавиши Ctrl и Shift, становятся черными соответственно верхний и нижний левый прямоугольники. И т. д. Удобно. Удобно-то удобно, но у меня поставлено автоматическое скрытие панели задач. Поэтому я решил написать программку для вывода этого всего в отдельном окошечке. Заодно я решил вывести туда и текущую раскладку клавы а по секрету скажу, что потом хочу вывести туда и уровень вай-фай сигнала. Сначала, было, написал такую программу:
Код:
#include <GDIPlus.au3>
#include <Misc.au3>
#include <GUIConstants.au3>
#include <StaticConstants.au3>
#Include <WinAPIEx.au3>

#Include <GuiButton.au3>
#include <GuiImageList.au3>

Local $hDLL = DllOpen("user32.dll")

If FileExists(@ScriptDir &"\Нажатость клавиш.ini") Then
$x_win = IniRead(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$x_win", "")
$y_win = IniRead(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$y_win", "")
Else
$x_win = -1
$y_win = -1
EndIf

$hGui = GUICreate("Нажатость клавиш", 85, 26, $x_win, $y_win, BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))


;======================================================================================================================
;Устанавливаю фото на кнопку
$hImagebtn =  _GUIImageList_Create(34, 34, 5)
_GDIPlus_Startup()
$h_Image = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Закрыть.png')
$h_Bitmap =_GDIPlus_BitmapCreateHBITMAPFromBitmap($h_Image)
_GUIImageList_Add($hImagebtn, $h_Bitmap)
_GDIPlus_ImageDispose($h_Image)
_WinAPI_DeleteObject($h_Bitmap)
_GDIPlus_Shutdown()
;======================================================================================================================
GUISetState(@SW_SHOW)
GUISetBkColor(0x9CAEC1)

  _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
$hBrush_1 = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
$hBrush_2 = _GDIPlus_BrushCreateSolid(0xFF000000)
_GDIPlus_GraphicsFillRect($hGraphic, 36, 3, 15, 9, $hBrush_1) ;Shift
_GDIPlus_GraphicsFillRect($hGraphic, 36, 14, 6, 9, $hBrush_1) ;Ctrl
_GDIPlus_GraphicsFillRect($hGraphic, 44, 14, 4, 9, $hBrush_1) ;Win
_GDIPlus_GraphicsFillRect($hGraphic, 50, 14, 6, 9, $hBrush_1) ;Alt
$Label = GUICtrlCreateLabel ("",  0, 0, 33, 23, $SS_LEFT, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetFont (-1,12)
$kn = GUICtrlCreateButton("", 62, 3, 20, 20)
_GUICtrlButton_SetImageList(-1, $hImagebtn, 4,-12,-5)
GUICtrlSetTip($kn, "Закрыть")

Const $LANG_RUS = 0x0419 ;Русский
Const $LANG_ENG = 0x0409 ;Англиский
Const $LANG_KZ = 0x043F ;Казахский

AdlibRegister("tekushij_jazyk", 1000)
GUIRegisterMsg($WM_MOVE, "MOVE")

While 1
$msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    $koord_okna = WinGetPos($hGui)
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$x_win", $koord_okna[0])
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$y_win", $koord_okna[1])
    _GDIPlus_BrushDispose($hBrush_1)
    _GDIPlus_BrushDispose($hBrush_2)
    _GDIPlus_GraphicsDispose($hGraphic)   
    _GDIPlus_ShutDown ()
    ProcessClose("Нажатость клавиши Ctrl.exe")
    ProcessClose("Нажатость клавиши Win.exe")
    ProcessClose("Нажатость клавиши Alt.exe")
    ExitLoop

    Case $msg = $kn
    $koord_okna = WinGetPos($hGui)
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$x_win", $koord_okna[0])
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$y_win", $koord_okna[1])
    _GDIPlus_BrushDispose($hBrush_1)
    _GDIPlus_BrushDispose($hBrush_2)
    _GDIPlus_GraphicsDispose($hGraphic)   
    _GDIPlus_ShutDown ()
    ExitLoop
    EndSelect

    If _IsPressed("10", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 36, 3, 15, 9, $hBrush_2) ;Shift
        While _IsPressed("10", $hDLL)
            Sleep(250)
        WEnd
        _GDIPlus_GraphicsFillRect($hGraphic, 36, 3, 15, 9, $hBrush_1) ;Shift
    EndIf
    Sleep(250)
 
    If _IsPressed("11", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 36, 14, 6, 9, $hBrush_2) ;Ctrl
        While _IsPressed("11", $hDLL)
            Sleep(250)
        WEnd
        _GDIPlus_GraphicsFillRect($hGraphic, 36, 14, 6, 9, $hBrush_1) ;Ctrl
    EndIf
    Sleep(250)
 
    If _IsPressed("5B", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 44, 14, 4, 9, $hBrush_2) ;Win_Д
        While _IsPressed("5B", $hDLL)
            Sleep(250)
        WEnd
        _GDIPlus_GraphicsFillRect($hGraphic, 44, 14, 4, 9, $hBrush_1) ;Win_Д
    EndIf
    Sleep(250)
 
    If _IsPressed("5C", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 44, 14, 4, 9, $hBrush_2) ;Win_К
        While _IsPressed("5C", $hDLL)
            Sleep(250)
        WEnd
        _GDIPlus_GraphicsFillRect($hGraphic, 44, 14, 4, 9, $hBrush_1) ;Win_К
    EndIf
    Sleep(250)
 
    If _IsPressed("12", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 50, 14, 6, 9, $hBrush_2) ;Alt
        While _IsPressed("12", $hDLL)
            Sleep(250)
        WEnd
        _GDIPlus_GraphicsFillRect($hGraphic, 50, 14, 6, 9, $hBrush_1) ;Alt
    EndIf
    Sleep(250)
WEnd

DllClose($hDLL)

Func tekushij_jazyk()
$GetLang = '0x' & Hex(BitAND(_WinAPI_GetKeyboardLayout(WinGetHandle('[ACTIVE]')), 0xFFFF), 4)
Select
Case $GetLang = $LANG_KZ
GUICtrlSetData($Label, 'Kz')
Case  $GetLang = $LANG_RUS
GUICtrlSetData($Label, 'Рус')
Case $GetLang = $LANG_ENG
GUICtrlSetData($Label, 'Eng')
EndSelect
EndFunc

Фото "Закрыть.png" приложено во вложении. Программка, как будто бы и работает, но... тольно когда нажата и удерживается 1 клавиша-модификатор. Когда же нажата и удерживается 1 клавиша-модификатор и пытаешься нажать еще 1 1 клавишу-модификатор - нет, не работает. Поэтому я решил "нажатость" каждой клавиши-модификатора выводить в отдельном окне. Файл Нажатость клавиш.exe, запускающий это все, я получаю компиляцией следующего файла Нажатость клавиш.au3:
Код:
#include <GDIPlus.au3>
#include <Misc.au3>
#include <GUIConstants.au3>
#include <StaticConstants.au3>
#Include <WinAPIEx.au3>

#Include <GuiButton.au3>
#include <GuiImageList.au3>

Local $hDLL = DllOpen("user32.dll")

If FileExists(@ScriptDir &"\Нажатость клавиш.ini") Then
$x_win = IniRead(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$x_win", "")
$y_win = IniRead(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$y_win", "")
Else
$x_win = -1
$y_win = -1
EndIf

$hGui = GUICreate("Нажатость клавиш", 85, 26, $x_win, $y_win, BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))


;======================================================================================================================
;Устанавливаю фото на кнлпку
$hImagebtn =  _GUIImageList_Create(34, 34, 5)
_GDIPlus_Startup()
$h_Image = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Закрыть.png')
$h_Bitmap =_GDIPlus_BitmapCreateHBITMAPFromBitmap($h_Image)
_GUIImageList_Add($hImagebtn, $h_Bitmap)
_GDIPlus_ImageDispose($h_Image)
_WinAPI_DeleteObject($h_Bitmap)
_GDIPlus_Shutdown()
;======================================================================================================================
GUISetState(@SW_SHOW)
GUISetBkColor(0x9CAEC1)
WinWaitActive("My GUI")
ShellExecute(@ScriptDir & "\Нажатость клавиши Win.exe", $x_win+45 & ' ' & $y_win+15)
WinWaitActive("Win")
ShellExecute(@ScriptDir & "\Нажатость клавиши Alt.exe", $x_win+51 & ' ' & $y_win+15)
WinWaitActive("Нажатость клавиши Alt")
ShellExecute(@ScriptDir & "\Нажатость клавиши Ctrl.exe", $x_win-2 & ' ' & $y_win+1)
WinWaitActive("Нажатость клавиши Ctrl")

GUISetBkColor(0x9CAEC1)

  _GDIPlus_Startup()
    Global $hPen_1 = _GDIPlus_PenCreate (0xffffffff, 11)
    Global $hPen_2 = _GDIPlus_PenCreate (0xff000000, 11)
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
$hBrush_1 = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
$hBrush_2 = _GDIPlus_BrushCreateSolid(0xFF000000)
_GDIPlus_GraphicsFillRect($hGraphic, 36, 3, 15, 9, $hBrush_1) ;Shift
_GDIPlus_GraphicsFillRect($hGraphic, 36, 14, 6, 9, $hBrush_1) ;Ctrl
_GDIPlus_GraphicsFillRect($hGraphic, 44, 14, 4, 9, $hBrush_1) ;Win
_GDIPlus_GraphicsFillRect($hGraphic, 50, 14, 6, 9, $hBrush_1) ;Alt
$Label_1 = GUICtrlCreateLabel ("",  0, 0, 33, 23, $SS_LEFT, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetFont (-1,12)
$kn = GUICtrlCreateButton("", 62, 3, 20, 20)
_GUICtrlButton_SetImageList(-1, $hImagebtn, 4,-12,-5)
GUICtrlSetTip($kn, "Закрыть")

Const $LANG_RUS = 0x0419 ;Русский
Const $LANG_ENG = 0x0409 ;Англиский
Const $LANG_KZ = 0x043F ;Казахский

AdlibRegister("tekushij_jazyk", 1000)
GUIRegisterMsg($WM_MOVE, "MOVE")

While 1
$msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    $koord_okna = WinGetPos($hGui)
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$x_win", $koord_okna[0])
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$y_win", $koord_okna[1])
    _GDIPlus_PenDispose($hPen_1)
    _GDIPlus_PenDispose($hPen_2)
    _GDIPlus_GraphicsDispose($hGraphic)   
    _GDIPlus_ShutDown ()
    ProcessClose("Нажатость клавиши Ctrl.exe")
    ProcessClose("Нажатость клавиши Win.exe")
    ProcessClose("Нажатость клавиши Alt.exe")
    ExitLoop
    Case $msg = $kn
    $koord_okna = WinGetPos($hGui)
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$x_win", $koord_okna[0])
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$y_win", $koord_okna[1])
    _GDIPlus_PenDispose($hPen_1)
    _GDIPlus_PenDispose($hPen_2)
    _GDIPlus_GraphicsDispose($hGraphic)   
    _GDIPlus_ShutDown ()
    ProcessClose("Нажатость клавиши Ctrl1.exe")
    ProcessClose("Нажатость клавиши Win.exe")
    ProcessClose("Нажатость клавиши Alt.exe")
    ExitLoop
    EndSelect

    If _IsPressed("10", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 36, 3, 15, 9, $hBrush_2) ;Shift
        While _IsPressed("10", $hDLL)
            Sleep(250)
        WEnd
        _GDIPlus_GraphicsFillRect($hGraphic, 36, 3, 15, 9, $hBrush_1) ;Shift
    EndIf
    Sleep(250)
WEnd

DllClose($hDLL)

Здесь следует отметить 1 важный момент: файл Нажатость клавиши Ctrl.exe должен быть запущен последним. Чтобы понять, почему это так, нужно взглянуть на содержание файла Нажатость клавиши Ctrl.au3 , компиляцией которого был получен это файл .ехе. Итак, содержание это следующее:
Код:
#NoTrayIcon
#include <GUIConstants.au3>
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
#Include <WinAPIEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>

Local $hDLL = DllOpen("user32.dll")

$Frame = GUICreate("Нажатость клавиши Ctrl", 62, 26,  $CmdLIne[1], $CmdLIne[2], $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_LAYERED))

GUISetBkColor(0xABCDEF)
_WinAPI_SetLayeredWindowAttributes($Frame, 0xABCDEF, 0, $LWA_COLORKEY)
GUISetState()
$Label_1 = GUICtrlCreateLabel ("",  0+3, 0, 33, 23, $SS_RIGHT, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetFont (-1,12)

Const $LANG_RUS = 0x0419 ;Русский
Const $LANG_ENG = 0x0409 ;Англиский
Const $LANG_KZ = 0x043F ;Казахский

AdlibRegister("tekushij_jazyk", 1000)
GUIRegisterMsg($WM_MOVE, "MOVE")

_GDIPlus_Startup()
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Frame)
$hBrush_1 = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
$hBrush_2 = _GDIPlus_BrushCreateSolid(0xFF000000)
_GDIPlus_GraphicsFillRect($hGraphic, 36+3, 14, 6, 9, $hBrush_1) ;Ctrl

While 1
$msg = GUIGetMsg()
 
    If $msg = $GUI_EVENT_CLOSE Then
    _GDIPlus_BrushDispose($hBrush_1)
    _GDIPlus_BrushDispose($hBrush_2)
    _GDIPlus_GraphicsDispose($hGraph)
    _GDIPlus_GraphicsDispose($hGraph)
    _GDIPlus_Shutdown()
    ExitLoop
    EndIf

    If _IsPressed("11", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 36+3, 14, 6, 9, $hBrush_2) ;Ctrl
        While _IsPressed("11", $hDLL)
            Sleep(250)
        WEnd
        _GDIPlus_GraphicsFillRect($hGraphic, 36+3, 14, 6, 9, $hBrush_1) ;Ctrl
    EndIf
    Sleep(250)
WEnd

Func tekushij_jazyk()
$GetLang = '0x' & Hex(BitAND(_WinAPI_GetKeyboardLayout(WinGetHandle('[ACTIVE]')), 0xFFFF), 4)
Select
Case $GetLang = $LANG_KZ
GUICtrlSetData($Label_1, 'Kz')
Case  $GetLang = $LANG_RUS
GUICtrlSetData($Label_1, 'Рус')
Case $GetLang = $LANG_ENG
GUICtrlSetData($Label_1, 'Eng')
EndSelect
EndFunc

func MOVE($hWnd, $Msg, $wParam, $lParam)
    Local $x = BitAND($lParam, 0xFFFF)
    Local $y = BitShift($lParam, 16)
    WinMove("My GUI", "", $x+2, $y-1)
    WinMove("Нажатость клавиши Alt", "", $x+53, $y+14)
    WinMove("Win", "", $x+47, $y+14)
EndFunc
DllClose($hDLL)

как видно из этого кода, в файл Нажатость клавиши Ctrl.au3 включена функция "MOVE", срабатывающая на перемещение окна "Нажатость клавиши Ctrl" и выполняющая функцию перемещения остальных созданных нашей программой окон вслед за окном "Нажатость клавиши Ctrl". Именно поэтому это окно должно быть поверх других окон. Остальные файлы Нажатость клавиши Alt.exe и Нажатость клавиши Win.exe получены компиляцией соответственно следующих файлов .au3:
Код:
#NoTrayIcon
#include <GUIConstants.au3>
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
#Include <WinAPIEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>

Local $hDLL = DllOpen("user32.dll")

$Frame = GUICreate("Нажатость клавиши Alt", 6, 9,  $CmdLIne[1], $CmdLIne[2], $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_LAYERED))

GUISetBkColor(0xABCDEF)
_WinAPI_SetLayeredWindowAttributes($Frame, 0xABCDEF, 0, $LWA_COLORKEY)
GUISetState()

_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($Frame)
$hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)

While 1
$msg = GUIGetMsg()
 
    If $msg = $GUI_EVENT_CLOSE Then
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    ExitLoop
    EndIf

    If _IsPressed("12", $hDLL) Then
        _GDIPlus_GraphicsClear($hGraphic)
        While _IsPressed("12", $hDLL)
            Sleep(250)
        WEnd
        _GDIPlus_GraphicsFillRect($hGraphic, 0, 0, 6, 9, $hBrush) ;Alt
    EndIf
    Sleep(250)
 
    Sleep(250)
WEnd

и
Код:
#NoTrayIcon
#include <GUIConstants.au3>
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
#Include <WinAPIEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>

Local $hDLL = DllOpen("user32.dll")

$Frame = GUICreate("Win", 4, 9,  $CmdLIne[1], $CmdLIne[2], $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_LAYERED))

GUISetBkColor(0xABCDEF)
_WinAPI_SetLayeredWindowAttributes($Frame, 0xABCDEF, 0, $LWA_COLORKEY)
GUISetState()

_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($Frame)
$hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)

While 1
$msg = GUIGetMsg()
 
    If $msg = $GUI_EVENT_CLOSE Then
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    ExitLoop
    EndIf

    If _IsPressed("5B", $hDLL) Then
        _GDIPlus_GraphicsClear($hGraphic)
        While _IsPressed("5B", $hDLL)
            Sleep(250)
        WEnd
        _GDIPlus_GraphicsFillRect($hGraphic, 0, 0, 4, 9, $hBrush) ;Win
    EndIf
    Sleep(250)
 
        If _IsPressed("5C", $hDLL) Then
        _GDIPlus_GraphicsClear($hGraphic)
        While _IsPressed("5C", $hDLL)
            Sleep(250)
        WEnd
        _GDIPlus_GraphicsFillRect($hGraphic, 0, 0, 4, 9, $hBrush) ;Win
    EndIf
    Sleep(250)
WEnd

И вот хотелось бы знать, можно ли это все сделать в одном окне?
 

Вложения

  • Закрыть.png
    Закрыть.png
    509 байт · Просмотры: 2
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,974
Репутация
1,459
написал такую программу
Если у вас включено "Залипание клавиш", то нет необходимости отслеживать в цикле отжатия - этим будет заниматься система (проверял на Win11).
Код:
...
    EndSelect

    If _IsPressed("10", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 36, 3, 15, 9, $hBrush_2) ;Shift
    Else
        _GDIPlus_GraphicsFillRect($hGraphic, 36, 3, 15, 9, $hBrush_1) ;Shift
    EndIf

    If _IsPressed("11", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 36, 14, 6, 9, $hBrush_2) ;Ctrl
    Else
        _GDIPlus_GraphicsFillRect($hGraphic, 36, 14, 6, 9, $hBrush_1) ;Ctrl
    EndIf

    If _IsPressed("5B", $hDLL) Or _IsPressed("5C", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 44, 14, 4, 9, $hBrush_2) ;Win
    Else
        _GDIPlus_GraphicsFillRect($hGraphic, 44, 14, 4, 9, $hBrush_1) ;Win
    EndIf

    If _IsPressed("12", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 50, 14, 6, 9, $hBrush_2) ;Alt
    Else
        _GDIPlus_GraphicsFillRect($hGraphic, 50, 14, 6, 9, $hBrush_1) ;Alt
    EndIf

    Sleep(100) ; можно добавить, но не обязательно
WEnd
...
 
Автор
M

mathem

Новичок
Сообщения
44
Репутация
0
@InnI, большое спасибо за значительное упрощение кода! Я вот все-таки не пойму, почему при нажатии правого Alt становится черным не только прямоугольник, соответствующий этой клавише, но и прямоугольник, соответствующий клавише Ctrl??? И в моем, многооконном варианте, все точно так же.
 

InnI

AutoIT Гуру
Сообщения
4,974
Репутация
1,459
почему при нажатии правого Alt
Сложно сказать. У меня на Win11 с двумя языками RU и EN такого не наблюдается. В окне скрипта области закрашиваются так же, как и на иконке в трее. А на клавиатуре у меня правый Alt - это Alt Gr.
 
Автор
M

mathem

Новичок
Сообщения
44
Репутация
0
@InnI , понятно. А вот скажите, пожалуйста. У меня в надписи при активности некоторых окон отображаемый язык клавы не меняется при смене языка в этих окнах. Например, в командной строке так. У вас так же?
Сообщение автоматически объединено:

Я вот все-таки не пойму, почему при нажатии правого Alt становится черным не только прямоугольник, соответствующий этой клавише, но и прямоугольник, соответствующий клавише Ctrl??? И в моем, многооконном варианте, все точно так же.
Заметил одну прелюбопытную вещицу: так происходит только тогда, когда текущая раскладка клавы - русская. При двух же остальных текущих раскладках - английской и казахской - все работает как часы. У казахской раскладки перед русской есть несколько преимуществ, из-за которых она привлекает мое внимание, главное из которых в том, что точка и запятая - наиболее часто употребляемые знаки препинания - расположены на разных клавишах. И, таким образом, чтобы ввести запятую, не нужно лишний раз нажимать Shift.
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,974
Репутация
1,459
в командной строке так
Верно. Для окна cmd.exe функция возвращает язык 0х0000.

происходит только тогда, когда текущая раскладка клавы - русская
Да, действительно. Хотя на значке в трее загорается только область Alt.

Я не знаю, как это всё исправить.
 
Автор
M

mathem

Новичок
Сообщения
44
Репутация
0
а по секрету скажу, что потом хочу вывести туда и уровень вай-фай сигнала.
Короче основываясь на этом (там, где рассказано, как получать уровень сигнала Wi-Fi с помощью командной строки)) по итогу получился следующий код:
Код:
#include <GDIPlus.au3>
#include <Misc.au3>
#include <GUIConstants.au3>
#include <StaticConstants.au3>
#Include <WinAPIEx.au3>

#Include <GuiButton.au3>
#include <GuiImageList.au3>
#include <Constants.au3>

$a =1
Local $hDLL = DllOpen("user32.dll")

If FileExists(@ScriptDir &"\Нажатость клавиш.ini") Then
$x_win = IniRead(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$x_win", "")
$y_win = IniRead(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$y_win", "")
Else
$x_win = -1
$y_win = -1
EndIf

$hGui = GUICreate("Нажатость клавиш", 138, 32, $x_win, $y_win, BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
Global $id_okna = WinGetHandle($hGUI)
;======================================================================================================================
;Устанавливаю фото на кнлпку
$hImagebtn =  _GUIImageList_Create(34, 34, 5)
_GDIPlus_Startup()
$h_Image = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Закрыть.png')
$h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($h_Image)
_GUIImageList_Add($hImagebtn, $h_Bitmap)
_GDIPlus_ImageDispose($h_Image)
_WinAPI_DeleteObject($h_Bitmap)
_GDIPlus_Shutdown()
;======================================================================================================================
GUISetState(@SW_SHOW)
GUISetBkColor(0x9CAEC1)

  _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
$hBrush_1 = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
$hBrush_2 = _GDIPlus_BrushCreateSolid(0xFF000000)
$hBrush_3 = _GDIPlus_BrushCreateSolid(0xFF9CAEC1)
$hBrush_4 = _GDIPlus_BrushCreateSolid(0xFFFFA700)

$hPen_1 = _GDIPlus_PenCreate(0xFFFFFFFF, 2)
$hPen_2 = _GDIPlus_PenCreate(0xFF9CAEC1, 2)
$hPen_3 = _GDIPlus_PenCreate(0xFFFFA700, 2)
$Label_1 = GUICtrlCreateLabel ("",  0, -3, 51, 32, $SS_RighT, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetFont (-1,17)
$kvafr = GUICtrlCreateLabel ("", 82, 3, 26, 24, -1, $GUI_WS_EX_PARENTDRAG)
$label_2 = GUICtrlCreateLabel ("", 51, 3, 60, 26, -1, $GUI_WS_EX_PARENTDRAG)
$kn = GUICtrlCreateButton("", 111, 3, 26, 26)
_GUICtrlButton_SetImageList(-1, $hImagebtn, 4,-12,-5)
GUICtrlSetTip($kn, "Закрыть")
Global $contextmenu_1 = GUICtrlCreateContextMenu($label_1)
Global $punkt_1 = GUICtrlCreateMenuItem("Устаносить/снять прозрачность" & Chr(124) & "  (п)", $contextmenu_1)
Global $contextmenu_2 = GUICtrlCreateContextMenu($kvafr)
Global $punkt_2 = GUICtrlCreateMenuItem("Устаносить/снять прозрачность" & Chr(124) & "  (п)", $contextmenu_2)
Global $contextmenu_3 = GUICtrlCreateContextMenu($label_2)
Global $punkt_3 = GUICtrlCreateMenuItem("Устаносить/снять прозрачность" & Chr(124) & "  (п)", $contextmenu_3)
Global $pustyshks = GUICtrlCreateDummy()
Local $aAccelKeys[1][2] = [["п", $punkt_1]]
GUISetAccelerators($aAccelKeys)

Const $LANG_RUS = 0x0419 ;Русский
Const $LANG_ENG = 0x0409 ;Англиский
Const $LANG_KZ = 0x043F ;Казахский

AdlibRegister("tekushij_jazyk", 1000)
GUIRegisterMsg($WM_MOVE, "MOVE")

While 1
$msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    $koord_okna = WinGetPos($hGui)
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$x_win", $koord_okna[0])
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$y_win", $koord_okna[1])
    _GDIPlus_BrushDispose($hBrush_1)
    _GDIPlus_BrushDispose($hBrush_2)
    _GDIPlus_BrushDispose($hBrush_3)
    _GDIPlus_BrushDispose($hBrush_4)
    _GDIPlus_PenDispose($hPen_1)
    _GDIPlus_PenDispose($hPen_2)
    _GDIPlus_PenDispose($hPen_3)
    _GDIPlus_GraphicsDispose($hGraphic)       
    _GDIPlus_ShutDown ()
    ExitLoop

    Case $msg = $kn
    $koord_okna = WinGetPos($hGui)
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$x_win", $koord_okna[0])
    IniWrite(@ScriptDir &"\Нажатость клавиш.ini", "sekcija", "$y_win", $koord_okna[1])
    _GDIPlus_BrushDispose($hBrush_1)
    _GDIPlus_BrushDispose($hBrush_2)
    _GDIPlus_BrushDispose($hBrush_3)
    _GDIPlus_BrushDispose($hBrush_4)
    _GDIPlus_PenDispose($hPen_1)
    _GDIPlus_PenDispose($hPen_2)
    _GDIPlus_PenDispose($hPen_3)
    _GDIPlus_GraphicsDispose($hGraphic)       
    _GDIPlus_ShutDown ()
    ExitLoop
   
    Case $msg = $punkt_1
    izmenit_prozr()
    Case $msg = $punkt_2
    izmenit_prozr()
    Case $msg = $punkt_3
    EndSelect

    If _IsPressed("10", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 54, 3, 17, 12, $hBrush_2) ;Shift
    Else
        _GDIPlus_GraphicsFillRect($hGraphic, 54, 3, 17, 12, $hBrush_1) ;Shift
    EndIf

   If _IsPressed("11", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 54, 17, 7, 12, $hBrush_2) ;Ctrl
    Else
        _GDIPlus_GraphicsFillRect($hGraphic, 54, 17, 7, 12, $hBrush_1) ;Ctrl
    EndIf  
 
    If _IsPressed("5B", $hDLL) Or _IsPressed("5C", $hDLL) Then
        _GDIPlus_GraphicsFillRect($hGraphic, 63, 17, 4, 12, $hBrush_2) ;Win
    Else
        _GDIPlus_GraphicsFillRect($hGraphic, 63, 17, 4, 12, $hBrush_1) ;Win
    EndIf
   
       
       If _IsPressed("12", $hDLL) Then
    _GDIPlus_GraphicsFillRect($hGraphic, 69, 17, 7, 12, $hBrush_2) ;Alt
    Else
        _GDIPlus_GraphicsFillRect($hGraphic, 69, 17, 7, 12, $hBrush_1) ;Alt
    EndIf
   
   
    Sleep(100) ; можно добавить, но не обязательно

    WEnd

DllClose($hDLL)

Func tekushij_jazyk()
$GetLang = '0x' & Hex(BitAND(_WinAPI_GetKeyboardLayout(WinGetHandle('[ACTIVE]')), 0xFFFF), 4)
Select
Case $GetLang = $LANG_KZ
GUICtrlSetData($Label_1, 'Kz')
Case  $GetLang = $LANG_RUS
GUICtrlSetData($Label_1, 'Рус')
Case $GetLang = $LANG_ENG
GUICtrlSetData($Label_1, 'Eng')
EndSelect
$iPID = Run(@ComSpec & " /c chcp 1251 & netsh wlan show interfaces", "", @SW_HIDE, $STDOUT_CHILD)
ProcessWaitClose($iPID)
$sOut = StdoutRead($iPID)
Global $signal = StringRegExp($sOut, '\d{1,3}%', 3)
If @error Then
Global $signal_2 = "0%"
Else
Global $signal_2 = $signal[0]
EndIf
Global $signal_1 = StringTrimRight($signal_2, 1)
If $signal_1 = 0 Then
sig()
ElseIf 0 < $signal_1 And $signal_1 <= 20 Then
s0()
ElseIf 20 < $signal_1 And $signal_1 <= 40 Then
s20()
ElseIf 40 < $signal_1 And $signal_1 <= 60 Then
s40()
ElseIf 60 < $signal_1 And $signal_1 <= 80 Then
s60()
ElseIf 80 < $signal_1 And $signal_1 <= 100 Then
s80()
EndIf
EndFunc

Func sig()
_GDIPlus_GraphicsDrawArc($hGraphic, 82, 3, 48, 48, 180, 90, $hPen_2)
_GDIPlus_GraphicsDrawArc($hGraphic, 86, 7, 40, 40, 180, 90, $hPen_2)
_GDIPlus_GraphicsDrawArc($hGraphic, 90, 11, 32, 32, 180, 90, $hPen_2)
_GDIPlus_GraphicsDrawArc($hGraphic, 94, 15, 24, 24, 180, 90, $hPen_2)
_GDIPlus_GraphicsDrawArc($hGraphic, 98, 19, 16, 16, 180, 90, $hPen_2)
_GDIPlus_GraphicsFillEllipse($hGraphic, 101, 24, 6, 6, $hBrush_4)
GUICtrlSetTip($kvafr, "Уровень сигнала" & @LF & "Wi-Fi: " & $signal_1)
EndFunc


Func s20()
_GDIPlus_GraphicsDrawArc($hGraphic, 82, 3, 48, 48, 180, 90, $hPen_2)
_GDIPlus_GraphicsDrawArc($hGraphic, 86, 7, 40, 40, 180, 90, $hPen_2)
_GDIPlus_GraphicsDrawArc($hGraphic, 90, 11, 32, 32, 180, 90, $hPen_2)
_GDIPlus_GraphicsDrawArc($hGraphic, 94, 15, 24, 24, 180, 90, $hPen_1)
_GDIPlus_GraphicsDrawArc($hGraphic, 98, 19, 16, 16, 180, 90, $hPen_1)
_GDIPlus_GraphicsFillEllipse($hGraphic, 101, 24, 6, 6, $hBrush_3)
_GDIPlus_GraphicsFillEllipse($hGraphic, 103, 24, 4, 4, $hBrush_1)
GUICtrlSetTip($kvafr, "Уровень сигнала" & @LF & "Wi-Fi: " & $signal_2)
EndFunc

Func s40()
_GDIPlus_GraphicsDrawArc($hGraphic, 82, 3, 48, 48, 180, 90, $hPen_2)
_GDIPlus_GraphicsDrawArc($hGraphic, 86, 7, 40, 40, 180, 90, $hPen_2)
_GDIPlus_GraphicsDrawArc($hGraphic, 90, 11, 32, 32, 180, 90, $hPen_1)
_GDIPlus_GraphicsDrawArc($hGraphic, 94, 15, 24, 24, 180, 90, $hPen_1)
_GDIPlus_GraphicsDrawArc($hGraphic, 98, 19, 16, 16, 180, 90, $hPen_1)
_GDIPlus_GraphicsFillEllipse($hGraphic, 101, 24, 6, 6, $hBrush_3)
_GDIPlus_GraphicsFillEllipse($hGraphic, 103, 24, 4, 4, $hBrush_1)
GUICtrlSetTip($kvafr, "Уровень сигнала" & @LF & "Wi-Fi: " & $signal_2)
EndFunc

Func s60()
_GDIPlus_GraphicsDrawArc($hGraphic, 82, 3, 48, 48, 180, 90, $hPen_2)
_GDIPlus_GraphicsDrawArc($hGraphic, 86, 7, 40, 40, 180, 90, $hPen_1)
_GDIPlus_GraphicsDrawArc($hGraphic, 90, 11, 32, 32, 180, 90, $hPen_1)
_GDIPlus_GraphicsDrawArc($hGraphic, 94, 15, 24, 24, 180, 90, $hPen_1)
_GDIPlus_GraphicsDrawArc($hGraphic, 98, 19, 16, 16, 180, 90, $hPen_1)
_GDIPlus_GraphicsFillEllipse($hGraphic, 101, 24, 6, 6, $hBrush_3)
_GDIPlus_GraphicsFillEllipse($hGraphic, 103, 24, 4, 4, $hBrush_1)
GUICtrlSetTip($kvafr, "Уровень сигнала" & @LF & "Wi-Fi: " & $signal_2)
EndFunc

Func s80()
_GDIPlus_GraphicsDrawArc($hGraphic, 82, 3, 48, 48, 180, 90, $hPen_1)
_GDIPlus_GraphicsDrawArc($hGraphic, 86, 7, 40, 40, 180, 90, $hPen_1)
_GDIPlus_GraphicsDrawArc($hGraphic, 90, 11, 32, 32, 180, 90, $hPen_1)
_GDIPlus_GraphicsDrawArc($hGraphic, 94, 15, 24, 24, 180, 90, $hPen_1)
_GDIPlus_GraphicsDrawArc($hGraphic, 98, 19, 16, 16, 180, 90, $hPen_1)
_GDIPlus_GraphicsFillEllipse($hGraphic, 101, 24, 6, 6, $hBrush_3)
_GDIPlus_GraphicsFillEllipse($hGraphic, 103, 24, 4, 4, $hBrush_1)
GUICtrlSetTip($kvafr, "Уровень сигнала" & @LF & "Wi-Fi: " & $signal_2)
EndFunc

Func izmenit_prozr()
$a = 1-$a
If $a = 0 Then
WinSetTrans($id_okna, "", 127)
Else
WinSetTrans($id_okna, "", 255)
EndIf
EndFunc

Ну какие впечатления от программы? В Диспетчере задач мелькает, толком не появляясь командная строка. Ну оно и понятно: как написал, так и работает. Когда запускаешь, в том же Диспетчере нп вкладке Быстродействие такое впечатление,, что кривые начинают чаще уходить в максимум, под потолок. Такое впечатление, что моя програ чрезмерно грузит процессор. Если это так, я, конечно, откажусь от использования этой прогры в том виде, в котором она есть сейчас. @InnI, вы бы не могли тоже протестировать мою прогру на предмет загрузки ею ЦП: И сказать свое впечатление. Если, конечно, у вас вай-фай. Или кто другой бы потестил и сказал свое впечатление.

Еще вот что. Я хочу в ГУИ наподобие контекстного меню, но только чтоб на его пункты можно было ставить, а потом снимать с них галочки. Вы не знаете, в автоите есть-нет такое? Я еще просто не все элементы ГУИ просмотрел.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
620
Репутация
80
Такое впечатление, что моя програ чрезмерно грузит процессор.
Загрузка меньше процента.
Я хочу в ГУИ наподобие контекстного меню, но только чтоб на его пункты можно было ставить, а потом снимать с них галочки.
 
Автор
M

mathem

Новичок
Сообщения
44
Репутация
0
Загрузка меньше процента.
У меня тоже (иногда число, стоящее в столбце ЦП и строке Нажатость клавиш.exr в Мониторе ресурсов поднимается до 2). Это значит что, что я могу абсолютно безбоязненно гонять эту прогру часами? Скажите, пожалуйста, прямо, чтоб мне не думать "будет что -не будет".
Я это все знаю, но там получается галочки на пункты контекстного ставить не получается. Или я так делал. Дайте, пожалуйста, пример, чтобы ставились/снимались галочки с пунктов контекстного.
 
Верх