Seite 1 von 3
Desktop oder 3D Game
Verfasst: 10.10.2004 12:12
von Smash
Hallo all,
Gibt es eine Möglichkeit herauszufinden,
ob der sichtbare Bildschirm grade vom Desktop verwendet wird
oder ob ein anderes Programm den Bildschirm benutzt.
Ungefähr so wie hier mit dem Arbeitsplatz!
Oder geht das sogar einfacher.
Code: Alles auswählen
Repeat
hWnd = FindWindow_(0, "Arbeitsplatz") ;Desktop
If hWnd
Beep_(100,100)
Delay(1000)
EndIf
Delay(10)
Until hWnd = 0
Debug "Der Arbeitsplatz (Desktop) ist nicht (mehr) sichtbar"
End
Verfasst: 10.10.2004 13:43
von nco2k
hi Smash,
ich versteh zwar nicht 100%ig was du meinst...
aber versuch mal sowas:
Code: Alles auswählen
If OpenWindow(0, 0, 0, 320, 240, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Test") = #False
MessageRequester("Test", "Error", #MB_ICONERROR)
End
EndIf
Repeat
If GetForegroundWindow_() = WindowID(0)
Debug "Aktiv"
Else
Debug "Inaktiv"
EndIf
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
End
oder als prozedur:
Code: Alles auswählen
Procedure IsWindowActive(WindowID.l)
If GetForegroundWindow_() = WindowID
Result = #True
Else
Result = #False
EndIf
ProcedureReturn Result.l
EndProcedure
If OpenWindow(0, 0, 0, 320, 240, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Test") = #False
MessageRequester("Test", "Error", #MB_ICONERROR)
End
EndIf
Repeat
If IsWindowActive(WindowID(0)) = #True
Debug "Aktiv"
Else
Debug "Inaktiv"
EndIf
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
End
oder für den vollbild-modus:
Code: Alles auswählen
If InitSprite() = #False Or InitKeyboard() = #False Or OpenScreen(640, 480, 16, "Test") = #False
MessageRequester("Test", "Error", #MB_ICONERROR)
End
EndIf
Repeat
FlipBuffers()
ClearScreen(0, 0, 0)
If IsScreenActive() = #True
Debug "Aktiv"
Else
Debug "Inaktiv"
EndIf
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
ForEver
End
hast du das gesucht?!
p.s.: das mit dem "Arbeitsplatz" würde ich nie machen, da es menschen da draussen gibt, die kein deutschsprachiges windows besitzen.
p.p.s.: fred sollte meiner meinung nach, unbedingt IsWindowActive(WindowID.l) einbauen.
c ya,
nco2k
Verfasst: 10.10.2004 15:29
von Smash
Hallo nco2k,
Ich glaub zwar damit ist mir noch nicht wirklich geholfen.
(Die Codes lass ich mir aber nochmall durch den Kopf gehen.)
Danke für den Riesen Aufwand.
War glaub ich wirklich ein bisschen dämlich beschrieben.
Zum besseren Verständnis.
Mein Programm soll einschlafen, sobald ein Spiel gestartet wird.
Und wenn das Spiel wider beendet wird soll mein Programm wider aufwachen.
Auf die einfachste Möglichkeit ein Problem zu schildern
kommt man manchmal erst etwas später.
Verfasst: 10.10.2004 17:41
von nco2k
hmm... mir fallen da nur noch die drei sachen ein:
Code: Alles auswählen
RunProgram()
GetWindowThreadProcessId_()
GetExitCodeProcess_()
schau mal im alten forum und im codearchv nach, da findest du mehr infos darüber, wie man das am sinnvollsten verwendet.
c ya,
nco2k
Verfasst: 10.10.2004 22:02
von Smash
RunProgram() GetWindowThreadProcessId_() GetExitCodeProcess_()
Damit kann ich wohl auch nichts anfangen
Dachte ich hab die Lösung.
War wohl wider nichts!
Code: Alles auswählen
Repeat
DeskID = GetDesktopWindow_()
Debug IsWindowVisible_(DeskID)
Delay(200)
ForEver
IsWindowVisible (Sichtbarkeitszustand des angegebenen Fensters)
erkennt leider nicht das ein (z.B. Spiel)
gestartet wurde, und den Desktop bedeckt.
Mit GetForegroundWindow_()
Kann ich leider auch nichts anfangen.
Da ich nicht wissen kann welche Fenster ID
Dem Spiel zugewiesen wurde.
Verfasst: 12.10.2004 19:27
von pg
Du könntest feststellen ob dein 3D Game schon am laufen ist und
die entsprechende Aktion durchführen
Code: Alles auswählen
;im Spiel
CreateMutex_(0, #TRUE, "Mein3DProgi");
;im anderen Programm
CreateMutex_(0, #TRUE, "Mein3DProgi");
If (GetLastError_() =183)
MessageRequester("Hallo","3D Progi ist schon am laufen")
EndIf
;wenn das Spiel nicht mehr aktiv ist-> GetLastError_() ist nicht mehr 183
Habs so nicht getestet, sollte aber funktionieren
Verfasst: 12.10.2004 23:43
von Smash
Hallo pg,
Danke, dass du versuchst zu helfen.
Aber auch das bringt mich nicht weiter.
Na dann versuch ich das Problem nocheinmall zu beschreiben.
Mein in PB geschriebenes Programm soll ununterbrochen arbeiten.
Sobald ich allerdings ein Spiel Starte. (heute das eine und morgen ein anderes.)
Soll mein Programm einschlafen.
Und erst wider aufwachen sobald ich ein Spiel verlassen habe.
Ich hoffe dass ich mit irgendeiner DirectX API eine Möglichkeit finde.
Aber da kenn ich mich noch nicht so aus.
Na ja sollte ich ne Lösung finden lasse ich es euch wissen.
Verfasst: 13.10.2004 10:56
von nco2k
sorry aber woher willst du wissen, ob es überhaupt ein spiel ist?! genauso gut könnte es doch auch ein programm sein, welches directx verwendet. was machst du wenn das neue windows betriebssystem directx befehle für fenster und co. effekte verwendet?? ausserdem gibt es auch spiele die auf opengl zugreifen oder was ganz anderes, oder auch garnichst. das was du dir vorgenommen hast ist sehr sehr schwer, wenn nicht sogar unmöglich?! wünsch dir dennoch noch viel erfolg, bei deinem vorhaben. solltest du mal eine lösung finden, kannst sie ja hier posten.
c ya,
nco2k
Verfasst: 13.10.2004 11:17
von PureBaser
Ich kenn mich noch weniger als du in der Programmierung aus

aber,
wie geht nicht so, dass du kontrollieren kannst, ob dein Proggie in erster Instanz arbeitet? Und wenn es merkt, das es im Pausenmodus ist, einfach die Pause/Einfrieroption nutzen?! Lass mich raten: Du spielst gerne Doom³ übers 'Net und möchtest während dessen deine Firewall ausgeschaltet haben

Verfasst: 13.10.2004 15:45
von SirCus
also ich geh mal davon aus dass IMMER wenn Vollbildmodus für IRGENDEINE Anwendung aktiv ist, sein Programm in sleep-Modus gehen soll, wie immer er das definiert.
Also denke ich seine frage lautet: wie stelle ich fest ob IRGENDEINE Anwendung im Momnt Vollbildmodus nutzt.
(was natürlich auch der Screensaver sein könnte...)