Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Console Handle

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
28.10.2011, 17:21 Uhr
Napsta



Guten Abend,

ich habe ein problem, und zwar: Ich brauche en GetStdHandle(); um an den STD_OUTPUT_HANDLE zu kommen, weil dann kann ich direkt die Konsole anschreiben.
Das Problem ist, dass es eine andere Konsole ist.


MFG Napsta

Dieser Post wurde am 28.10.2011 um 17:22 Uhr von Napsta editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.10.2011, 10:48 Uhr
TOSHMAX



Hier ein kleines Beispiel wie es funktioniert:

C++:
#include <stdio.h>
#include <string.h>

#define WINVER 0x0501
#include <windows.h>

int main()
{
    HWND wnd = FindWindow(0, "window name");

    DWORD process_id;
    GetWindowThreadProcessId(wnd, &process_id);

    FreeConsole();
    AttachConsole(process_id);

    printf("Hello, world!\n");
    return 0;
}

Bei FindWindow setzt du einfach den Namen der Konsole, bzw. eines Fensters des gleichen Prozesses, ein. FreeConsole muss aufgerufen werden, falls in deinem Prozess bereits eine Konsole vorhanden ist, da immer nur eine aktiv sein kann. AttachConsole führt dazu, dass alle Ein- und Ausgaben auf die Konsole des anderen Prozesses umgeleitet werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.10.2011, 12:20 Uhr
Napsta



Danke für die schnelle Antwort
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.10.2011, 16:57 Uhr
Napsta



Bei mir verschwindet das CMD - Fenster...

Aber Wemm ich FreeConsole(); rausnehme, dann verschwindet das CMD - Fenster nicht


Hier ein Teil vom Code:

C++:
#include <iostream>
#include <string>
#include <Windows.h>
#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

void start()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    memset(&si, NULL, sizeof(si));
    memset(&pi, NULL, sizeof(pi));
    si.cb = sizeof(si);
    system("taskkill /IM Minecraft_Bukkit.exe");
    Sleep(2000);
    CreateProcess(L"Minecraft_Bukkit.exe", NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
}

int main()
{
    fstream f;
    f.open("Server_Bot_Error_Messages.dat", ios::out | ios::app);

    short zahl = 0;

    string message[4] = {"say Sponsoret by Napsta", "say Dieser Server wird von einem BOT gewartet", "say BOT Made by Napsta", "say TS3 - IP: "};
    string restart = "say Der Server wird in 10 Sekunden neu gestartet, bitte verlassen Sie den Server SOFORT";
    string abspeichern = "save-all";

    SetConsoleTitle(L"Server_Control made by Napsta");

labelA:

    DWORD procid;
    HWND Server = FindWindow(NULL, L"Minecraft_Bukkit_Server");
    GetWindowThreadProcessId(Server, &procid);
    FreeConsole();
    AttachConsole(procid);
    zahl = rand() % 4;

    time_t zeit;
    time(&zeit);
    tm* tmZeit = new tm;
    tmZeit = localtime(&zeit);

    if(!Server)
    {
        f << "[" << tmZeit->tm_mday << ":" << tmZeit->tm_mon << ":" << tmZeit->tm_year
            << ":" << tmZeit->tm_hour << ":" << tmZeit->tm_min << ":" << tmZeit->tm_sec
            << "] ERROR: THE SERVER COULDN´T BE FOND" << endl;
        start();
    }


Dieser Post wurde am 30.10.2011 um 16:58 Uhr von Napsta editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.10.2011, 20:42 Uhr
TOSHMAX



Die Konsole verschwindet, weil nach FreeConsole() niemand mehr darauf zugreift. Du kannst, wie gesagt, eben nur eine Konsole gleichzeitig ansprechen. Vielleicht kannst du auch etwas genauer erklären was du vorhast, dann wäre es einfacher eine Lösung zu finden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.10.2011, 15:19 Uhr
Napsta



Ach so ist das, danke für die Hilfe...

Dann muss ich wohl wenn ein Error auftritt, den Error über MessageBox(); ausgeben,
ist ja nicht so schlimm...

Ich bin so gesagt ein bisschen faul, deshalb soll die Software einer meiner Server steuern(Restart, Werbung...), und die Errors werden in einem .dat Dokument gespeichert, wenn also Fehler aufgetreten sind sie zu beheben. Das mache ich über die Befehle die Schon vorgegeben sind.

Man kann nicht das Script(Java) mit c++ ansteuern oder?


MFG Napsta
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
31.10.2011, 16:55 Uhr
TOSHMAX



Falls keine Schnittstelle bereit gestellt wird, mit der du dich über C/C++ mit dem Server verbinden kannst, denke ich nicht das es möglich ist. Um Befehle an diese Server-Konsole zu schicken könntest du aber den Code aus diesem Thread nehmen und um folgendes ergänzen:

C++:
void simulate_text_input(HWND hWnd, const char* Text)
{
    ...

    PostMessage(hWnd, WM_KEYDOWN, 13, 0);
    PostMessage(hWnd, WM_KEYUP, 13, 1 << 31);
}

Das würde die Eingabe eines Befehls simulieren und mit einem Return abschicken. Für Befehle wie "restart", könnte es so bereits funktionieren. Falls du auch noch Zahlen und andere Zeichen benötigst müsste es entsprechend ergänzt werden.

Der Code von oben (AttachConsole, ...) geht nicht, weil ein Schreibvorgang, wie cout/printf, nicht als eine Benutzereingabe erkannt und einfach ignoriert wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.10.2011, 17:48 Uhr
Napsta



Mit PostMessage(); habe ich ja schon eine Software geschrieben, die den Server controlliert(Restart, Werbung...). Ich bin zufällig über WriteConsoleOutput();
gestolpert, und hab gedacht, dass man damit evt. die Console direkt anschreiben könnte(Mit groß und Kleinschreibung, inc. Zahlen(Wegen TS3-IP)).

Weil wenn man die ganze zeit die selbe Werbung bekommt, dann ist es langweilig, deswegen habe ich die Werbungen in ein Array gepackt und durch ein zufallsprinzip(Zufall und Zufall^^) die Werbung aussuche lassen.




C++:
string Nachrichten[4] {"Nachricht 0", "Nachricht 1", "Nachricht 2", "Nachricht 3"}
short nummer;
nummer = rand() % 4;
cout << Nachrichten[nummer];



Müsste doch gehen oder?


Zitat von TOSHMAX:

Der Code von oben (AttachConsole, ...) geht nicht, weil ein Schreibvorgang, wie cout/printf, nicht als eine Benutzereingabe erkannt und einfach ignoriert wird.


Ist mir aufgefallen^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.11.2011, 11:32 Uhr
TOSHMAX



Du kannst mit cout schon eine Nachricht auf der Konsole ausgeben, allerdings eben nicht abschicken. Aber falls du z. B. eine Nachricht an alle Spieler des Servers schicken willst (mit "say Nachricht", dann fällt mir dazu nur PostMessage ein.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.11.2011, 16:45 Uhr
Napsta



Es gibt ja ein Plugin mit dem, kann man vom Ipod-Touch ansteuern...
Das geschiet doch über eine Schnitstelle oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: