[C] swich mit Wort

Soll sich dieses Programm selber in den Autostart schreiben, oder willst du ein Programm machen das andere Programme in den Autostart schreibt?
 
Hier dein Code:
Code:
#include <stdio.h>
#include <windows.h>

BOOL MakeAutostart( char *name, char *Value )
{
	HKEY hkey;
	HKEY key = HKEY_LOCAL_MACHINE; 
	char place[] = {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"};

	if( (RegOpenKeyEx(key, place,0, KEY_ALL_ACCESS,&hkey)) != ERROR_SUCCESS )
		return FALSE;

	if( (RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)Value, strlen(Value))) != ERROR_SUCCESS )
		return FALSE;

	if( (RegCloseKey(hkey)) != ERROR_SUCCESS )
		return FALSE;

	return TRUE;
}

int main( int argc, char **argv )
{
	char Name[] = {"Passwortschutz"};          // Der name ist beliebig wählbar.
	char *Value = *argv;			   // Hier kommt der Pfad der Datei rein die in den Autostart geschrieben werden soll.
						   // Da in *argv der Pfad des aktuellen Programms steht, kommt das hier hin.

	if( !MakeAutostart( Name, Value ) )
	{
		printf("ERROR - Unable to create Autostart key!\n");
	}

	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) && (strcmp(name , "Moritz") == 0))
		{
			printf("\nHerzlich willkommen %s\n", &name);
			Sleep(1000);/*macht eine pause für 1s = 1000ms*/
		}
		else
		{
			printf("\n\aBenutzername oder Passwort falsch!\n\n");
			Sleep(1000);
			system("cls");/*löscht den vorigen Prozess,sodass es aussieht ob es von vorne startet*/
		}

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

Es wird jetzt nur das Programm in den Autostart geschrieben, jedoch nicht mehr gelöscht.
Du müsstest dann mit der Hand den Key wieder aus dem Autostart löschen.

Edit:
Damit es compiliert musst du in den Projekt Einstellungen vom Visual Studio auf Multi-Byte stellen wo normalerweise Unicode steht.

Gruß
BlackMark
 
Zuletzt bearbeitet:
es funktioniert nicht. Was muss ich im code anpassen?. Oder muss ich gar nichts anpassen. Weil eben geht es nicht. 2 Fehler treten auf.
Hast du was verwechselt mit C und C++ ??
 
Zuletzt bearbeitet:
Wie ich schon gesagt habe musst du in den Projekt Einstellungen auf Multi-Byte stellen.
Oben in der Leiste auf Projekt -> "Projekt Name" Einstellungen -> Konfigurations Einstellungen -> Dann steht irgend wo Unicode und da stellst du auf Multi-Byte

Ich hab das Visual Studio auf englisch, deswegen weiß ich nicht genau wie die sachen auf deutsch heißen ^^

Edit:
Hast du was verwechselt mit C und C++ ??
Nein das Visual Studio hat einen C++ compiler, deswegen würde auch C++ code gehen, obwohl meiner nur C ist.

Gruß
BlackMark
 
Zuletzt bearbeitet:
Ist das der Zeichensatz den du meinst, wenn ja dann geht es immer noch nicht. Wenn nein dann weiß ich was du meinst bzw. ich finde es nicht ich verwende 2008
 
Auf Englisch heißt es Character-Set also wird es auf Deutsch der Zeichensatz sein.
Ich verwende ebenfalls das Visual Studio 2008.

Wie lauten den die Fehlermeldungen wenn du auf Multi-Byte gestellt hast?
 
Es geht jetzt. Nur das Problem beim Programm steht "Error - Unable to create Autostart key"

was jetzt??

In der registry wird es auch nicht angezeigt.
 
Zuletzt bearbeitet:
Hmm, das einzige was mir einfallen würde wäre, dass Vista die Autostart Keys wo anders in der Registry liegen hat als XP.

Man müsste also schauen wo die bei Vista sind.
Bei XP liegen die in der Registry auf: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

Schau mal ob es die bei Vista auch da gibt.
 
ja das gibt es bei Vista auch. Soweit ich weiß hat sich da nicht geändert zwischen XP und Vista.
 
Was noch sein kann ist, dass Vista oder ein Virenscanner es nicht zulassen, dass das Programm einen Key in den Autostart schreibt. Villeicht mal das Programm als Administrator ausführen und den Virenscanner ausschalten.
 
