WinFlash() blinken bis Fenster offen

  • Hi, folgendes hatte ich in meinem Chat eingebaut:

    [autoit]


    If Not WinActive($MainGUI) Then
    Do
    WinFlash($MainGUI,"", 2, 500)
    Until WinActive($MainGUI)
    EndIf

    [/autoit]


    Es klappt soweit, dass wenn das Fenster wider offen
    ist, dass es dann stoppt, aber Daten, die ich über
    TCP empfange kommen dann nicht an. Ich denke,
    dass es mit dem Until zusammenhängt.
    Kann mir dabei jemand helfen?


    MfG
    qixx

  • damit nimmst Du das blinken raus aus der Hauptschleife, die ja auf TCPListen warten soll.
    Entweder zeitgesteuert alle ... mSek. oder als AdlibRegister.
    z.B.
    am Anfang des Scriptes: AdlibRegister(_blinken,250)

    Func _blinken()
    If Not WinActive($MainGUI) Then
    WinFlash($MainGUI,"", 2, 500)
    EndIf
    EndFunc

    ist ungetestet aber vom Prinzip her richtig...

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Hmm, eine MsgBox oder Inputbox stoppt
    das Skript ja auch. Kann man die auch
    so nebenbei aufrufen, dass alles trotzdem
    weiterhin ausgeführt wird?


    MfG
    qixx


    Ja. Starte die Messagebox als Thread: http://www.autoitscript.com/forum/index.php?showtopic=25494&view=findpost&p=642848

    Aber noch mal zum Blinken: Wenn man die DLL-Funktion direkt verwendet, hat man mehr Parameter und kann das Blinken bis zum Aktivieren mit nur wenigen Zeilen aktivieren:

    Spoiler anzeigen
    [autoit]

    Global Const $FLASHW_ALL = 0x00000003 ;Flash both the window caption and taskbar button. This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags.
    Global Const $FLASHW_CAPTION = 0x00000001 ;Flash the window caption.
    Global Const $FLASHW_STOP = 0 ;Stop flashing. The system restores the window to its original state.
    Global Const $FLASHW_TIMER = 0x00000004 ;Flash continuously, until the FLASHW_STOP flag is set.
    Global Const $FLASHW_TIMERNOFG = 0x0000000C ;Flash continuously until the window comes to the foreground.
    Global Const $FLASHW_TRAY = 0x00000002 ;Flash the taskbar button.

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

    Func _FlashWindowEx($hWnd, $dwFlags, $uCount=4, $dwTimeOut=500)
    ; Author: Prog@ndy
    Local $tFlash = DllStructCreate("UINT cbSize; HWND hwnd; DWORD dwFlags; UINT uCount; DWORD dwTimeout;")
    DllStructSetData($tFlash, 1, DllStructGetSize($tFlash))
    DllStructSetData($tFlash, 2, $hWnd)
    DllStructSetData($tFlash, 3, $dwFlags)
    DllStructSetData($tFlash, 4, $uCount)
    DllStructSetData($tFlash, 5, $dwTimeOut)
    Local $aResult = DllCall('User32.dll', 'int', 'FlashWindowEx', 'ptr', DllStructGetPtr($tFlash))
    If @error Then Return SetError(1, @error,0)
    Return $aResult[0]
    EndFunc

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

    ;------------------------------------------------------------------

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

    $hMainGUI = GUICreate("Flash when inactive")
    GUISetState()
    GUIRegisterMsg(0x001C, 'WM_ACTIVATEAPP') ; Hier wird das blinken angeschaltet, sobald das Fenster nicht mehr aktiv ist.

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

    While 1
    If GUIGetMsg() = -3 Then Exit
    WEnd

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

    Func WM_ACTIVATEAPP($hWnd, $uMsg, $wParam, $lParam)
    If $wParam = False Then _FlashWindowEx($hMainGUI, BitOR($FLASHW_ALL, $FLASHW_TIMERNOFG), -1)
    Return 'GUI_RUNDEFMSG'
    EndFunc

    [/autoit]
  • Hmm... Ich habe leider absolut keinen Plan
    von dll. :( Muss ich noch eine erstellen?
    MfG
    qixx


    Wenn du das Blinken meinst, da habe ich dir doch ein Beispiel gegeben. Über dem Strich ist die FUnktion und unter dem Strich ein Beispiel. Du musst dafür keine eigene DLL erstellen.

  • Hmm, eine MsgBox oder Inputbox stoppt
    das Skript ja auch. Kann man die auch
    so nebenbei aufrufen, dass alles trotzdem
    weiterhin ausgeführt wird?

    Du kannst auch (mal abgesehen von Progandys lösung) ein bisschen "schummeln".
    Hier mal _MsgBox und _InputBox von mir. Beide blocken das Script nicht (wenn erwünscht)

    _InputBox()
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GuiConstants.au3>
    #include <Array.au3>
    Global $sInputs_Array[1][2]

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

    If Not IsDeclared("WM_COMMAND") Then Global Const $WM_COMMAND = 0x0111
    If Not IsDeclared("WM_MOVE") Then Global Const $WM_MOVE = 0x0003
    If Not IsDeclared("WM_LBUTTONDOWN") Then Global Const $WM_LBUTTONDOWN = 0x0201
    If Not IsDeclared("WM_RBUTTONDOWN") Then Global Const $WM_RBUTTONDOWN = 0x0204

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

    Global $sToolTip_Text[2] = ["You can only type certain characters.", "Unacceptable Character:"]

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

    GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
    GUIRegisterMsg($WM_MOVE, "WM_CLEAR_TOOLTIP")
    GUIRegisterMsg($WM_LBUTTONDOWN, "WM_CLEAR_TOOLTIP")
    GUIRegisterMsg($WM_RBUTTONDOWN, "WM_CLEAR_TOOLTIP")

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

    ;string rückgabe
    $input = _InputBox(2,"InputBox Beispiel","[0-9a-z] = Keine Zahlen oder Kleinbuchstaben|[A-Z] = Keine Großbuchstaben", "ABCDEFG|01234abcdef","[0-9a-z]|[A-Z]",1,1)
    MsgBox(0,"","Error: "&@error&@CRLF&"Extended: "&@extended&@CRLF&$input)

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

    ;Array Rückgabe
    $aInput = _InputBox(2,"InputBox Beispiel","[0-9a-z] = Keine Zahlen oder Kleinbuchstaben|[A-Z] = Keine Großbuchstaben", "ABCDEFG|01234abcdef","[0-9a-z]|[A-Z]",1)
    MsgBox(0,"","Error: "&@error&@CRLF&"Extended: "&@extended)
    _ArrayDisplay($aInput)

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

    ;Script pausiert nicht:
    $aNoWait = _InputBox(2,"InputBox Beispiel","[0-9a-z] = Keine Zahlen oder Kleinbuchstaben|[A-Z] = Keine Großbuchstaben", "ABCDEFG|01234abcdef","[0-9a-z]|[A-Z]",0)
    _ArrayDisplay($aNoWait)

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

    Func _InputBox($iCount,$sTitle,$sText,$sDefault,$sRegExp="",$iWait=1,$iMode=0,$sDelim="|")
    ;Author: SEuBo
    ;$iCount: Anzahl der "Inputgruppen"
    ;$sTitle: Titel der _InputBox
    ;$sText: Text für die einzelnen Gruppen. Hier wird ein Trennzeichenseperierter String benötigt
    ;BSP: "1|2|3". Das Trennzeichen kann in $sDelim selbst bestimmt werden, falls das erwünscht ist
    ;$sDefault: Default-Text für die Input felder. Hier wird wieder ein seperierter String benötigt.

    ; == OPTIONAL ==
    ;
    ;$sRegExp: RegEx für die einzelnen Input-Controls. Mit dem RegExp wird angegeben, welche Zeichen
    ; NICHT vorkommen dürfen (!!!)
    ;$iMode: Der Rückgabemodus. 0 (Standard) = Array. 1 = mit $sDelim seperierter String.
    ;$iWait: 1: InputBox soll das script pausieren. 0: Script läuft sofort weiter
    ; ist dieser Parameter aktiviert, gibt die Funktion folgendes zurück:
    ; $array[0] = GUI-Handle
    ; $array[1] = (ID): Cancel-Button
    ; $array[2] = (ID): Erstes Input-Ctrl
    ; $array[n] = (ID): n-tes Input-Ctrl

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

    Dim $sInputs_Array[1][2]
    $OnEvent = Opt("GUIOnEventMode",0)
    Local $aData[$iCount+1][2], $ifCount = 0, $aText = StringSplit($sText,$sDelim), $aDefault = StringSplit($sDefault,$sDelim), $aRegExp = StringSplit($sRegExp,$sDelim)
    If $iCount = "" OR $iCount < 1 OR $iMode < 0 OR $iMode > 1 OR $sDelim = "" Then
    Return SetError(2,0,"")
    EndIf
    If $aDefault[0] < $iCount+1 Or $aDefault[0] > $iCount+1 Then
    ReDim $aDefault[$iCount+1]
    EndIf
    If $aText[0] < $iCount+1 Or $aText[0] > $iCount+1 Then
    ReDim $aText[$iCount+1]
    EndIf
    If $aRegExp[0] < $iCount+1 or $aRegExp[0] > $iCount+1 Then
    ReDim $aRegExp[$iCount+1]
    EndIf
    $_InputBox = GUICreate($sTitle,220,65+$iCount*95,-1,-1,-1,0x00000008)
    For $i = 1 to $iCount
    $aData[$i][0] = GUICtrlCreateLabel($aText[$i], 20, ($ifCount*95)+20, 180, 50)
    $aData[$i][1] = GUICtrlCreateInput($aDefault[$i], 20, ($ifCount*95)+75, 180, 25)
    _GUIInputSetRegExp($aData[$i][1],$aRegExp[$i])
    $ifCount +=1
    Next
    $hButton = GUICtrlCreateButton("Ok",20,(($ifCount-1)*95)+110,80,25)
    $hCancel = GUICtrlCreateButton("Cancel",120,(($ifCount-1)*95)+110,80,25)
    GUISetState()
    If $iWait Then
    While 1 * Sleep(50)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    case -3, $hCancel
    GUIDelete($_InputBox)
    Return SetError(1,0,"")
    Case $hButton
    Switch $iMode
    Case 0
    Local $aRet[$iCount]
    For $i = 1 to $iCount
    $aRet[$i-1] = GUICtrlRead($aData[$i][1])
    Next
    GUIDelete($_InputBox)
    Opt("GUIOnEventMode",$OnEvent)
    Return SetError(@error,$iCount,$aRet)
    Case 1
    Local $aRet
    For $i = 1 to $iCount
    $aRet &= GUICtrlRead($aData[$i][1]) & $sDelim
    Next
    GUIDelete($_InputBox)
    Opt("GUIOnEventMode",$OnEvent)
    Return SetError(@error,$iCount,StringTrimRight($aRet,1))
    EndSwitch
    EndSwitch
    WEnd
    Else
    Local $aRet[$iCount+2]
    $aRet[0] = $_InputBox
    $aRet[1] = $hCancel
    For $i = 1 to $iCount
    $aRet[$i+1] = $aData[$i][1]
    Next
    Opt("GUIOnEventMode",$OnEvent)
    Return SetError(@error,$iCount+1,$aRet)
    EndIf
    EndFunc

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

    ;MrCreator========>
    Func _GUIInputSetRegExp($CtrlId,$sRegExp)
    Local $iUbound = UBound($sInputs_Array)
    ReDim $sInputs_Array[$iUbound+1][2]
    $sInputs_Array[$iUbound][0] = $CtrlId
    $sInputs_Array[$iUbound][1] = $sRegExp
    EndFunc

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

    Func _Input_Changed($hWnd, $CtrlId, $iIndex)
    ToolTip("")
    Local $Read_Input = GUICtrlRead($CtrlId)
    If StringRegExp($Read_Input,$sInputs_Array[$iIndex][1]) Then
    GUICtrlSetData($CtrlId, StringRegExpReplace($Read_Input, $sInputs_Array[$iIndex][1], ''))

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

    Local $Gui_Get_Pos = WinGetPos($hWnd)
    Local $Ctrl_Get_Pos = ControlGetPos($hWnd, "", $CtrlId)

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

    Local Const $SM_CYCAPTION = 4 ;Titelbar heigth
    Local Const $SM_CXFIXEDFRAME = 7 ;Window border size

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

    Local $X_Pos = $Gui_Get_Pos[0] + $Ctrl_Get_Pos[0] + $Ctrl_Get_Pos[2] + GetSystemMetrics($SM_CXFIXEDFRAME)
    Local $Y_Pos = $Gui_Get_Pos[1] + $Ctrl_Get_Pos[1] + $Ctrl_Get_Pos[3] + GetSystemMetrics($SM_CYCAPTION)

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

    ToolTip($sToolTip_Text[0], $X_Pos, $Y_Pos, $sToolTip_Text[1], 3, 1+4)
    DllCall("user32.dll", "int", "MessageBeep", "int", 0x0)
    EndIf
    EndFunc

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

    Func WM_CLEAR_TOOLTIP($hWnd, $iMsg, $wParam, $lParam)
    ToolTip("")
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    If $hWnd = 0 Or Not WinExists($hWnd) Then Return $GUI_RUNDEFMSG

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

    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)
    Local Const $EN_CHANGE = 0x300
    Local Const $EN_UPDATE = 0x400
    Local Const $EN_SETFOCUS = 0x100
    Local Const $EN_KILLFOCUS = 0x200

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

    For $i = 1 To UBound($sInputs_Array)-1
    If $nID = $sInputs_Array[$i][0] Then
    Switch $nNotifyCode
    Case $EN_UPDATE ;$EN_CHANGE
    _Input_Changed($hWnd,$sInputs_Array[$i][0],$i)
    Case $EN_SETFOCUS, $EN_KILLFOCUS
    ToolTip("")
    EndSwitch
    ExitLoop
    EndIf
    Next

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

    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func GetSystemMetrics($Flag)
    Local $iRet = DllCall('user32.dll', 'int', 'GetSystemMetrics', 'int', $Flag)
    Return $iRet[0]
    EndFunc

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

    ;<==========

    [/autoit]
    _MsgBox()