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 :D

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...)