2010-05-18 3 views
2

Я пытаюсь использовать PostMessage для отправки ключа табуляции.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, и он работает нормально. (Так что что-то не так с моей отправкой сообщения с вкладками.)

+1

Я добавил тэг с компакт-каркасом, некоторые из ответов, которые вы используете, не нацелены на компактный каркас. –

+0

@ Крис Тейлор - Спасибо. Я должен был добавить это, когда я спросил его. – Vaccano

ответ

4

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

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

+1

Для управляемого кода SendKeys может быть лучшим вариантом. http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx –

+0

В результате я воспользовался функцией keybd_event. Он находится в файле coredll.dll, который находится на устройстве Windows Mobile. Это было самое близкое к этому, поэтому я даю ему кивок. – Vaccano

1

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

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

1

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

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

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

+0

Я пробовал это сделать, и по какой-то причине это не работает. Спасибо хоть... – Vaccano

Смежные вопросы