IP fett auff dem Desktop anzeigen

  • Hi ich wollte ein kleines Tool machen mit dem man, die IP auf dem Bildschirm groß und breit sehen kann.

    Dafür wollte ich den String der IP zeichnen und per Gui $WS_EX_TOPMOST ausgeben(möchte nur den Sting ohne Fenster) .

    Nur leider bleibt die IP nicht stehen, wahrscheinlich bin ich einfach zu blind den Fehler zu entdecken.

    Ich habe auch schon probiert den gezeichneten String per _GDIPlus_ImageSaveToFile zu speichern und anschließend wieder aufzurufe, was leider scheiterte.
    Wäre echt super wenn mir da jemand helfen könnte.

    Danke im Voraus :)

    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    Opt('MustDeclareVars', 1)

    [/autoit][autoit][/autoit][autoit]

    _IP()

    [/autoit][autoit][/autoit][autoit]

    Func _IP()
    Local $hGUI, $hGraphic, $hBrush, $hFormat, $hFamily, $hFont, $tLayout, $pic, $basti_stay, $msg
    Local $aInfo, $sString, $ipstring
    $sString ="Ihre IP-Adresse:" & @IPAddress1

    [/autoit][autoit][/autoit][autoit]

    ; Erstellt eine GUI

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; Zeichnet einen String
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF00007F)
    $hFormat = _GDIPlus_StringFormatCreate()
    $hFamily = _GDIPlus_FontFamilyCreate("Arial")
    $hFont = _GDIPlus_FontCreate($hFamily, 36, 2)
    $tLayout = _GDIPlus_RectFCreate(40, 110, 0, 0)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sString, $hFont, $tLayout, $hFormat)
    $ipstring =_GDIPlus_GraphicsDrawStringEx($hGraphic, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)

    [/autoit][autoit][/autoit][autoit]

    Local $sFile = $sString

    [/autoit][autoit][/autoit][autoit]

    ; Transparentes MDI Child Fenster
    $pic = GUICreate("", 400, 268, 20, 20, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST), $ipstring)
    ; Transparentes Bild
    $basti_stay = GUICtrlCreatePic($sFile, 0, 0, 169, 68)
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    ; Ressourcen freigeben
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

    [/autoit][autoit][/autoit][autoit]

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit][autoit][/autoit][autoit]

    EndFunc ;==>_Main

    [/autoit]

    Einmal editiert, zuletzt von KillerNo1 (13. Mai 2011 um 11:55)

  • Hier mal ein altes Beispiel von mir leicht abgeändert:

    Spoiler anzeigen
    [autoit]

    #cs
    GDI+ Example - Draw on Transparent & Click-Through GUI
    by SEuBo, 24.12.2010

    [/autoit] [autoit][/autoit] [autoit]

    http://www.elitepvpers.de/forum/autoit/9…hirm-malen.html
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    #include <Misc.au3>
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Variablen deklarieren
    Local $hGUI, $hGraphics, $hBitmap, $hBackBuffer

    [/autoit] [autoit][/autoit] [autoit]

    ;GDI+ initialisieren, DLL für _IsPressed öffnen und ESC als HotKey festlegen
    _GDIPlus_Startup()
    HotKeySet("{ESC}","_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    ;Transparente GUI erstellen
    $hDummy = GUICreate("") ; Dummy GUI, damit richtiges nicht in Taskleiste auftaucht.
    $hGUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST,$WS_EX_TRANSPARENT),$hDummy)
    GUISetBkColor(0xABCDEF, $hGUI)
    _WinAPI_SetLayeredWindowAttributes($hGUI, 0xABCDEF, 255)

    [/autoit] [autoit][/autoit] [autoit]

    ;Graphic-Objekt, Pinsel und Backbuffer erstellen und GUI anzeigen
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(@DesktopWidth, @DesktopHeight, $hGraphics)
    $hBackBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    GUISetState(@SW_SHOWNOACTIVATE)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawString($hBackBuffer,@IPAddress1,500,500,"Arial",30)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_BitmapDispose($hBitmap)
    GUIDelete($hGUI)
    Exit
    EndFunc

    [/autoit]
  • Kannst du mir nun auch noch verraten wo mein Fehler war ?

    Ich will ja nicht nur copy... past lernen :)

  • Guten Morgen,

    ich möchte genau dieses Thema aufgreifen. Als Administratorin habe ich bereits BGinfo im Einsatz.
    Möchte aber noch eine wichtige Info auf dem Desktop dazu haben.

    Es gibt Server, die mehrere Personen administrieren und wir benutzen immer das Adminstrator-Konto.
    Wir dürfen uns aber nicht vom Server abmelden, weil bestimmte Programm nicht geschlossen werden dürfen.

    Nun hätt ich gern die Info sichtbar.

    Das Script von SEuBo habe ich für mich angepasst. Statt der IP steht da der Satz "NICHT ABMELDEN".
    Bevor ich die EXE jetzt aber auf dem Server startet habe ich Fragen.

    Wenn ich die Option "Desktop anzeigen" ein zweites Mal wähle, ist der Text weg. Gewollt?
    Ich würde gern eine Schleife dazunehmen, die den Text wieder in den Vordergrund holt. Das Script darf natürlich kaum Auslastung verursachen.

    Kann ich das alles mit dem Script umsetzen oder habt ihr sogar bessere Alternativen?

    Vielen Dank im Voraus.

    EDIT:
    Hab mir mal BGInfo genauer angeschaut. Hat alle meine Wünsche erfüllt. Toll!

    Einmal editiert, zuletzt von Xethria (19. Mai 2011 um 11:24)

  • Du musst GUIRegisterMsg in Verbindung mit WM_PAINT benutzen.
    Das wird nämlich immer dann aufgerufen, wenn ein Fenster neugezeichnet wird. Das heißt, wenn du ein Fenster über den Text ziehst, wird ja alles neugezeichnet -> du musst deinen Text auch neu zeichnen lassen.

  • Du musst GUIRegisterMsg in Verbindung mit WM_PAINT benutzen.
    Das wird nämlich immer dann aufgerufen, wenn ein Fenster neugezeichnet wird. Das heißt, wenn du ein Fenster über den Text ziehst, wird ja alles neugezeichnet -> du musst deinen Text auch neu zeichnen lassen.


    Nein, muss Sie nicht.

    Wir dürfen uns aber nicht vom Server abmelden, weil bestimmte Programm nicht geschlossen werden dürfen.


    Wie wäre es denn, das Herunterfahren einfach abzufangen?
    [ offen ] shutdown abfangen

    Wenn ich die Option "Desktop anzeigen" ein zweites Mal wähle, ist der Text weg. Gewollt?
    Ich würde gern eine Schleife dazunehmen, die den Text wieder in den Vordergrund holt. Das Script darf natürlich kaum Auslastung verursachen.


    Also bei mir bleibt der Text - egal wie oft ich Win + D / Win + M drücke.
    Das Fenster wieder anzuzeigen, nachdem es minimiert wurde ist die falsche Herangehensweise. Lass es einfach nicht minimieren.

    [autoit]

    Opt("GUIEventOptions", 1)

    [/autoit]
  • Hier noch eine optisch ansprechendere, jedoch auch schwierigere Version ;).

    Beispiel
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    #include <INet.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; - Author: name22 (http://www.autoit.de)

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $sIP = _GetIP()

    [/autoit] [autoit][/autoit] [autoit]

    $sFont = "Segoe UI"
    $iFontSize = 30

    [/autoit] [autoit][/autoit] [autoit]

    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", 400)
    DllStructSetData($tSize, "Y", 200)
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 255)
    DllStructSetData($tBlend, "Format", 1)
    $tPoint = DllStructCreate($tagPOINT)
    $pPoint = DllStructGetPtr($tPoint)
    DllStructSetData($tPoint, "X", 0)
    DllStructSetData($tPoint, "Y", 0)

    [/autoit] [autoit][/autoit] [autoit]

    $hWnd = GUICreate("", 400, 200, Default, Default, $WS_POPUP, $WS_EX_TOPMOST + $WS_EX_TOOLWINDOW + $WS_EX_LAYERED + $WS_EX_TRANSPARENT)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    $hDC_Window = _WinAPI_GetDC($hWnd)
    $hDC_Buffer = _WinAPI_CreateCompatibleDC($hDC_Window)
    $hGDI_Bitmap = _WinAPI_CreateCompatibleBitmap($hDC_Window, 400, 200)
    _WinAPI_SelectObject($hDC_Buffer, $hGDI_Bitmap)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hDC_Buffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, 2)
    _GDIPlus_GraphicsSetTextRenderingHint($hGraphic, 3)

    [/autoit] [autoit][/autoit] [autoit]

    $hStringFormat = _GDIPlus_StringFormatCreate()
    $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, 1)

    [/autoit] [autoit][/autoit] [autoit]

    $aMeasure = _GDIPlus_GraphicsMeasureString($hGraphic, $sIP, $hFont, _GDIPlus_RectFCreate(), $hStringFormat)
    $tLayout = _GDIPlus_RectFCreate(400 / 2 - DllStructGetData($aMeasure[0], "Width") / 2, 200 / 2 - DllStructGetData($aMeasure[0], "Height") / 2)

    [/autoit] [autoit][/autoit] [autoit]

    $hBrush = _GDIPlus_BrushCreateSolid(0xA0000000)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    HotKeySet("{ESC}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawStringEx($hGraphic, $sIP, $hFont, $tLayout, $hStringFormat, $hBrush)
    _WinAPI_UpdateLayeredWindow($hWnd, $hDC_Window, 0, $pSize, $hDC_Buffer, $pSource, 0, $pBlend, 2)

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _WinAPI_ReleaseDC($hWnd, $hDC_Window)
    _WinAPI_DeleteDC($hDC_Buffer)
    _WinAPI_DeleteObject($hGDI_Bitmap)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_StringFormatDispose($hStringFormat)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GDIPlus_GraphicsSetTextRenderingHint
    ; Description ...: Seets the contrast value of a Graphics object
    ; Syntax.........: _GDIPlus_GraphicsSetTextRenderingHint($hGraphics, $iTextRenderingHint)
    ; Parameters ....: $hGraphics - Pointer to a Graphics object
    ; $iTextRenderingHint - Text rendering mode:
    ; |0 - Character is drawn using the currently selected system font smoothing mode (also called a rendering hint)
    ; |1 - Character is drawn using its glyph bitmap and hinting to improve character appearance on stems and
    ; +curvature
    ; |2 - Character is drawn using its glyph bitmap and no hinting. This results in better performance at the
    ; +expense of quality
    ; |3 - Character is drawn using its antialiased glyph bitmap and hinting. This results in much better quality
    ; +due to antialiasing at a higher performance cost
    ; |4 - Character is drawn using its antialiased glyph bitmap and no hinting. Stem width differences may be
    ; +noticeable because hinting is turned off
    ; |5 - Character is drawn using its glyph Microsoft ClearType bitmap and hinting. This type of text rendering
    ; +cannot be used along with $CompositingModeSourceCopy
    ; Return values .: Success - True
    ; Failure - False and either:
    ; |@error and @extended are set if DllCall failed
    ; |$GDIP_STATUS contains a non zero value specifying the error code
    ; Remarks .......: None
    ; Related .......: _GDIPlus_GraphicsGetTextRenderingHint
    ; Link ..........; @@MsdnLink@@ GdipSetTextRenderingHint
    ; Example .......; No
    ; ===============================================================================================================================
    Func _GDIPlus_GraphicsSetTextRenderingHint($hGraphics, $iTextRenderingHint)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "hwnd", $hGraphics, "int", $iTextRenderingHint)

    [/autoit] [autoit][/autoit] [autoit]

    If @error Then Return SetError(@error, @extended, False)
    $GDIP_STATUS = $aResult[0]
    Return $aResult[0] = 0
    EndFunc ;==>_GDIPlus_GraphicsSetTextRenderingHint

    [/autoit]
  • name22: Da fehlt noch ein $WS_EX_TRANSPARENT für die GUI, dann stört der Text beim Klicken nicht mehr.