Inhalt von txt => Fenster kopieren

Ex0r

Commander
Registriert
Feb. 2006
Beiträge
2.540
Inhalt von txt in Fenster kopieren

Hi !

Hier mein Vorhaben:

Ich möchte den Inhalt einer .txt mittels Konsolenanwendung auslesen (das krieg ich noch grad eben so hin mit char etc) und dann in die Zwischenablage kopieren (keine Ahnung wie das geht). Dann soll der Text in der Zwischenablage in ein Fenster eingefügt werden. Es handelt sich genauer gesagt um ein Eingabefeld des Programms TrueCrypt zur Key Eingabe.

Sprache ist C++ und als Compiler verwende ich Visual Studio .NET 2003.

Sollte doch machbar sein nich wahr?
Hab zwar paar Grundkenntnisse aber bitte Noob freundlich mit mir umgehen. Wenn die Freax abgehen komm ich meistens net hinterher :evillol:

Gruß
Beater
 
Zuletzt bearbeitet:
So vll jetzt einer der sich weniger lustig fühlt -.-

Clown gefrühstückt ?
 
Hi,

den Text in die Zwischenablage kopieren ist einfach ...
hier mal schnell die wichtigsten Funktionen dafür:

GlobalAlloc
OpenClipboard
SetClipboardData
CloseClipboard

==> http://msdn2.microsoft.com/en-us/library/ms648709(VS.85).aspx

Truecrypts Eingabe-Dialog dazu zu bringen die Daten aus dem Clipboard zu laden ist schon etwas komplizierter. Kann dir auf die Schnelle keine Antwort geben, kann aber sagen dass es auf jeden Fall geht.
 
Danke schon mal.
Hm vll ist es doch nicht so schwer. Weil es ist das einzige Eingabefeld nach dem Bootvorgang was offen ist und wo man was reinkopieren kann.
Man brauch also quasie nur STRG V drücken und er kopierts automatisch ins Feld. Dann müsste er perfekterweise noch enter drücken (das übrigens insgs. 3ma aber mit dem gleichen Key).
 
Wozu die Zwischenablage? Wenn dein Ziel das Ausgeben des Textes ist, kannst du auch einfach den Text aus der Datei lesen, zum betreffenden Fenster wechseln und mit keybd_event() einen Tastatur-Tastendruck simulieren.

Falls was unklar ist, schreib ich morgen mehr. Jetzt gehts erstmal in die Heia.:)
 
mhh...

das must jetzt mal genau erklären.

- startet TC vor der Benutzeranmeldung?
- wann startet dein prog. und wie (automat. oder von Hand)
- hast Du vor HotKeys zu benutzen?(setzt ja voraus das es bereits läuft)
- es kommen drei verschiedene Eingaben(Key+Enter) hinter einander?

----------------

Hab vor Jahr und Tag mal was ähnliches geschrieben( Clipboard-Erweiterung ), war aber mit meiner Lösung nie Besonders zufrieden da es leider nicht mit allen Anwendungen funktioniert und auch nicht immer zuverlässig.
Kannst es ja mal versuchen, es sei denn jemand hier hat ne besser Lösung .

Hier mal die Api-Funkt. in chronologisch Reihenfolge:

1. GetForegroundWindow() //hWnd zum Fenster mit Eingebefocus
2. GetWindowThreadProcessId() //ThreadID (von TC-Dialog)
3. GetCurrentThreadId() //TheradID (dein Prog)
4. AttachThreadInput() // siehe MSDN :)

5. emulation von Tasteneingabe(n) mittels: keybd_event()

6. AttachThreadInput() //"Verbindung" aufheben

Funktioniert nur wenn der Cursor auch immer im Edit-Control sitzt!
Die einzelnen Tastendrücke musst du komplett emulieren d.h.

KEY_DOWN => kurze Pause (mittels Sleep()) => KEY_UP

Außer dem muss man sich überlegen ob zuvor schon irgend welche Tasten(kombinationen) gedrückt wurden (z.B. nen HotKey ) und dies berücksichtigen.
 