Super es hat funktioniert. Ich das Programm als Admin ausgeführt. Weißt wie man sich das erspart oder soll ich googlen und wenn ich nichts finde ein neues Thema aufmachen?
 
Ja unter den Benutzer Konto einstellungen gibts nen Punkt namens UAC ( User Account Control ) und wenn du den ausstellst brauchst das nicht mehr.
 
Das bringt mir auch nicht viel. Wenn irgendjemand sich mal ein Programm download, weiß der ja nicht das man es als Admin ausführen muss. Gibt es die möglichkeit das auch in dem Programm zu machen ??
Ist auch erstmal nicht so wichtig!

1)Wie löscht man den Eintrag wieder? Es reicht wenn kein Beispiel dabei ist ich denke ich verstehe es.
2)Wie kann man Verhindern, das der Benutzer das Programm über x nicht beenden kann?
 
Zuletzt bearbeitet:
So zimlich alles ist möglich nur ist das problem, dass dieses UAC ja nicht um sonst da ist.
Microsoft ist sicher nicht so blöd eine Sicherung einzubauen die dann ganz einfach von einem Programm umgangen werden kann.

Wenn es möglich ist, dann ist es sicherlich nicht so leicht.

Aber ich kann mich auch irren.

Google es einfach mal!
 
Probier doch mal statt HKEY_LOCAL_MACHINE HKEY_CURRENT_USER. Dann bezieht sich der Autostart-Eintrag auf das Userkonto des ausführenden Users. HKEY_LOCAL_MACHINE geht eben auf den ganzen Rechner und braucht daher Adminrechte.
 
@BerniG
Danke so hat es funktioniert.So reicht es auch.

Noch zwei Fragen hätte ich:

1)Wie löscht man den Eintrag wieder? Es reicht wenn kein Beispiel dabei ist ich denke ich verstehe es.
2)Wie kann man Verhindern, das der Benutzer das Programm über x nicht beenden kann?
Das Programm soll sich nur schließen, wenn es zu ende ist. Der Benutzer soll es nicht selber schließen können.
 
1. Schau dir den Code in Post Nummer 28 an.
Dort ist eine Funktion namens DeleteReg und diese löscht einen Key aus der Registry.

2. Das ist gar nicht so leicht, du musst nämlich beim Fenster verhindern, dass eine Message an Windows gesendet wird wenn der Benutzer das X drückt.
Bei einem selbst erstellten Fenster ist das nicht so schwer, aber bei einem vom Betriebssystem erstellten, und das Consolen Fenster ist vom Betriebssystem, ist das nicht so leicht.
Ich weiß auf anhieb jetzt nicht wie man das machen könnte, aber ich werde Morgen mal schauen ob ich das schaffe.

Gruß
BlackMark
 
hi,

Wie kann man Verhindern, das der Benutzer das Programm über x nicht beenden kann?

Zum Verständnis: Der X-Button ist einem Menü (Systemmenü) zugeordnet, dass du dir anzeigen lassen kannst in dem du z.B. in der Titelleiste des Konsolenfensters die rechte Maustaste drückst.

Wenn du also den X-Button deaktivieren willst, musst du den entsprechenden Menüpunkt deaktivieren. Da es einfacher ist, wird im folgendem der Menüeintrag mittels DeleteMenu() gelöscht (ansonsten müsste man halt mit SetMenuItemInfo () arbeiten):


Code:
...
    char buffer[256];
    GetConsoleTitle(&buffer[0],256);
    DeleteMenu(GetSystemMenu(FindWindowEx(0,0,0,&buffer[0]),FALSE),6,MF_BYPOSITION);
    // weitere Werte(Positionen)
    // 0 = restore
    // 1 = move
    // 2 = change size
    // 3 = minimize
    // 4 = maximize
    // 5 = seperator in menu
    // 6 = close -> X-Button
    // ...
...

Der X-Button ist danach zwar noch sichtbar, aber ohne Funktion.
 
Zuletzt bearbeitet:
Jop, genau so geht es.

Es geht jedoch auch einfacher, es gibt die Funktion GetConsoleWindow, damit erspart man sich das FindWindowEx.
Dann braucht man nur noch eine Zeile und spart sich ein wenig Code:
Code:
DeleteMenu(GetSystemMenu(GetConsoleWindow(),FALSE),6,MF_BYPOSITION);
Außerdem ist es übersichtlicher und man hat auch nicht mehr das Problem mit char und LPCWSTR und so weiter.

Gruß
BlackMark
 
Zuletzt bearbeitet:
Zurück
Oben