none
Как программно ввести что-нибудь в другое приложение? RRS feed

  • Общие обсуждения

  • .NET предлагает простой способ осуществление программного ввода и эмуляции нажатия клавиш с помощью класса SendKeys , но он имеет несколько ограничений:

    1. Целевое приложение должно быть активным (в фокусе). Поэтому прежде чем использовать SendKeys, необходимо сделать активным целевое приложение. WinAPI метод FindWindow поможет найти нужное окно, а метод SetForegroundWindow сделает его активным
    2. SendKeys не работает для отключенного сеанса
    3. SendKeys может привести непредсказуемым результатам, когда приложение предназначение для интернационального использования и использует разные раскладки клавиатур.

    Больше информации о классе SendKeys можно узнать здесь

    Ниже пример, показывающий, как можно ввести текст в приложение блокнот:

        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lp1, string lp2);
    
        [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool SetForegroundWindow(IntPtr hWnd);
    
        private void button1_Click(object sender, EventArgs e)
        {
          // find window handle of Notepad
          IntPtr handle = FindWindow("Notepad", "Untitled - Notepad");
          if (!handle.Equals(IntPtr.Zero))
          {
            // activate Notepad window
            if (SetForegroundWindow(handle))
            {
              // send "Hello World!"
              SendKeys.Send("Hello World!");
              // send key "Tab"
              SendKeys.Send("{TAB}");
              // send key "Enter"
              SendKeys.Send("{ENTER}");
            }      
          }
        }
    

    Также можно использовать Windows API функции SendMessage и PostMessage для отправки WM_SETTEXT сообщений соответствующему окну.

    Фундаментальное отличие SendMessage и PostMessage заключается в том, что SendMessage посылает сообщение целевому окну путем вызова window процедуры этого окна, и ждет пока она будет выполнена. PostMessage посылает сообщение в очередь сообщений, связанную с потоком целевого окна, и не ожидает обработки сообщения.

    Ниже пример кода, как отправить сообщение блокноту, используя метод SendMessage:

    private const int WM_SETTEXT = 0x000C;
    [DllImport("user32.dll")]
    private static extern IntPtr FindWindow(
      string lpClassName,
      string lpWindowName);
    
    [DllImport("User32.dll")]
    private static extern IntPtr FindWindowEx(
      IntPtr hwndParent,
      IntPtr hwndChildAfter,
      string lpszClass,
    string lpszWindows);
    [DllImport("User32.dll")]
    private static extern Int32 SendMessage(
      IntPtr hWnd,        
      int Msg,        
      IntPtr wParam,       
    StringBuilder lParam);
    private void button1_Click(object sender, EventArgs e)
    {
      // retrieve Notepad main window handle
      IntPtr hWnd = FindWindow("Notepad", "Untitled - Notepad");
      if (!hWnd.Equals(IntPtr.Zero))
      {
        // retrieve Edit window handle of Notepad
        IntPtr edithWnd = FindWindowEx(hWnd, IntPtr.Zero, "Edit", null);
        if (!edithWnd.Equals(IntPtr.Zero))
          // send WM_SETTEXT message with "Hello World!"
          SendMessage(edithWnd, WM_SETTEXT, IntPtr.Zero, new StringBuilder("Hello World!"));
      }
    }
    

     


    Для связи [mail]
    1 февраля 2011 г. 16:06