JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=05228b01c40684d92a0bff8df83f66d2Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Dialogfeldproblem

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 11.11.2005, 17:29    Titel: Dialogfeldproblem Antworten mit Zitat

Hallo.

Das Hauptfenster meines Programms (und auch das einzige) lade ich als Dialogfeldressource. CreateDialog...

Das Programm ist sozugagen ein Timer dafür wann der Comouter sich von alleine runterfahren soll. Ich habe jetzt testweise an die Stelle des Programms, wo eigentlich InitiateSystemShutdown hinkommt, eine MessageBox hingemacht.

Folgendes Problem:
Ich stelle den Timer auf 1 Minute und gehe weg vom Comuter.
Doch nach 2 Minuten kommt immernoch nicht die MessageBox, obwohl das Fenster aktiviert ist. In dem Moment, wo ich mit dem Cursor über das Fenster fahre erscheint die MessageBox plötzlich.

Genauso verhält es sich mit der Funktion InitiateSystemShutdown.

Was kann ich tun, damit das Programm ordungsgemäß funktioniert und z.B. nach einer Minute den SystemShutdown Prozess einleitet?

Schonmal danke für die Hilfe.

P.s. Win32 Programm mit Nachrichtenschleife und MessageHandler. Ganz simpel.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 11.11.2005, 17:41    Titel: Antworten mit Zitat

Evtl. bei der MessageBox beim Parent-Window NULL statt dem Dialog angeben?
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 40
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 11.11.2005, 18:10    Titel: Antworten mit Zitat

Hi!

Zeigmal deine Message Handler Funktion... Bzw, wo updatest du denn deinen Timer?

grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
fast hawk
Senior JLI'ler



Anmeldedatum: 15.07.2005
Beiträge: 237
Wohnort: Freiburg
Medaillen: Keine

BeitragVerfasst am: 11.11.2005, 20:24    Titel: Antworten mit Zitat

Hi

wäre mal gut wenn du sagst mit was du die Zeit misst und ein bischen Code.
Wenn du es mit der Windows Message WM_TIMER machst kann es schon sein das du da dein Programm blockierst oder du blockierst es über die Nachrichtnschleife.
Das erst wenn die Message WM_MOUSEMOVE kommt es weiter läuft und solang steht wie du weg bist.
Das geht dann aber nur wenn du es mit was anderem wie der WM_TIMER Nachricht machst.
Post halt mal ein bisschen Code.

mfg
fast hawk
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 11.11.2005, 21:19    Titel: Antworten mit Zitat

Irgendwas stimmt an deinem Programm nicht, es scheint als würde die MessageLoop nicht "von alleine" laufen.

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 11.11.2005, 22:22    Titel: Antworten mit Zitat

Es ist wirklich ein seltsames Problem.

Hier ein bisschen Code (kein schöner Code Wink):

Ich hoffe ihr versteht mein Timersystem. Ich hole einfach per GetTickCount() die Zeit und gucke wieviel davon vergangen ist, seit dem letzten Mal. nach 60000 Millisekunden wird MinutesToWait um 1 kleiner.
CPP:
//////////////////////////////////////////////////
// Kern-Funktionen und GUI
//////////////////////////////////////////////////

#include "stdinc.h"

