 |
JLI Spieleprogrammierung
|
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
|
Verfasst am: 11.11.2005, 17:29 Titel: Dialogfeldproblem |
|
|
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 |
|
 |
OLiver Super JLI'ler

Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 11.11.2005, 17:41 Titel: |
|
|
Evtl. bei der MessageBox beim Parent-Window NULL statt dem Dialog angeben? _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 11.11.2005, 18:10 Titel: |
|
|
Hi!
Zeigmal deine Message Handler Funktion... Bzw, wo updatest du denn deinen Timer?
grüße |
|
Nach oben |
|
 |
fast hawk Senior JLI'ler

Anmeldedatum: 15.07.2005 Beiträge: 237 Wohnort: Freiburg Medaillen: Keine
|
Verfasst am: 11.11.2005, 20:24 Titel: |
|
|
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 |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 11.11.2005, 21:19 Titel: |
|
|
Irgendwas stimmt an deinem Programm nicht, es scheint als würde die MessageLoop nicht "von alleine" laufen.
C. |
|
Nach oben |
|
 |
KI JLI Master

Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 11.11.2005, 22:22 Titel: |
|
|
Es ist wirklich ein seltsames Problem.
Hier ein bisschen Code (kein schöner Code ):
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 |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 11.11.2005, 22:44 Titel: |
|
|
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 |
|
 |
KI JLI Master

Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 11.11.2005, 22:53 Titel: |
|
|
Aha 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.  |
|
Nach oben |
|
 |
|
|
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
|