2017-01-03 4 views
0

winformsアプリケーションにカスタムの画面テンキーパッドがあり、カスタムフィルタリングコードを持つ単一のドロップダウンを除いてうまく動作するようです。私は想像することができるあらゆる方法でこのキーパッドを非対話的にするために自分の道を離れました。 (それが重要ならばnumpad0、numpad1などすべてのラベルがされている)ここで、コードビハインドはカスタムオンスクリーンキーボードとフィルタリングされたドロップダウンがきれいに再生されない

public partial class TenKeyForm : Form 
{ 
    private const int WM_NCLBUTTONDOWN = 0xA1; 
    private const int HT_CAPTION = 0x2; 
    private const int WM_MOUSEACTIVATE = 0x0021, MA_NOACTIVATE = 0x0003; 
    private const int WS_EX_NOACTIVATE = 0x08000000; 

    protected override bool ShowWithoutActivation { get { return true; } } 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_MOUSEACTIVATE) 
     { 
      m.Result = (IntPtr)MA_NOACTIVATE; 
      return; 
     } 
     base.WndProc(ref m); 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams createParams = base.CreateParams; 
      createParams.ExStyle |= WS_EX_NOACTIVATE; 
      return createParams; 
     } 
    } 

    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    public static extern bool ReleaseCapture(); 

    public TenKeyForm() 
    { 
     InitializeComponent(); 
     MouseDown += MouseDownHandler; 

     numpad0.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("0"); }); 
     numpad1.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("1"); }); 
     numpad2.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("2"); }); 
     numpad3.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("3"); }); 
     numpad4.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("4"); }); 
     numpad5.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("5"); }); 
     numpad6.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("6"); }); 
     numpad7.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("7"); }); 
     numpad8.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("8"); }); 
     numpad9.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("9"); }); 
     numpadDot.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("."); }); 
     numpadBack.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("+{TAB}"); }); 
     numpadForward.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("{TAB}"); }); 
     numpadBackspace.MouseUp += new MouseEventHandler(delegate (object o, MouseEventArgs e) { SendKeys.Send("{BS}"); }); 

     SetStyle(ControlStyles.Selectable, false); 
    } 

    private void MouseDownHandler(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      ReleaseCapture(); 
      SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
     } 
    } 
} 

は再び、これは、単一のコンボボックスを除いて、さまざまなテキストボックス、マスクされた入力などのためだけで正常に動作します。このComboBoxには無効な選択が入力されないように、いくつかの追加検証があります。基本的には、エントリに「500」と「550」と入力した場合、「5」がリストの「500」にジャンプし、入力した「5」を除いてすべてが残され、次のキーストロークで置き換えられます。この時点で「5」または「0」以外のものは拒否されます。別の5つのハイライト55 0などを入力します。ここではそのビットのための分離コードです:

private void ValidateDropDown(object sender, KeyPressEventArgs e) 
    { 
     ToolStripComboBox tcb = (ToolStripComboBox)sender; 
     ComboBox cb = tcb.ComboBox; 
     cb.DroppedDown = true; 
     string strFindStr = ""; 
     if (e.KeyChar == (char)8) 
     { 
      if (cb.SelectionStart <= 1) 
      { 
       cb.Text = ""; 
       return; 
      } 

      if (cb.SelectionLength == 0) 
       strFindStr = cb.Text.Substring(0, cb.Text.Length - 1); 
      else 
       strFindStr = cb.Text.Substring(0, cb.SelectionStart - 1); 
     } 
     else 
     { 
      if (cb.SelectionLength == 0) 
       strFindStr = cb.Text + e.KeyChar; 
      else 
       strFindStr = cb.Text.Substring(0, cb.SelectionStart) + e.KeyChar; 
     } 
     int intIdx = -1; 
     // Search the string in the ComboBox list. 
     intIdx = cb.FindString(strFindStr); 
     if (intIdx != -1) 
     { 
      cb.SelectedText = ""; 
      cb.SelectedIndex = intIdx; 
      cb.SelectionStart = strFindStr.Length; 
      cb.SelectionLength = cb.Text.Length; 
      e.Handled = true; 
     } 
     else 
      e.Handled = true; 
    } 

今すぐテンキーはどこでも正常に動作しますが、このコンボボックスは、あなたが実際のキーボードで入力した場合、このコンボボックスは完璧に動作します。画面上のキーボードは最初のキーを押しても正しく動作しますが、テンキーフォームの後続のマウスイベントはComboBoxでSelectAll()のような動作をしているようです。上記の例で「55」と入力すると、55 0には移動せず、代わりに5 00に2回移動し、テキスト全体を1回のクリックで置き換えます。

この奇妙な動作の原因は何ですか?どうすれば停止できますか?

更新: ToolStripコンボボックス固有の問題であるように思われます。また:AutoCompleteMode = AutoCompleteMode.SuggestAppend

答えて

1

どのようにAutoCompleteModeを設定しますか?

私がテストを作って、それを設定する:

AutoCompleteMode = AutoCompleteMode.Suggest; 

は説明されている問題を解決しました。

EDIT 1

私はあなたが追加することができ、その問題の回避策を見つけた:

toolStripComboBox1.SelectionLength=0; 

SendKey関数の前に。

+1

SuggestAppendは現在の設定です。それをSuggestに設定しても、動作はまったく変更されません。それはツールストリップのコンボボックスであることが重要ですか? –

+1

それはおそらくケースです!私はツールボックスにコンボボックスを追加して、同じ動作が発生します。いくつかの回避策を探しています。 – mjpolak

+0

少なくとも私は狂っていません。 「再現できない」よりも不満足なことはありません。 –

関連する問題