WINAPI: can't re-set focus on Bmax app

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Guamtmsou G.

Betreff: WINAPI: can't re-set focus on Bmax app

BeitragDi, Mai 24, 2011 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
if have the hwnd id of the bmax window, and i tried:

SetForegroundWindow(HWnd)
SetActiveWindow(hwnd)

but on Win7 64 seems there are no effects...

(p.s. SetWindowPos works fine)

any ideas on what I'm doing wrong?

mas93

BeitragDo, Jul 14, 2011 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,
Ich habe im moment exakt das selbe Problem..

Ich kann zwar ein Fenster "aufpoppen" lassen, aber der Fokus liegt nach wie vor auf
dem Fenster darunter.. Ich habe schon alles mögliche Versucht, aber ich bekomm den Fokus einfach nicht sofort automatisch auf das input Feld im aufpoppenden Fenster.

Folgendes habe ich schon versucht:
BlitzMax: [AUSKLAPPEN]
	If IsKeyPressed(32) And IsKeyPressed(162) Then
RestoreApp(winMain)

SetWindowPos(QueryGadget(winMain, QUERY_HWND), HWND_TOPMOST, GadgetX(winMain), GadgetY(winMain), 0, 0, 1)
SetForegroundWindow(QueryGadget(winMain, QUERY_HWND))
SetFocus(QueryGadget(winMain, QUERY_HWND))

ActivateGadget(winMain)
ActivateGadget(SearchingField)
removeTrayIcon()
EndIf


Wie gesagt poppt das Fenster auf und blink die ganze Zeit, bekommt aber keinen Fokus.
Ich teste das ganze unter Windows 7, 64 bit.

Habt ihr ne Idee was Ich noch versuchen könnte?
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

BtbN

BeitragDo, Jul 14, 2011 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist zum glück nicht so ohne weiteres möglich. So ein plötzlich den fokus klauendes fenster ist nämlich sehr nervig.

Xeres

Moderator

BeitragDo, Jul 14, 2011 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht so ganz das Problem. Wenn ich ein Fenster & Textfeld erstelle, liegt das problemlos vor dem Parent [MaxGUI].

Edit: Dialogfenster erscheint vor dem Main Window und das Textfeld ist ausgewählt.
BlitzMax: [AUSKLAPPEN]
SuperStrict

Import maxgui.Drivers

Global MAIN_window:TGadget = CreateWindow("Main Window", (DesktopWidth() / 2) - 128, (DesktopHeight() / 2) - 128, 256, 256)
Global Button:TGadget = CreateButton("Test", 24, MAIN_window.height / 4, 196, 64, MAIN_window)

Repeat
WaitEvent()
Select EventID()
Case EVENT_APPTERMINATE, EVENT_WINDOWCLOSE
End
Case EVENT_GADGETACTION
If EventSource() = Button Then
Button_Dialog()
EndIf
End Select
Forever

Function Button_Dialog()
DisableGadget(MAIN_window)
Local window:TGadget = CreateWindow("Text eingeben:", MAIN_window.GetXPos(), MAIN_window.GetYPos(), 264, 180,, WINDOW_TITLEBAR)
Local textField:TGadget = CreateTextField(4, 4, 240, 24, window)
SetGadgetText(textField, GadgetText(Button))
Local CloseButton:TGadget = CreateButton("OK", window.ClientWidth() / 2 - 32, ..
window.ClientHeight() - 32, 64, 32, window, BUTTON_OK)
ActivateGadget(textField)

Local quitthis:Int
Repeat
Select WaitEvent()
Case EVENT_GADGETACTION
Select EventSource()
Case CloseButton

SetGadgetText(Button, GadgetText(textField))

FreeGadget(CloseButton)
FreeGadget(textField)
FreeGadget(window)
EnableGadget(MAIN_window)
SetWindowPos(QueryGadget(MAIN_window, QUERY_HWND), 1, ..
MAIN_window.GetXPos(), MAIN_window.GetYPos(), ..
MAIN_window.GetWidth(), MAIN_window.GetHeight(), 0)
quitthis = True
End Select
End Select
Until quitthis
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mas93

BeitragDo, Jul 14, 2011 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja in deinem Beispiel funktioniert das..
Nur möchte ich gerade ein Programm schreiben, mit dem ich viele andere Programme starten kann.
Und diesen "App-Starter" möchte ich mit einer Tastenkombination aufpoppen lassen..

Habe ich jetzt vorher, aber zum Beispiel mit meinem App starter Firefox mit Google aufgerufen und möchte dann das Fenster erneut aufpoppen lassen, bekommt das Textfeld keinen Fokus und das oben geschilderte Problem entsteht..

@Btbn das ist mir schon klar, nur deswegen habe ich ja nicht gefragt. Bei meinem Programm will schließlich der User, dass das Fenster sich in den Vordergrund drängt.. Daher die Frage ob es dafür einen Workaround gibt.

