Ergebnis 1 bis 8 von 8
  1. #1
    Fortgeschrittener
    Registriert seit
    06.10.2007
    Beiträge
    34

    Standard C# an Prozess Tasten senden

    Hallo @all,
    ich habe mal folgende Frage und zwar, wie kann man diverse Tastenbefehle, Tastendrücke an einen bestimmten Prozess senden ohne das der Prozess in den Vordergrund muss?

    Beispiel: Das C# Programm soll die Buchstaben "A,B,C" an Notepad schicken was aber minimiert oder im Hintergrund ( Nicht fokusiert ) ist.

    Falls mir jemand weiter helfen kann wäre ihm dem jenigen sehr dankbar.
    Vielen Dank schon mal.

    See Ya!

  2. #2
    Coding Contest Winner
    Registriert seit
    21.03.2008
    Beiträge
    273

    Standard

    Das geht per WINAPI Send oder sowas, musste mal schaun Gibts genug bei Google

    Greez easy

  3. #3
    Capt'n Crunch
    Registriert seit
    10.07.2008
    Beiträge
    999

    Standard

    erste google-ergebnisse, sogar mit quellcode

    sry sehe gerade das die methode nur für programme mit fokus geht
    bitcoin. Banking Is Necessary. Banks Are Not. - by Lincoln6Echo

    Das ganze Mysql usw is mir zu viel arbeit um es zu lernen

  4. #4
    Fortgeschrittener
    Registriert seit
    06.10.2007
    Beiträge
    34

    Standard

    Hallo, danke für die Antworten.
    Und genau das Problem habe ich, ich habe noch nichts wirkliches gefunden wie man Tastenbefehle an einen Prozess sendet ohne vorher das jeweilige Fenster in den Vordergrund zu holen.

    Ich hatte einmal was bekommen von jemanden nur ich weiß leider nicht wie ich das in C# umsetzen kann.
    Für weitere Hilfe wäre ich sehr dankbar.

    P.s: hier das Snippet was ich mal bekommen habe:

    var
    Handle:hwnd;
    Window:String;

    Window:='TeamSpeak 3';
    Handle:=FindWindow(nil,Pchar(Window));
    PostMessage(Handle, WM_KEYDOWN, VK_Return, 0); // enter senden
    See Ya!

  5. #5

    Registriert seit
    17.06.2009
    Beiträge
    559

    Standard

    Zitat Zitat von Devil589 Beitrag anzeigen
    var
    Handle:hwnd;
    Window:String;

    Window:='TeamSpeak 3';
    Handle:=FindWindow(nil,Pchar(Window));
    PostMessage(Handle, WM_KEYDOWN, VK_Return, 0); // enter senden
    See Ya!
    Das kann so nicht funktionieren. Du musst das Handle des Controls suchen (mit FindWindowEx), an das du die Tasten senden möchtest.

    Hier ein kleines Beispiel mit Notepad (Handleüberprüfung fehlt):
    Code:
    const int WM_CHAR = 258;
    IntPtr a = FindWindow("Notepad", "Unbenannt - Editor");
    IntPtr b = FindWindowEx(a, IntPtr.Zero, "Edit", "");
    SendMessage((IntPtr)b, WM_CHAR, (IntPtr)'a', IntPtr.Zero);
    Das benötigte Using:
    Code:
    System.Runtime.InteropServices;
    Die benötigten Imports:
    Code:
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

  6. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    Devil589 (03.04.2010)

  7. #6
    Fortgeschrittener
    Registriert seit
    06.10.2007
    Beiträge
    34

    Standard

    Hey inout, vielen lieben Dank.
    Ich habe dein Snippet gerade eben versucht und es klappt wunderbar genau so wie ich es wollte.
    Und ich wäre auch nie auf diese Lösung gekommen.
    Vielen Dank.

    Achja was ich nur nicht ganz verstehe, wofür steht das "Edit" in dieser Zeile:
    IntPtr b = FindWindowEx(a, IntPtr.Zero, "Edit", "");


    Ach und kann ich wenn ich jetzt z.B. die Enter Taste drücken will folgendes nutzen anstatt einen String? ("{ENTER}")

    See Ya!

  8. #7

    Registriert seit
    17.06.2009
    Beiträge
    559

    Standard

    Zitat Zitat von Devil589 Beitrag anzeigen
    Hey inout, vielen lieben Dank.
    Bitte, gerne.
    Zitat Zitat von Devil589 Beitrag anzeigen
    wofür steht das "Edit" in dieser Zeile:
    IntPtr b = FindWindowEx(a, IntPtr.Zero, "Edit", "");
    Das ist der Klassenname des Controls.
    Siehe hier.

    Zitat Zitat von Devil589 Beitrag anzeigen
    Ach und kann ich wenn ich jetzt z.B. die Enter Taste drücken will folgendes nutzen anstatt einen String? ("{ENTER}")
    Nein, du musst dort immer den Ascii-Code des Zeichens übergeben.
    Hier findest du eine Liste der Konstanten und hier eine Ascii Tabelle.
    Für Enter übergibst du dort also (IntPtr)13.

  9. #8
    Fortgeschrittener
    Registriert seit
    06.10.2007
    Beiträge
    34

    Standard

    Ah super.
    Jetzt versteh ich das so langsam.
    Vielen Dank noch einmal für deine Hilfe.
    Btw. du hast/bekommst eine PM von mir :p

    See Ya!

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •