PostMessage, похоже, не работает - PullRequest
3 голосов
/ 18 мая 2010

Я пытаюсь использовать PostMessage для отправки клавиши табуляции.

Вот мой код:

// This class allows us to send a tab key when the the enter key
//  is pressed for the mooseworks mask control.   
public class MaskKeyControl : MaskedEdit
{
//  [DllImport("coredll.dll", SetLastError = true, CharSet = CharSet.Auto)]
//  static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);

    [return: MarshalAs(UnmanagedType.Bool)]
    // I am calling this on a Windows Mobile device so the dll is coredll.dll
    [DllImport("coredll.dll", SetLastError = true)]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, Int32 wParam, Int32 lParam);

    public const Int32 VK_TAB = 0x09;
    public const Int32 WM_KEYDOWN = 0x100;

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {
            PostMessage(this.Handle, WM_KEYDOWN, VK_TAB, 0);
            return;
        }
        base.OnKeyDown(e);
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (e.KeyChar == '\r') 
            e.Handled = true;
        base.OnKeyPress(e);
    }
}

Когда я нажимаю ввод, вызывается код, но ничего не происходит. Затем я нажимаю клавишу TAB, и она работает нормально. (Значит, что-то не так с моей отправкой сообщения вкладки.)

Ответы [ 3 ]

4 голосов
/ 18 мая 2010

Вы действительно не должны публиковать сообщения Windows, связанные с пользовательским вводом, непосредственно в элементы управления Windows. Скорее, если вы хотите смоделировать ввод, вам следует вместо этого использовать функцию API SendInput для отправки нажатий клавиш.

Также, как упоминает Крис Тейлор в своем комментарии, класс SendKeys можно использовать для отправки ключевых входов в приложение, если вы хотите использовать существующую управляемую оболочку (вместо вызова функции SendInput). себя через слой P / Invoke).

2 голосов
/ 18 мая 2010

PostMessage по ключевым событиям действительно странные вещи.

В этом случае может быть лучше работать SendMessage с KEYDOWN, KEYPRESS, KEYUP (три вызова).

1 голос
/ 18 мая 2010

В качестве альтернативы отправке входных сообщений элементу управления, вы могли бы быть более явным и делать следующее.

protected override void OnKeyDown(KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
    if (Parent != null)
    {
      Control nextControl = Parent.GetNextControl(this, true);
      if (nextControl != null)
      {
        nextControl.Focus();
        return;
      }
    }
  }
  base.OnKeyDown(e);
}

Это установит фокус на следующий элемент управления на родительском элементе при нажатии клавиши ввода.

...