[C] Dos-Fenster immer im Vordergrund

Murphy7

Ensign
Registriert
Mai 2008
Beiträge
135
Ich wollte ein Programm schreiben, was nicht wirklich nützlich ist, aber ich glaube zum Üben ganz nützlich.
1. Was muss ich machen, damit das Dos-Fenster immer im Vordergrund ist.
2. Wenn das Programm durch den Nutzer geschlossen, also nicht wenn es zu ende ist, wie kann ich dann den Pc runterfahren lassen:evillol::evillol:.

Mit dem Programm will ich ein paar Freunde verarschen ;).
Bevor irgendwelche Gerüchte auftreten, möchte ich gleich sagen, das ich mit dem Programm keinen Schaden will, ich will einen Spaß machen.
 
1. So bleibt das Fenster immer im vordergrund ( TOPMOST ):
Code:
#include <windows.h>
#include <iostream>
#include <conio.h>

void SetTopMost( HWND hWnd )
{
	RECT rect;

	GetWindowRect(hWnd, &rect);

	int posX	 = rect.left;
	int posY	 = rect.top;
	int width	 = rect.right - rect.left;
	int height	 = rect.bottom - rect.top;

	SetWindowPos( hWnd, HWND_TOPMOST, posX, posY, width, height, SWP_SHOWWINDOW );
}

int main ()
{
	HWND hConsole = GetConsoleWindow();

	SetTopMost(hConsole);

	std::cout << "Press any key to exit . . . ";
	_getch();
	return 0;
}

2. Du meinst wenn der Nutzer das X drückt?
Da müsstest du schauen wann im Fenster die Message für das X aufgerufen wird.
Kann dir da leider kein Code Beispiel geben, da ich das nicht auswendig im Kopf hab und momentan grad nicht viel Zeit um da nachzuschauen, villeicht kann dir da ja jemand anders helfen!

Gruß
BlackMark
 
Also zu 2teren bin ich mir ned ganz sicher, aber normal is ja am ende von nem Dos-Fenster immer so was in der Richtung:

system("PAUSE");
return EXIT_SUCCESS;

Wenn du nun vlt ne IF-Abfrage machst mit EXIT_FAILED(oder so, ka wie es genau heißt, mal googlen) könntest du diesen Befehl ausführn lassen, das er runter fährt

Sry für das ungenaue Wissen
 
Das was return macht hat nichts damit zu tun, return gibt nur einen fehler code zurück und EXIT_SUCCESS ist das gleiche wie 0 und heist das kein fehler aufgetreten ist.
Aber wenn man das X drückt wird nicht zu return gesprungen oder so was sondern der Prozess wird von Windows beendet, was bedeutet das es gar nie zu return kommt!

Gruß
BlackMark
 
@BlackMark

Ich versteh das irgendwie nicht so richtig könntest du es vielleicht in diesen Bsp anwenden

Code:
#include <stdio.h>

int main()
{
    char antwort[10];
    printf("Welches Land hat die meißten Einwohner?\nAntwort:"); /*die Frage*/
    scanf ("%s", &antwort);   /*s nimmt eine zeichenkette auf*/

    int L1;

    L1= "China";
    if(strcmp(L1, "China") == 0)
    {
        printf("\nrichtig\n");
    }
    else if(strcmp(L1, "USA") == 0)
    {
        printf("\nfalsch\n");
    }
    else
    {
        printf("\nfalsch");
    }

   printf("Antwort:%s", &antwort);
    return 0;
}
 
Oh, sorry hab übersehen das du in C schreibst, mein Code ist in C++.

Hier dein Code, sollte auch in C gehen, hab ihn nicht getestet, aber es sollte klappen:
Code:
#include <stdio.h>
#include <windows.h>

void SetTopMost( HWND hWnd )
{
	RECT rect;

	GetWindowRect(hWnd, &rect);

	int posX	 = rect.left;
	int posY	 = rect.top;
	int width	 = rect.right - rect.left;
	int height	 = rect.bottom - rect.top;

	SetWindowPos( hWnd, HWND_TOPMOST, posX, posY, width, height, SWP_SHOWWINDOW );
}

int main()
{
	HWND hConsole = GetConsoleWindow();
	SetTopMost(hConsole);

	char antwort[10];
	printf("Welches Land hat die meißten Einwohner?\nAntwort:"); /*die Frage*/
	scanf ("%s", &antwort);   /*s nimmt eine zeichenkette auf*/

	int L1;

	L1= "China";
	if(strcmp(L1, "China") == 0)
	{
		printf("\nrichtig\n");
	}
	else if(strcmp(L1, "USA") == 0)
	{
		printf("\nfalsch\n");
	}
	else
	{
		printf("\nfalsch");
	}

	printf("Antwort:%s", &antwort);
	return 0;
}
 
Es funktioniert leider nicht der compiler sagt undefinded refercence to '_ GetConsoleWindow'.
Was muss ich ändern ?

Code:
#include <stdio.h>
#include <windows.h>

void SetTopMost( HWND hWnd )
{
	RECT rect;

	GetWindowRect(hWnd, &rect);

	int posX	 = rect.left;
	int posY	 = rect.top;
	int width	 = rect.right - rect.left;
	int height	 = rect.bottom - rect.top;

	SetWindowPos( hWnd, HWND_TOPMOST, posX, posY, width, height, SWP_SHOWWINDOW );
}