Muss es C++ sein? In C# wär's mit ein paar Zeilen getan.
In etwa so:
Code:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Tipper
{
    class Program
    {
        static void Main()
        {
            foreach (Process p in Process.GetProcesses())
            {
                if (p.MainWindowTitle == "Unbenannt - Editor") // [COLOR="Red"]Der Titel des Fensters[/COLOR]
                {
                    SetForegroundWindow(p.MainWindowHandle);
                    SendKeys.SendWait("Testtext"); // [COLOR="Red"]Der Key[/COLOR]
                    return;
                }
            }
        }

        [DllImport("user32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);
    }
}

Mehr dazu hier: http://msdn2.microsoft.com/en-us/library/system.windows.forms.sendkeys(VS.71).aspx
 
Zuletzt bearbeitet:
@Backslash: müsste man da nicht evnt. noch den Focus auf das EditControl setzen?
 
Hui eins nach dem Andern.

- startet TC vor der Benutzeranmeldung?

direkt danach.

- wann startet dein prog. und wie (automat. oder von Hand)

wie geschrieben. Direkt nach der Annmeldung öffnet sich das TC Fenster. Hängt im Autostart und ist fertig konfiguriert. Will die Laufwerke automatisch mounten. Brauch nur einen Key und [Enter] drücken. Ist auch automatisch im vordergrund glaub ich.

- hast Du vor HotKeys zu benutzen?(setzt ja voraus das es bereits läuft)

HotKeys? Wenn du STRG + V meinst, ja why not. Hab weiter oben auch schon was von nem Keybd event gelesen. Ich schau mir gleich das ganze noch mal ausführlicher an.

- es kommen drei verschiedene Eingaben(Key+Enter) hinter einander?

Jein. Es werden drei Platten gemounted die aber alle den gleichen Key haben. Sprich es wäre halt richtig perfekt, wenn das "Tool" den Key einfügt, enter drückt, einfügt, enter drückt und noch einmal einfügt und ...ihr ahnt es...enter drückt. Das Fenster schließt sich nach Druck auf enter übrigens automatisch und das gleiche erscheint noch mal. Sollte also nicht allzu schwierig sein. Ich brauche per Hand auch nur genau diese 2 Schritte drei mal ohne Mausbenutzung zu wiederholen.

Viele Dank schon mal an alle die mir versuchen zu helfen / es bereits getan haben ! =)

Beater


/edit:

@Backslash:

Code:
D:\Visual Studio Projects\ConsoleApplication1\Class1.cs(4): The type or namespace name 'Windows' does not exist in the class or namespace 'System' (are you missing an assembly reference?)
 
Zuletzt bearbeitet:
Hmmm, kann man für die Eingabe in TrueCrypt nicht auch Keepass benutzen oder ist selbst das noch zu umständlich?
 
Glaub am besten ist es wenn du mit EnumWindows + GetWindowsText arbeiten um das hWnd von TrueCrypt zu finden (anstatt mit GetForegroundWindow ).
 
Glaub am besten ist es wenn du mit EnumWindows + GetWindowsText arbeiten um das hWnd von TrueCrypt zu finden (anstatt mit GetForegroundWindow ).

:D Ok jz müsst ich nur noch wissen was du da geschrieben hast ^^

Ich teste grad mit der keybd_event Funktion rum. Scheint ganz nützlich zu sein. Nur weiß ich noch net wie ich ein "C" mache :D STRG und jede andre Sondertaste is ganz einfach aber wie mach ich ein c >.<

MSDN

Das Numlock Beispiel klappt auch hervorragend. Screenshots auch kein Ding. Ich will aber nur ein C ^^

Das ist ja dann auch schon der Haupteil des Programmes =)

Ich brauch ja nur den Ordner und die txt öffnen (lassen/wie das geht sagt mir bestimmt auch noch einer) und deren Inhalt via Strg + a, Strg + v rauskopieren. Das Enfügen sollte auch nicht so schwer sein denke ich.

Aber bitte einfache Vorschläge für C++ nehm ich gerne entgegen. Bitte nicht so übertriebende Anfänger Killer ;)
 
Beater schrieb:
(...)@Backslash:

Code:
D:\Visual Studio Projects\ConsoleApplication1\Class1.cs(4): The type or namespace name 'Windows' does not exist in the class or namespace 'System' (are you missing an assembly reference?)

Wie die Meldung sagt, du brauchst die Referenz zu System.Windows.Forms: Im Projektmappen-Explorer rechtsklick auf Verweise und dann Verweis hinzufügen.

Wie Enter drücken etc geht steht im oben geposteten Link.
 
Zu EnumWinows:

Diese Funktion empfängt alle (Alle alle) Handles und übergibt sie an die zugehörige Callbackfunktion. In der kannst du dann per GetWindowText() den Fenstertitel des Handles
auslesen und mit dem gesuchten Name vergleichen oder was auch immer du dann damit machen willst. Tipp: Um nur TopLevel-Handles (Eben die des Fensters) zu bekommen, prüfe bei jedem Handle einfach ob GetParent() == 0 ist. :freaky: (Ich lieebe C++) ^^

Oder du nimmst FindWindow(), wobei die bei mir irgendwie nicht so richtig wollte.

Um das ganze in den Programmablauf einzureihen:

1. Dein Programm bekommt als Input einen String. Der kann aus einer Datei gelesen werden oder wenn er fest ist einfach im Programm integriert sein.

2. Du suchst per EnumWindows() bzw FindWindow() nach dem Top-Level-Handle des gesuchten Programms, in deinem Fall TC.

3. Du holst das Fenster nach oben, zB per SetFocus().

4. Du sezierst deinen String Buchstabe für Buchstabe und sendest diese einzeln per keybd_event(). Zusätzlich kannst du jede beliebige Taste zusätzlich senden, zB Enter.

Edit: keybd_event() nimmt hexadezimale Werte entgegen, wie du sicher gelesen hast. Anhand der Virtual Key Code Liste kannst du erkennen, dass zB ein 'C' einem 0x43 entspricht.
 
Zuletzt bearbeitet:
danke das funtzt. Nur leider halt c# was zwar c++ ähnelt aber doch iwie anders ist...

Ich gucke mal ob ich damit ne .txt über ne char variable ausgelesen krieg. Oder was schlägst du vor ?

@Spartaner: Iwie übers Ziel hinaus :D Versteh wieder nur Bahnhof. Bin Anfänger und versuch nur meine Schul Skills was zu erweitern. Die Lösung vom Backslash klappt zudem. Jetzt muss ich sie nur noch anpassen. =)

/Edit: Hups hatte da grad "Spartaner" stehen meinte aber logischerweise Backslash. Sorry
 
Zuletzt bearbeitet:
Ich danke dir für deine Tipps aber wie gesagt Backslashs Lösung funktioniert.
Ich muss die nur noch anpassen und das wars. Ich hoffe meine C++ Befehle gehen, dann würde ichs sogar alleine hinkriegen. Ich melde mich gleich noch mal.

/Edit: Ouh ne. Ich krieg da ja noch net ma ne Char Variable deklariert :D

/Edit2: Auch hier namen vertauscht -.- Meinte türlich Backslash
 
Zuletzt bearbeitet:
Zurück
Oben