BOOL CALLBACK MessageHandler(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void          OnInitDialog(HWND hDlg);
void          OnClose(HWND hDlg);
void          OnGo(HWND hDlg); // Knopf um den "Timer" zu starten


int MinutesToWait = -1;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
   // Initialisierung der "CommonControls"
   InitCommonControls();

   // Dialog öffnen
   HWND hwnd = CreateDialog(
      hInstance,
      MAKEINTRESOURCE(ID_MAIN),
      NULL,
      MessageHandler);
   
   // Nachrichtenschleife
   MSG msg;

   DWORD OneMinute = 0;
   DWORD TempTime  = 0;

   ZeroMemory(&msg, sizeof(MSG));

   do
   if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
   {
      if(MinutesToWait != -1)
      {   
         if(OneMinute == 0)
            TempTime = GetTickCount() - 1;

         OneMinute = GetTickCount() - TempTime;
         if(OneMinute >= 60000 || MinutesToWait == 0)
         {
            if(MinutesToWait > 0)
               MinutesToWait--;

            TempTime = GetTickCount();
            if(MinutesToWait == 0)
            {
               MinutesToWait = -1;

               // Hier kommt jetzt das SystemShutdown-Zeug
               // einfach aus der MSDN kopiert
               /***********************************************/
               HANDLE hToken;               // handle to process token
               TOKEN_PRIVILEGES tkp;        // pointer to token structure

               BOOL fResult = 0;            // system shutdown flag

               // Get the current process token handle so we can get shutdown
               // privilege.

               if (!OpenProcessToken(GetCurrentProcess(),
               TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
               {
                  MessageBox(NULL, "InitiateSystemShutdown verursachte einen Fehler", "Fehler [1]", MB_ICONSTOP |MB_OK);
                  return 0;
               }

               // Get the LUID for shutdown privilege.

               LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
               &tkp.Privileges[0].Luid);

               tkp.PrivilegeCount = 1;  // one privilege to set   
               tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

               // Get shutdown privilege for this process.

               AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
               (PTOKEN_PRIVILEGES) NULL, 0);

               // Cannot test the return value of AdjustTokenPrivileges.

               if (GetLastError() != ERROR_SUCCESS)
               {
                  MessageBox(NULL, "InitiateSystemShutdown verursachte einen Fehler", "Fehler [2]", MB_ICONSTOP |MB_OK);
                  return 0;
               }

               // Display the shutdown dialog box and start the countdown.

               //fResult = InitiateSystemShutdown(NULL, "Bis dann!", 10, IsDlgButtonChecked(hwnd, IDC_FORCESHUTDOWN) == BST_CHECKED, FALSE);
               // an dieser Stelle kommte jetzt eine MessageBox anstatt InitiateSystemShutdown
               MessageBox(NULL,"Ich bin eine MessageBox", "Tadaaa", MB_OK); // ??? merkwürdiges Verhalten

               if (!fResult)
               {
                  MessageBox(NULL, "InitiateSystemShutdown verursachte einen Fehler", "Fehler [3]", MB_ICONSTOP |MB_OK);
                  return 0;
               }
                  
               // Disable shutdown privilege. 
               tkp.Privileges[0].Attributes = 0;
               AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
                     (PTOKEN_PRIVILEGES) NULL, 0);
               /***********************************************/
            }
         }
      }
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   while(msg.message != WM_QUIT);

   // Everything that has a beginning has an end, Neo.
   return static_cast<int>(msg.wParam);
}


CPP:
BOOL CALLBACK MessageHandler(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   switch(uMsg)
   {
   case WM_INITDIALOG:
      OnInitDialog(hDlg);
      break;

   case WM_CLOSE:
      OnClose(hDlg);
      break;

   case WM_DESTROY:
      PostQuitMessage(EXIT_SUCCESS);
      break;

   case WM_COMMAND:
      switch(LOWORD(wParam))
      {
      case IDC_START:
         OnGo(hDlg);
         break;

      default:
         return FALSE;
      }
      break;

 
   default:
      return FALSE;
   }

   return TRUE;
}


Restlicher Code:
CPP:
void OnInitDialog(HWND hDlg)
{
   // Handle des Textfeldes holen
   HWND hEdit  = GetDlgItem(hDlg, IDC_MINUTES);

   SendMessage(hEdit, EM_SETLIMITTEXT, 4, 0);
}

void OnClose(HWND hDlg)
{
   // Nervende Meldung ausgeben
   if(MessageBox(
      hDlg,
      "Gibt es einen triftigen Grund, dieses Programm schon zu beenden?",
      "Frage",
      MB_YESNO|MB_ICONQUESTION) == IDYES)
   {
      // Dialog schließen
      DestroyWindow(hDlg);
   }
}

void OnGo(HWND hDlg)
{
   EnableWindow(GetDlgItem(hDlg, IDC_MINUTES),FALSE);
   EnableWindow(GetDlgItem(hDlg, IDC_FORCESHUTDOWN), FALSE);
   EnableWindow(GetDlgItem(hDlg, IDC_START), FALSE);
   MinutesToWait = GetDlgItemInt(hDlg, IDC_MINUTES,NULL, FALSE);
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 11.11.2005, 22:44    Titel: Antworten mit Zitat

PeekMessage gibt 0 zurück, wenn KEINE Messages vorliegen. Wie soll sich auch was tun, wenn du if(0) fragst? Es kommen erst dann Messages, wenn du die Maus bewegst und das Fenster Nachrichten bekommt...

Warum so eine komplizierte Routine, für so ein einfaches Problem, warum nicht WM_TIMER?

C.


Zuletzt bearbeitet von Christian Rousselle am 11.11.2005, 23:03, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 11.11.2005, 22:53    Titel: Antworten mit Zitat

Aha Very Happy Klar

Jetzt verstehe ich das. Vorher hatte ich GetMessage drin. Da ist das Problem, das erst ein Wert zurückgegeben wird, wenn eine neue Nachricht vorhanden ist und somit nur bei einer neuen Nachricht die Schleife betreten wird.

Zitat:

Warum so eine komplizierte Routine, für so ein einfaches Problem

Das frage ich mich auch grade. WM_TIMER ist viel praktischer. Danke. Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum