Desktop oder 3D Game

Für allgemeine Fragen zur Programmierung mit PureBasic.
Smash
Beiträge: 23
Registriert: 10.10.2004 00:09

Desktop oder 3D Game

Beitrag 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 
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
Smash
Beiträge: 23
Registriert: 10.10.2004 00:09

Beitrag 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.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
Smash
Beiträge: 23
Registriert: 10.10.2004 00:09

Beitrag 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.
pg
Beiträge: 18
Registriert: 03.10.2004 22:35

Beitrag 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
Smash
Beiträge: 23
Registriert: 10.10.2004 00:09

Beitrag 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.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
Benutzeravatar
PureBaser
Beiträge: 180
Registriert: 08.09.2004 21:20
Wohnort: Berlin
Kontaktdaten:

Beitrag 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 :D
Benutzeravatar
SirCus
Beiträge: 182
Registriert: 10.09.2004 11:44
Wohnort: München
Kontaktdaten:

Beitrag 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...)
2D Game H.E.R.A. (Entwicklung eingefroren)
www.chamaeleo-fx.de.vu

- mein Lieblingszitat
"die Informationsumwelt wird von einer fürchterlichen Menge an Unsinn und Lügen verschmutzt" (Stanislaw Lem, Lokaltermin, 1954 (!) )
http://www.stanislaw-lem.de/zitate/zitate.shtml
Antworten