[C] swich mit Wort

Super hat so funktioniert. Kann auch allgemein tastendrücke zu sperren wenn das Programm läuft?
Wie kann ein Passwort, das ich eingebe, bei der eingabe als Sternchen und Punkt erscheinnen?
 
Was verstehst du unter tastendrücke sperren?

So kann man ein passwort abfragen, so dass statt der eingabe Sternchen kommen:
Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
	char pass[100];
	memset( pass, 0, 100 );
	int i = 0;

	printf("Enter Password: ");

	pass[0] = _getch();
	while(pass[i]!=13)
	{
		i++;		
		printf("*");
		pass[i] = _getch();
	}

	printf("\n\nYou entered: %s\n", pass);

	return 0;
}

Gruß
BlackMark
 
Ich dachte an sowas das der Benutzer nicht strg-alt-entf drücken kann. Sodass er das Programm nicht im Taskmanger schließen. Könnt das mit Autostart doch nochmal in einem Beispiel erklären.
 
1. Ich weiß nicht ob das möglich ist, ich vermute jedoch, dass Windows es nicht zulassen würde, wenn man solche Tastenkombinationen blockiert.

2. Hier ein Beispiel wie man den Key wieder aus dem Autostart entfernt:
Code:
#include <stdio.h>
#include <windows.h>

