tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
860
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    {Eve} {Eve} ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    54
    Hi,

    ich habe über die Möglichkeiten von SendMessage gelesen. Gut. Jetzt wollte ich das mal kurz ausprobieren und hab kleine Testapp gemacht.

    Mit SendKeys funktioniert es, aber bei SendMessage funktioniert es nicht und ich verstehe einfach nicht wo mein Fehler liegt.
    Ich habe schon viele verschiedene Dinge ausprobiert, aber ich finde die Lösung des Problems einfach nicht.

    Hat vielleicht jemand von euch eine Idee wo mein Fehler ist. Bin für jeden Hinweis dankbar

    Ich benutze Win7 64Bit, ist es möglich das es da ein Problem gibt?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    static class Program
        {
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
     
            [DllImport("user32.dll")]
            private static extern bool SetForegroundWindow(IntPtr hWnd);
     
            static private String m_strNameOfAppToSendInput = "notepad++";
            public const Int32 WM_KEYDOWN = 0x100;
            public const Int32 WM_KEYUP = 0x101;
            
            [STAThread]
            static void Main()
            {          
                Process[] rgProcesses = Process.GetProcesses();
     
                foreach (Process cProcess in rgProcesses)
                {
                    if (cProcess.ProcessName == m_strNameOfAppToSendInput)
                    {
                        IntPtr ProcessMainHandle = cProcess.MainWindowHandle;
                                            
                        //das geht
                        //SetForegroundWindow(ProcessMainHandle);
                        //SendKeys.SendWait("test"); 
     
                        //warum das nicht
                        IntPtr swdRet = new IntPtr(0);
                        swdRet = SendMessage(ProcessMainHandle, WM_KEYUP, (IntPtr)Convert.ToInt64(Keys.I), IntPtr.Zero);
                    }
                }      
            }
        }
     
    {Eve}

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Das Haupt-Fenster einer Applikation ist nicht unbedingt das Fenster, welches die WM_KEYUP, WM_KEYDOWN bzw. WM_CHAR Nachrichten verarbeitet.

    Du müßtest das Kind-Fenster der Applikation finden (siehe http://www.pinvoke.net/default.aspx/user32.findwindowex) wo der Text eingegeben werden soll. In der Regel ein Edit bzw. Textfeld. Wie das Zielfenster heißt, bzw. welche Klasse es hat, kannst du z.B. mit Spy++ ermitteln.

    Dann solltest du eine WM_KEYDOWN, WM_CHAR und WM_KEYUP Sequenz senden.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    {Eve} {Eve} ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    54
    Hi,

    vielen Dank für die Hilfe.
    Ich habe die Window- Handles überprüft und so sind sie jetzt richtig.
    Laut return- Wert der SendMessage- Methode sollte der Aufruf erfolgreich durchgeführt worden sein, allerdings wird der Buchstabe im Notepad nicht angezeigt.

    Hat jemand noch einen Ratschlag was falsch sein könnte?

    So sieht der Code jetzt aus:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    namespace WindowsFormsApplication1
    {
        static class Program
        {
            [DllImport("user32.dll", SetLastError = true)]
            static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
     
            [DllImport("user32.dll", SetLastError = true)]
            private static extern bool SetForegroundWindow(IntPtr hWnd);
     
            [DllImport("user32.dll", SetLastError = true)]
            static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);
     
            public const UInt32 WM_KEYDOWN = 0x100;
            public const UInt32 WM_KEYUP = 0x101;
     
            [STAThread]
            static void Main()
            {
                IntPtr hwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Notepad", null);
                IntPtr hwndedit = FindWindowEx(hwnd, IntPtr.Zero, "Edit", null);
     
                IntPtr sdwRet = new IntPtr(0);
                IntPtr sdwKey = new IntPtr(Convert.ToInt64(Keys.A));
                sdwRet = SendMessage(hwndedit, WM_KEYDOWN, sdwKey, IntPtr.Zero);
                //Returns TRUE if the message succeeds
     
                Console.WriteLine("ERROR: swdRet = " + sdwRet);
            }
        }
    }

    Gruss
     
    {Eve}

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Wie schon gesagt, mußt du eine komplette WM_KEYDOWN, WM_CHAR und WM_KEYUP Sequenz senden.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    {Eve} {Eve} ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    54
    Ahhhh (*licht aufgehe*)

    Wie schon gesagt, mußt du eine komplette WM_KEYDOWN, WM_CHAR und WM_KEYUP Sequenz senden.
    Das war mir die ganze Zeit gar nicht klar.

    Vielen Dank für deine Hilfe jetzt funktioniert es.

    So sieht es jetzt aus:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    namespace WindowsFormsApplication1
    {
        static class Program
        {
            [DllImport("user32.dll", SetLastError = true)]
            static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
     
            [DllImport("user32.dll", SetLastError = true)]
            private static extern bool SetForegroundWindow(IntPtr hWnd);
     
            [DllImport("user32.dll", SetLastError = true)]
            static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);
     
            public const UInt32 WM_KEYDOWN = 0x100;
            public const UInt32 WM_KEYUP = 0x101;
            public const UInt32 WM_CHAR = 0x0102;
            
            [STAThread]
            static void Main()
            {
                IntPtr hwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Notepad", null);
                IntPtr hwndedit = FindWindowEx(hwnd, IntPtr.Zero, "Edit", null);
     
                IntPtr sdwRet = new IntPtr(0);
                IntPtr sdwKey = new IntPtr(Convert.ToInt64(Keys.A));
                sdwRet = SendMessage(hwndedit, WM_KEYDOWN, sdwKey, IntPtr.Zero);
                sdwRet = SendMessage(hwndedit, WM_CHAR, sdwKey, IntPtr.Zero);
                sdwRet = SendMessage(hwndedit, WM_KEYUP, sdwKey, IntPtr.Zero);
            }
        }
    }


    Hätte noch eine Frage.
    Muss ich diese
    Code :
    1
    
     public const UInt32 WM_KEYDOWN = 0x100;
    immer in den Code schreiben oder sind diese Events irgendwo in einer Klasse vordefiniert und kann die von dort abrufen?

    Gruss
     
    {Eve}

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von {Eve} Beitrag anzeigen
    Muss ich diese
    Code :
    1
    
     public const UInt32 WM_KEYDOWN = 0x100;
    immer in den Code schreiben oder sind diese Events irgendwo in einer Klasse vordefiniert und kann die von dort abrufen?
    Soweit mir bekannt ist müssen diese Konstanten selbst definiert werden - die externen Funktionen mußt du ja auch über PInvoke erst nutzbar machen.

    Gruß
    {Eve} bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. API SendMessage
    Von Peter86 im Forum .NET Café
    Antworten: 0
    Letzter Beitrag: 24.05.09, 04:40
  2. Sendmessage
    Von Klef im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 05.09.05, 15:13
  3. Sendmessage und Konsorten
    Von Twist im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 29.04.04, 20:04
  4. SendMessage ?
    Von ANSI Lady im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 23.03.04, 03:32
  5. SendMessage ?
    Von jessy_musik im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 20.02.04, 12:48