Trotzdem vielen Dank schonmal an euch beide!
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]
 

Guamtmsou G.

BeitragDo, Jul 14, 2011 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Ich verstehe nicht so ganz das Problem. Wenn ich ein Fenster & Textfeld erstelle, liegt das problemlos vor dem Parent [MaxGUI].


and whitout maxgui? or using maxgui on a d3d window?

Code: [AUSKLAPPEN]
Graphics 300,300
delay(10000)
setfocusnewfunction()
delay(10000)


there is some way to write setfocusnewfunction() using something like mas93 code?

Xeres

Moderator

BeitragFr, Jul 15, 2011 0:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhh. Meistens funktioniert der Wechsel problemlos, ganz selten bekomme ich das im-Hintergund-blinken Ergebnis.
BlitzMax: [AUSKLAPPEN]
SuperStrict

Import maxgui.Drivers

Global MAIN_window:TGadget = CreateWindow("Main Window", (DesktopWidth() / 2) - 128, (DesktopHeight() / 2) - 128, 256, 256)
Local textField:TGadget = CreateTextField(4, 4, 240, 24, MAIN_window)
SetGadgetText(textField, "---")

Delay(2000)
OpenURL("http://www.google.com")
Delay(2000)
Local HWND:Int = QueryGadget(MAIN_window, QUERY_HWND)

SetForegroundWindow(HWND)
ActivateGadget(textField)

Repeat
WaitEvent()
Select EventID()
Case EVENT_APPTERMINATE, EVENT_WINDOWCLOSE
End
End Select
Forever
End


@Guamtmsou G.
Do you have an example code? How do you get the hwnd id without MaxGUI?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mas93

BeitragFr, Jul 15, 2011 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres Ja bei mir tritt es auch nur manchmal auf, aber das will ich nun halt irgendwie verhindern.
Habt ihr keine Idee wie ich das eventuell mit der Winapi lösen könnte?

Ein andere Workaround wäre eventuell einen Mausklick auf mein Fenster zu simulieren und es somit zu aktivieren.
Ich bin mir aber nicht sicher ob das funktioniert.

Das Hwnd bekommt man übrigens so:
BlitzMax: [AUSKLAPPEN]
QueryGadget(winMain, QUERY_HWND)

winMain ist hier das Fenster Gadget handle
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Xeres

Moderator

BeitragFr, Jul 15, 2011 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
msdn - SetForegroundWindow Function
Zitat:
An application cannot force a window to the foreground while the user is working with another window. Instead, Windows flashes the taskbar button of the window to notify the user.

Wenn man im falschen Moment über ein Menü fährt, wird das Fenster nicht in den Vordergrund gebracht.
Da es ja in 95% der Fälle funktioniert, könntest du es einfach mehrmals versuchen...
BlitzMax: [AUSKLAPPEN]
SuperStrict

Import maxgui.Drivers

Extern "Win32"
Function GetForegroundWindow:Int()
End Extern

Global MAIN_window:TGadget = CreateWindow("Main Window", (DesktopWidth() / 2) - 128, (DesktopHeight() / 2) - 128, 256, 256)
Local textField:TGadget = CreateTextField(4, 4, 240, 24, MAIN_window)
SetGadgetText(textField, "---")

Delay(2000)
OpenURL("http://www.google.com")
Delay(2000)
Local HWND:Int = QueryGadget(MAIN_window, QUERY_HWND)
Local re_HWND:Int

For Local i:Int = 0 Until 5
SetForegroundWindow(HWND)
Delay(10)
re_HWND = GetForegroundWindow()
If HWND = re_HWND Then Exit
Delay(250)
Next

ActivateGadget(textField)

Repeat
WaitEvent()
Select EventID()
Case EVENT_APPTERMINATE, EVENT_WINDOWCLOSE
End
End Select
Forever
End

Funktioniert super, auch wenn ich über einem Menü herum kreise.

Das man mit QueryGadget das HWND handle bekommt weiß ich - aber das ist eine MaxGUI Funktion, Guamtmsou schien ja nicht damit zu arbeiten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mas93

BeitragSa, Jul 16, 2011 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres also ich habe dein Beispiel jetzt mal ausprobiert, aber bei mir hat es kein einziges mal funktioniert..

Auf was für einem System arbeitest du?
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Xeres

Moderator

BeitragSa, Jul 16, 2011 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Siehe Signatur. Du könntest noch probieren, das Fenster auf Always on Top zu schalten bevor du etwas startest.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mas93

BeitragSa, Jul 16, 2011 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
wie schalte ich das Fenster auf Always on Top?

Edit: Okay das Problem ist nach wie vor einfach, dass das Fenster zwar aufpoppt und vorne ist, jedoch blinkt und das Textfield keinen Fokus hat..
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group