BOOL DeleteAutostart( char *name, char *Value )
{
	HKEY hKey;
	HKEY key = HKEY_LOCAL_MACHINE;           // Bei Vista am besten HKEY_CURRENT_USER verwenden.
	char place[] = {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"};

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

	if( (RegDeleteValue(hKey, name)) != 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( !DeleteAutostart( Name, Value ) )
	{
		printf("ERROR - Unable to create Autostart key!\n");
	}

	return 0;
}

Gruß
BlackMark
 
Vielen Dank.

Weiß du wie man die Größe des Dos-Fenster ändern kann? Also das ist z.bsp. Fullscren ist.
 
Hier ein Beispiel wie man das Fenster verschiebt bzw. vergrößert/verkleinert und Fullscreen macht:
Code:
#include <windows.h>

void FullScreen( bool bFullScreen )
{
	typedef BOOL (WINAPI *PROCSETCONSOLEDISPLAYMODE)(HANDLE,DWORD,LPDWORD);
	typedef BOOL (WINAPI *PROCGETCONSOLEDISPLAYMODE)(LPDWORD);

	PROCSETCONSOLEDISPLAYMODE SetConsoleDisplayMode;
	PROCGETCONSOLEDISPLAYMODE GetConsoleDisplayMode;

	HMODULE hKernel32 = GetModuleHandle("kernel32");

	SetConsoleDisplayMode = (PROCSETCONSOLEDISPLAYMODE)
		GetProcAddress(hKernel32, "SetConsoleDisplayMode"); 

	GetConsoleDisplayMode = (PROCGETCONSOLEDISPLAYMODE)
		GetProcAddress(hKernel32, "GetConsoleDisplayMode");

	HANDLE hOut = ::GetStdHandle(STD_OUTPUT_HANDLE);

	DWORD dwOldMode;

	SetConsoleDisplayMode(hOut,bFullScreen,&dwOldMode);
}

int main()
{
	HWND hConsole = GetConsoleWindow();
	MoveWindow(hConsole, 0, 0, 500, 300, TRUE);		// Positioniert das Fenster

	FullScreen(true);			        	// true = FullScreen, false = Windowed

	return 0;
}

Bei MoveWindow sind die Parameter 2 & 3 die Koordinaten des Fensters und die Parameter 4 & 5 die Breite bzw. Höhe des Fensters.

Gruß
BlackMark
 
Ich denke, dass das jetzt zu weit geht. Das Sperren von Tastatureingaben und vielleicht sogar Loggen der Tastatureingaben geht eindeutig in Richtung Malware (und über einen normalen Scherz hinaus) und sollte nicht weiter unterstützt werden.
 
Ich gebe zu das blocken von Tastatureingaben übertrieben war. Aber nach loggen habe ich nie gefragt und hatte es auch nicht vor. Ich habe auch nicht vor Malware, trojaner, Viren... zu programmieren.

@BlackMark
Danke für deine Hilfe mit dem FullScreen.
War sowas wie Fullscreen und Autostart alles in der DVD erklärt die du mir empfohlen hast?
 
BlackMark schrieb:
Wo wurde denn bitte das Sperren oder Loggen von Tastatureingaben erklärt?
Er wollte es wissen, siehe oben. Außerdem hat er angesprochen, dass er mit dem Programm "ein paar Freunde erschrecken will". Dazu ist es aber sicherlich nicht nötig, hier nacheinander sich die Features zu erfragen, die man auch tatsächlich für Malware einsetzt (Autostart-Routinen, nicht Beenden bei Klick auf X, Sperren von Tastatureingaben usw.).

@Murphy7:
Als Einsteiger, der so grundlegende Sachen wie die Funktionsweise und Limitierungen des switch-Befehls nicht kennt, solltest du meiner Meinung nach erstmal sinnvollere Sachen üben (Rekursion, Sortieralgorithmen, Pointer). Insbesondere sind die hier eingesetzten Techniken Windows-spezifisch und kein reiner C-Standard. Nachdem du mit C einigermaßen zurecht kommst, solltest du dann auch eher zu objektorientierten Sprachen wie C++ (mit .NET) oder Java übergehen. Außer natürlich wenn du wirklich langfristig nur Lowlevel-Programme wie eben Malware schreiben willst :)
 
@BerniG:
Malware könnte man theoretisch schon aus einer einfachen Endlosschleife entstehen lassen.
Die Windows API bietet auch genug Möglichkeiten Maleware zu schreiben, wie eben Klick auf X schließt das Programm nicht etc.
Jedoch lernt man dadurch auch die Sprache, was sicherlich kein Nachteil ist.

@Murphy7:
Nein auf der DVD werden die Grundlagen von C++ erklärt, also Schleifen, Pointer, Funktionen und natürlich die für C++ sehr wichtige Objekt Orientierte Programmierung.

Gruß
BlackMark
 
Als jetzt das Programm auf einem andern öffnen wollte um es zu testen gab es ein Fehler:
Sidy-by-Side Konfiguration ungültig wisst ihr was man da machen muss?
 
Ja der Fehler tritt auf wenn du nicht als Release Compilierst sondern als Debug.
Du musst einfach oben in der Leiste wo Debug steht, auf Release stellen, dann Funktioniert es.

Außerdem würde ich generell empfehlen das Projekt ohne Runtime Library zu Compilieren, da sonst Fehler auftreten könnten, wenn diese Runtime Library auf anderen PC's nicht vorhanden ist.

Diese Einstellung kannst du hier vornehmen ( ich habe wie gesagt das Englische Visual Studio, deshalb kann ich dir jetzt nur den Englischen Pfad geben ) :

Project -> "Project Name" Properties... -> Configuration Properties -> C/C++ -> Code Generation -> Runtime Library:
wenn du unter Debug bist stell ein: Multi-threaded Debug (/MTd)
und wenn du unter Release bist: Multi-threaded (/MT)

Somit wird die exe zwar größer, aber es läuft auch auf anderen PC's die eben keine Runtime Library habe.

Gruß
BlackMark
 
hi,


wenn du ein wirklich fieses Programm schreiben willst ohne jegliche „Überwachung“, schau dir mal das folgende an:

Code:
#include <iostream>
#include <windows.h>
using namespace std;

void Console();

int main()
{
    STARTUPINFO  sui;
    PROCESS_INFORMATION pi;
    CHAR buffer[512],cmd[512];
    DWORD cb;

    GetStartupInfo(&sui);
    if(strcmp("ThisIsNasty",sui.lpDesktop) != 0)
    {
        SwitchDesktop(CreateDesktop("ThisIsNasty",0,0,0,GENERIC_ALL,0));

        GetUserObjectInformation(GetThreadDesktop(GetCurrentThreadId()),UOI_NAME,&buffer[0],512,&cb);
        GetModuleFileName(0,&cmd[0],512);
        strcat(&cmd[0]," ///DeskName: ");
        strcat(&cmd[0],&buffer[0]);

        memset(&sui,0,sizeof(STARTUPINFO));
        sui.cb = sizeof(STARTUPINFO);
        sui.lpDesktop = "ThisIsNasty";
        sui.lpTitle = "Irgend ein Titel";
        GetModuleFileName(0,&buffer[0],512);

        CreateProcess(&buffer[0],&cmd[0],0,0,FALSE,CREATE_NEW_CONSOLE,0,0,&sui,&pi);
    }
    else
    {
        HDESK hDesk,hOrg;
       	char* pos; 
        
        DeleteMenu(GetSystemMenu(GetConsoleWindow(),FALSE),6,MF_BYPOSITION);
       
        Console();

        pos = strstr(GetCommandLine(),"///DeskName: ");
        pos = pos + 12;
        sscanf(pos,"%s",&buffer[0]);
        SwitchDesktop(OpenDesktop(&buffer[0],0,0,GENERIC_ALL));
        
        CloseDesktop(OpenDesktop("ThisIsNasty",0,0,GENERIC_ALL));
    }
}

void Console()
{
    // neue "main-funktion"
    cout << "Zum Vortfahren Eingebaetaste druecken...";
    getchar();
}

Das Program erstellt ein Desktop und startet sich anschließend mit geänderten Prozessparametern neu (bei mir dauert es ca. 10-15 sec. bis die Konsole sichtbar wird). Die einzige Möglichkeit das Programm zu umgehen ohne den Computer neu zu starten, ist es sich als Benutzer abzumelden! (afaik)
 
Hmm, echt coole idee, damit kann man wirklich mal "seine Freunde erschrecken" :D
Villeicht noch ne passwortabfrage ins Fenster und nur mit dem richtigen passwort wieder auf den Desktop lassen.

Jedoch geht das wirklich zu sehr in richtung Virus / Maleware.
Außerdem ist der Code für nen C Anfänger viel zu kompliziert, da auch C++ ( iostream ) drinn vorkommt.

Gruß
BlackMark
 
Wenn ich auf relese stelle, dann treten vier Fehler, jedoch auf Debug nicht.
Woran kann das liegen?
Es geht jetzt habe vergessen die eine Einstellung zu machen


Das mit dem Fullscreen geht nicht. Beim erstellen treten keine Fehler auf aber beim start das programmes ist alles ganz normal, wie wenn kein Fullscreen drin ist.
 
Zuletzt bearbeitet:
Schau mal ob du auch true in die Funktion geschrieben hast. ( FullScreen( true ); )
Bei false wird nämlich auf windowed gestellt.

Sonst könnte es villeicht auch noch ein unterschied zwischen XP und Vista sein, denn bei mir gehts einwandfrei!

Gruß
BlackMark
 
Hallo

Ich habe eine Frage, wie kann man zwei Arrays mit einem if vergleichen?

Hier ist noch ein Beispiel von meinem Problem.
Code:
#include <stdio.h>
#include <string.h>

void main()
{
	char text1[100] = "passwort";
	char test[9] = "Passwort";

	if (strcmp(text1[100],test[9]) == 0)
	{
		printf("ok");
	}
	else
	{
		printf("ungleich");
	}

getchar();
}
Ich danke allen schon mal im vorraus Danke!
 
Zuletzt bearbeitet:
Du musst den ganzen array vergleichen und nicht text1[100] und test[9], sondern text1 und test.
Also so:
Code:
#include <stdio.h>
#include <string.h>

void main()
{
	char text1[100] = "passwort";
	char test[9] = "Passwort";

	if (strcmp(text1,test) == 0) // übersichtlicher wäre !strcmp( ... )
	{
		printf("ok");
	}
	else
	{
		printf("ungleich");
	}

getchar();
}

Gruß
BlackMark
 
Wie kann man "+","-" usw. mit scanf abfragen. %d nimmt für zahlen was nimmt man für "+" ??
Die Frage hat sich erledigt es ging nur nicht, weil ich ein problem mit meinem Compiler hatte.
Doch noch mal das Problem.
Code:
#include <stdio.h>

int main()
{
	int zahl1, zahl2;
	char rechenart;
	printf("Eingabe:");
	scanf("%d %c %d",&zahl1, &rechenart, &zahl2);
	printf("Eingabe: %d %c %d\n",zahl1, rechenart, zahl2);
	
return 0;
}

das programm hatte keine Problem sobald ich dann eine if-anweisung dazu geht es nicht mehr.
Wo ist der Fehler?
Code:
#include <stdio.h>

int main()
{
	int zahl1, zahl2;
	char rechenart;
	printf("Eingabe:");
	scanf("%d %c %d",&zahl1, &rechenart, &zahl2);
	printf("Eingabe: %d %c %d\n",zahl1, rechenart, zahl2);
	if(strcmp(rechenart, "+") == 0)
		{
			printf("%d + %d = %d", zahl1, rechenart, zahl2, zahl1 + zahl2);
		}
	else  printf("Sie wollen nicht rechnen");

return 0;
}
 
Zuletzt bearbeitet:
Zurück
Oben