2010-05-18 122 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键,它工作正常。 (所以我发送Tab消息时出了点问题。)

+1

我添加了compact-framework标签,你有一些答案不是针对紧凑框架。 – 2010-05-18 19:45:35

+0

@克里斯泰勒 - 谢谢。我应该补充说,当我问它。 – Vaccano 2010-05-18 20:13:33

回答

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 – 2010-05-18 18:54:14

+0

我结束了使用keybd_event函数。它位于Windows Mobile设备上的coredll.dll中。这是最接近的,所以我点了点头。 – Vaccano 2010-05-18 20:13:03

1

关键事件的PostMessage真的很奇怪。

在这种情况下,也许SendYssage 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 2010-05-18 20:10:14