int main()
{
    HWND hConsole = GetConsoleWindow();
	SetTopMost(hConsole);


    char antwort[10];
    printf("Welches Land hat die meißten Einwohner?\nAntwort:"); /*die Frage*/
    scanf ("%s", &antwort);   /*s nimmt eine zeichenkette auf*/


    if(strcmp(antwort, "China") == 0)
    {
        printf("\nrichtig\n");
    }

    else if(strcmp(antwort, "USA") == 0)
    {
        printf("\nfalsch\n");

    }

    else
    {
        printf("\nfalsch");

    }

   printf("Antwort:%s\n", &antwort);
   system( "pause" );
    return 0;
}
 
Das sagt der Linker und nicht der Compiler!

Du musst mit der user32.lib linken!
Ich weiß ja nicht mit welchem Compiler ( IDE ) du arbeitest, aber entweder du fügst bei den Linker einstellungen die user32.lib hinzu,
oder du fügst unter #include <windows.h> folgende Zeile ein:
#pragma comment ( lib, "user32.lib" )

Gruß
BlackMark
 
Das mit #pragma comment ( lib, "user32.lib" )
funktioniert leider auch nicht ich verwende CodeBlocks8.02 mit MinGW.
Ich google mal, wie ich die einstellungen ändern kann, danke für deine Hilfe.
 
Dann solltest du über die Projekt Einstellungen dem Linker sagen können mit welcher Library er linken soll.
Ja google mal...

Gruß
BlackMark
 
kleines Problem ich habe keine user32.lib datei muss die dabei sein oder kann ich die auch irgendwo downloaden?
 
Ich hätte mir schon erwartet, dass die beim compiler dabei ist, ansonsten kannst sie schon wo downloaden.

Gruß
BlackMark
 
Ich finde die Datei nicht. Im internet auch nichts. Könnte jemand die datei schnell bei rapidshare hochladen ??? Das wär echt net.
 
Schau mal ob du unter "C:\Programme\Microsoft SDKs\Windows" eventuell was hast,
ansonsten musst du dir das Microsoft SDK runter laden.

Gruß
BlackMark
 
Danke ich lade es runter, vielleicht ist das bei Vista nicht Standard mässig dabei.
Noch ein frage, weißt du wie man bei einer do-while Schleife bei einer wiederholung das vorige löscht. Also das im Dos-Fenste nicht immer alles doppelt angezeigt wird.
 
Nein da ist nicht Vista die schuld, ich hab es nur weil's beim Visual Studio dabei ist!

Das mit der do-while schleife verstehe ich nicht, was ist da doppelt?
Könntest du eventuell ein beispiel machen?

Gruß
BlackMark
 
Als Beispiel eine einfache Passwort abfrage:

Code:
#include <stdio.h>


int main()
{
    char name[10], passwort[10];
    do
    {

    printf("Willkommen an ihrem Pc!\nBitte Loggen Sie sich ein!\nBenutzername:");
    scanf ("%s", &name);
    printf("Passwort:");
    scanf("%s", &passwort);

   if(strcmp(passwort , "password") == 0)
   {
        printf("\nHerzlich willkommen %s\n", &name);
    
    }
     else
    {
        printf("\n\aBenutzername oder Passwort falsch!\n\n");
    }

    }
    while (strcmp(passwort , "password") != 0);
    return 0;
}

Wenn das Passwort falsch eingegen wurden würd alles wiederholt, nur das Problem ist das alles von dem ersten mal noch angezeigt. Ich will es so das es wie beim Start aussieht.
Ich hoffe du verstehst was ich meine
 
Zuletzt bearbeitet:
Ok ich verstehe was du willst.
Die einfachste Variante das zu machen ist: system("cls");
Zwar sollte man system vermeiden, aber mir fallt auf anhieb keine Alternative ein.

Gruß
BlackMark
 
Also nocht mal zum Thema Dos-Fenster im Hintergrund.
Ich habe alle Datein runtergeladen und habe auch die datei user32.lib zum linker hinzugefügt.
Nur es geht immer noch nicht hier nochmal den Code:
Code:
#include <stdio.h>
#include <windows.h>



void SetTopMost( HWND hWnd )
{
	RECT rect;

	GetWindowRect(hWnd, &rect);

	int posX	 = rect.left;
	int posY	 = rect.top;
	int width	 = rect.right - rect.left;
	int height	 = rect.bottom - rect.top;

	SetWindowPos( hWnd, HWND_TOPMOST, posX, posY, width, height, SWP_SHOWWINDOW );
}

int main()
{
    HWND hConsole = GetConsoleWindow();
	SetTopMost(hConsole);



    char antwort[10];
    printf("Welches Land hat die meißten Einwohner?\nAntwort:"); /*die Frage*/
    scanf ("%s", &antwort);   /*s nimmt eine zeichenkette auf*/


    if(strcmp(antwort, "China") == 0)
    {
        printf("\nrichtig\n");
    }

    else if(strcmp(antwort, "USA") == 0)
    {
        printf("\nfalsch\n");

    }

    else
    {
        printf("\nfalsch");


    }

   printf("Antwort:%s\n", &antwort);

    return 0;

}

Was muss ich ändern ?? Es kommt immer noch die gleiche Fehlermeldung wie vorher
 
Wenn der Linker wegen dem Befehl GetConsoleWindow jammert, dann musst du noch mit der Kernel32.lib linken!

Gruß
BlackMark
 
Zurück
Oben