PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C# an Prozess Tasten senden



Devil589
03.04.2010, 13:05
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!

Easysurfer
03.04.2010, 13:11
Das geht per WINAPI Send oder sowas, musste mal schaun ;) Gibts genug bei Google ;)

Greez easy

Hu5eL
03.04.2010, 13:14
http://www.c-plusplus.de/forum/viewtopic-var-t-is-167580-and-view-is-previous.htmlerste google-ergebnisse, sogar mit quellcode

sry sehe gerade das die methode nur für programme mit fokus geht

Devil589
03.04.2010, 13:25
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!

inout
03.04.2010, 14:27
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):


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:

System.Runtime.InteropServices;Die benötigten Imports:

[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);

Devil589
03.04.2010, 16:43
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!

inout
03.04.2010, 16:55
Hey inout, vielen lieben Dank.
Bitte, gerne.


wofür steht das "Edit" in dieser Zeile:
IntPtr b = FindWindowEx(a, IntPtr.Zero, "Edit", "");
Das ist der Klassenname des Controls.
Siehe hier (http://msdn.microsoft.com/en-us/library/ms633574%28VS.85%29.aspx).



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 (http://msdn.microsoft.com/en-us/library/ms927178.aspx) findest du eine Liste der Konstanten und hier (http://www.torsten-horn.de/techdocs/ascii.htm) eine Ascii Tabelle.
Für Enter übergibst du dort also (IntPtr)13.

Devil589
03.04.2010, 17:08
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!