2010-05-18 149 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