Window back on the Top - Gadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: Window back on the Top - Gadget

Beitrag von X360 Andy »

Code: Alles auswählen

SendMessage_(GadgetID(#G1), #WM_SETFOCUS, 1, 1)
PERFEKT - so gehts. Vielen Dank


Gibt hierzu bedenken das System so zu programmieren ?
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: Window back on the Top - Gadget

Beitrag von X360 Andy »

Ich muss mich leider korrigieren.

Wenn vor dem Befehl eine einfache Messagebox kommt... kann man in das StringGadget nichts mehr eingeben.

Versuch mal ob du nach dem Schließen vom Rechner was eingeben kannst....

[Edit]

Die Lösung ist

Code: Alles auswählen

        
SendMessage_(GadgetID(#G1), #WM_SETFOCUS, 1, 1)
        SendMessage_(GadgetID(#G1), #WM_ACTIVATE, 1, 1)

So funktionierts wieder


[/Edit]

Code: Alles auswählen

Global Exit
Global Befehl

#W1=1
#G1=2
#G2=3

Procedure A1(P)

  Repeat
   
    Select Befehl
       
      Case 1
        Debug "Befehl 1"
       
        Befehl=0
       
      Case 2
        Debug "Befehl 2 ---"
       
        Debug "Run Calc.exe"
        program=RunProgram("calc.exe", "", "", #PB_Program_Open)
       
        While ProgramRunning(program)
          Delay(100)
        Wend
        CloseProgram(program)
        Debug "Calc Closed"
        MessageRequester("OK","OK")
        SendMessage_(GadgetID(#G1), #WM_SETFOCUS, 1, 1)

       
        Befehl=0
    EndSelect
   
    Delay(10)
   
  Until Exit=1
  Exit=2
EndProcedure

OpenWindow(#W1, 100, 100, 200, 200, "Main")
StringGadget(#G1, 10, 10, 100, 20, "ABC")
ButtonGadget(#G2, 10, 40, 100, 20, "Klick mich")

CreateThread(@A1(), 1)

Repeat

  event=WaitWindowEvent(50)
  Select event
     Case #WM_APP
        SetActiveWindow(#W1)
        SetActiveGadget(#G1)
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #G1
          Befehl=1
        Case #G2
          Befehl=2
      EndSelect
    Case #PB_Event_CloseWindow
      Select GetActiveWindow()
        Case #W1
          Exit=1
      EndSelect
  EndSelect

Until Exit=2
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Window back on the Top - Gadget

Beitrag von Danilo »

X360 Andy hat geschrieben:Ich muss mich leider korrigieren.

Wenn vor dem Befehl eine einfache Messagebox kommt... kann man in das StringGadget nichts mehr eingeben.

Versuch mal ob du nach dem Schließen vom Rechner was eingeben kannst....

[Edit]

Die Lösung ist

Code: Alles auswählen

        
SendMessage_(GadgetID(#G1), #WM_SETFOCUS, 1, 1)
        SendMessage_(GadgetID(#G1), #WM_ACTIVATE, 1, 1)

So funktionierts wieder


[/Edit]

...
X360 Andy, dieses rumprobieren bringt Dein Fenster nicht in den
Vordergrund, wenn zwischenzeitlich ein anderes Fenster benutzt
wurde und Dein Fenster überdeckt.
Die Lösung habe ich schon gezeigt als SetForegroundWindowInternal().
*Warum* das so ist und ein einfaches SetForegroundWindow_() nicht
immer funktioniert, sondern das Fenster nur zum blinken bringt, ist in
meinem MSDN-Verweis ausführlich zu lesen.

Von daher empfehle ich Dir wirklich SetForegroundWindowInternal() zu
benutzen um sicher zu stellen, daß das Fenster wirklich in den Vordergrund
kommt. Danach kannst Du dann noch SetActiveGadget() benutzen um den
Eingabefokus einem bestimmten Gadget zu geben.

Mit Deinem letzten Code wäre das dann so:

Code: Alles auswählen

Procedure SetForegroundWindowInternal(hWnd)
    ;
    ; http://www.codeproject.com/Tips/76427/How-to-bring-window-to-top-with-SetForegroundWindo
    ;
    If Not IsWindow_(hWnd) : ProcedureReturn : EndIf
     
    ; relation time of SetForegroundWindow lock
    Protected lockTimeOut.l = 0;
    Protected hCurrWnd = GetForegroundWindow_();
    Protected dwThisTID.l = GetCurrentThreadId_()
    Protected dwCurrTID.l = GetWindowThreadProcessId_(hCurrWnd,0);
    
    ; we need To bypass some limitations from Microsoft :)
    If (dwThisTID <> dwCurrTID)
        AttachThreadInput_(dwThisTID, dwCurrTID, #True);
         
        SystemParametersInfo_(#SPI_GETFOREGROUNDLOCKTIMEOUT,0,@lockTimeOut,0);
        SystemParametersInfo_(#SPI_SETFOREGROUNDLOCKTIMEOUT,0,0,#SPIF_SENDWININICHANGE | #SPIF_UPDATEINIFILE);
         
        #ASFW_ANY = -1
        AllowSetForegroundWindow_(#ASFW_ANY);
    EndIf
     
    SetForegroundWindow_(hWnd);
    ;SetFocus_(hWnd)
     
    If (dwThisTID <> dwCurrTID)
        SystemParametersInfo_(#SPI_SETFOREGROUNDLOCKTIMEOUT,0,lockTimeOut,#SPIF_SENDWININICHANGE | #SPIF_UPDATEINIFILE);
        AttachThreadInput_(dwThisTID, dwCurrTID, #False);
    EndIf
EndProcedure


Global Exit
Global Befehl

#W1=1
#G1=2
#G2=3

Procedure A1(windowID.i)

  Repeat
   
    Select Befehl
       
      Case 1
        Debug "Befehl 1"
       
        Befehl=0
       
      Case 2
        Debug "Befehl 2 ---"
       
        Debug "Run Calc.exe"
        program=RunProgram("calc.exe", "", "", #PB_Program_Open)
       
        While ProgramRunning(program)
          Delay(100)
        Wend
        CloseProgram(program)
        Debug "Calc Closed"
        MessageRequester("OK","OK")
        PostMessage_(windowID, #WM_APP+1, 0, 0)

       
        Befehl=0
    EndSelect
   
    Delay(10)
   
  Until Exit=1
  Exit=2
EndProcedure

OpenWindow(#W1, 100, 100, 200, 200, "Main")
StringGadget(#G1, 10, 10, 100, 20, "ABC")
ButtonGadget(#G2, 10, 40, 100, 20, "Klick mich")

CreateThread(@A1(), WindowID(#W1))

Repeat

  event=WaitWindowEvent()
  Select event
     Case #WM_APP+1
        SetForegroundWindowInternal(WindowID(#W1))
        SetActiveGadget(#G1)
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #G1
          Befehl=1
        Case #G2
          Befehl=2
      EndSelect
    Case #PB_Event_CloseWindow
      Select GetActiveWindow()
        Case #W1
          Exit=1
      EndSelect
  EndSelect

Until Exit=2
Laut der Windows-Entwickler-Dokumentation (MSDN) ist das imho
der korrekte Weg, um sicherzustellen das Dein Fenster auch wirklich
wieder in den Vordergrund kommt und dann das Gadget den Eingabe-
fokus wieder erhält.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten