Announcement

Collapse
No announcement yet.

Daten an externen Prozess in einer Dosbox übergeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Daten an externen Prozess in einer Dosbox übergeben

    Hallo zusammen.

    Ich habe folgendes Problem.

    Ich starte aus meiner Anwendung heraus einen neuen Prozess. Das funktioniert auch ganz gut nur erwartet der aufgerufene Prozess nach einer weile noch eine Eingabe (Passwort).

    Wie kann ich die Eingabe aus meinem Programm an die Dosbox übergeben?

    Bin für jeden Tip dankbar.

    Viele Grüße
    Jörg

  • #2
    Hallo,

    ist es beim aufrufenden Prozess möglich Argumente zu übergeben? Somit könnte das Passwort mit übergeben werden.

    Ist dies nicht der Fall hilft vielleicht folgendes Bsp.:
    [highlight=c#]
    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.Threading;
    using System.Windows.Forms;

    namespace ConsoleApplication1
    {
    class Program
    {
    [DllImport("User32.dll", SetLastError = true)]
    public static extern int SetForegroundWindow(IntPtr hwnd);
    //---------------------------------------------------------------------
    static void Main(string[] args)
    {
    // Prozess starten:
    int ID = ProzessStarten("cmd.exe");

    // Warten bis Passwort-Abfrage erscheint. Geht nicht über
    // Rückgabewert, daher wird einfach eine bestimmte Zeit gewartet:
    Thread.Sleep(1000);

    // Text senden:
    TextAnProzessSenden(ID, "Passwort - geheim");
    }
    //---------------------------------------------------------------------
    private static int ProzessStarten(string prozessName)
    {
    Process proc = new Process();
    proc.StartInfo.FileName = prozessName;
    proc.Start();
    return proc.Id;
    }
    //---------------------------------------------------------------------
    private static void TextAnProzessSenden(int ID, string text)
    {
    IntPtr mainHandle =
    Process.GetProcessById(ID).MainWindowHandle;

    SendKeys.SendWait(text);
    SetForegroundWindow(mainHandle);
    }
    }
    }
    [/highlight]

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo.

      Danke für deine Antwort.
      Die Lösung funktioniert zwar prinzipiell, aber wenn die Dosbox nicht die aktive Anwenund ist, z.B. weil der Benutzer auf ein anderes Fenster klickt, dann wird der Text an die falsche Anwendung geschickt.

      Ausserdem wollte ich die Dosbox ohne Fenster starten.
      Gibt es eine Möglichkeit den Text auf einem anderen Weg an den Prozess zu senden?
      Schön wäre die SendKeys-Funktionalität bei der man eine Process ID angeben kann, an die der Text gesendet wird.

      Gibt es sowas ähnliches?

      Gruß
      Jörg

      Comment


      • #4
        Hi,

        dann müssen Named Pipes (oder ähnliches) verwendet werden. Ich hab kein Bsp. dafür aber Links:
        http://www.eggheadcafe.com/articles/20060404.asp
        http://bytes.com/forum/thread830279.html
        http://articles.techrepublic.com.com...1-6170794.html

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hallo Jörg,

          habe noch eine Möglichkeit gefunden:

          Code:
          #define CMD
          
          using System;
          using System.Diagnostics;
          using System.Runtime.InteropServices;
          using System.Threading;
          
          namespace Text_an_andere_Anwendung_schreiben
          {
          	class Program
          	{
          		#region API
          		[DllImport("user32.dll", SetLastError = true)]
          		private static extern IntPtr FindWindowEx(
          			IntPtr parentHandle,
          			IntPtr childAfter,
          			string className,
          			string windowTitle);
          
          		[DllImport("user32.dll", EntryPoint = "PostMessageA")]
          		private static extern bool PostMessage(
          			IntPtr hWnd,
          			uint msg,
          			int wParam,
          			int lParam);
          
          		[DllImport("user32.dll")]
          		private static extern byte VkKeyScan(char ch);
          		#endregion
          		//---------------------------------------------------------------------
          		#region Konstanten
          		private const uint WM_KEYDOWN = 0x100;
          		#endregion
          		//---------------------------------------------------------------------
          		static void Main(string[] args)
          		{
          			// Prozess starten:
          #if CMD
          			//Process proc = ProzessStarten("cmd.exe");
          			Process proc = ProzessStarten(@"..\..\Input\Input.exe");
          #else
          			Process proc = ProzessStarten("Notepad.exe");
          #endif
          
          			// Text senden:
          			TextAnProzessSenden(proc, "Passwort - geheim");
          		}
          		//---------------------------------------------------------------------
          		/// <summary>
          		/// Startet den Prozess
          		/// </summary>
          		/// <param name="prozessName">
          		/// Name des zu startenden Prozesses
          		/// </param>
          		/// <returns></returns>
          		private static Process ProzessStarten(string prozessName)
          		{
          			Process proc = new Process();
          			proc.StartInfo.FileName = prozessName;
          			proc.Start();
          
          			return proc;
          		}
          		//---------------------------------------------------------------------
          		/// <summary>
          		/// Sendet Text an einen Prozess
          		/// </summary>
          		/// <param name="proc">
          		/// Prozess
          		/// </param>
          		/// <param name="text">
          		/// zu sendender Text
          		/// </param>
          		/// <remarks>
          		/// Aufgrund der Probleme bei SendKeys.Send (v.a. wenn der Prozess
          		/// nicht aktiv ist) wird PostMessage verwendet. Dies geschieht
          		/// über WinAPI.
          		/// Der Text wird an den MessageQueue angehängt. Somit entfällt
          		/// das Warten bis die Aufforderung zur Eingabe erscheint.
          		/// </remarks>
          		private static void TextAnProzessSenden(Process proc, string text)
          		{
          			// MainWindowHandle des Prozesses holen:
          			IntPtr mainHandle = proc.MainWindowHandle;
          
          #if CMD
          			// Handle der Console ermitteln. Das Consolen-Handle ist gleich
          			// dem MainWindowHandle:
          			IntPtr hWnd = mainHandle;
          #else
          			// Handle des Hauptfenster. Das Argument für die Klasse wurde mit
          			// dem Programm Spy++ ermittelt:
          			IntPtr hWnd = FindWindowEx(
          				mainHandle,
          				IntPtr.Zero,
          				"Edit",
          				null);
          #endif
          
          			// Text posten. Für Bestätigung der Eingabe Return anhängen:
          			text += "\n";
          			for (int i = 0; i < text.Length; i++)
          				PostMessage(
          					hWnd,
          					WM_KEYDOWN,
          					VkKeyScan(text[i]),
          					0);
          		}
          	}
          }
          Hoffe es hilft dir.

          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment

          Working...
          X