对你们来说很容易。
我在列表框顶部有一个文本框。
文本框用于过滤列表框中的数据。
所以...当用户在文本框中键入时,我想“捕获”向下/向上/向下翻页/向上翻页击键并将它们转发到列表框。
我知道我可以使用 Win32 API 并发送 WM_KeyDown 消息。但是必须有一些 .NET 方法来做到这一点。
对你们来说很容易。
我在列表框顶部有一个文本框。
文本框用于过滤列表框中的数据。
所以...当用户在文本框中键入时,我想“捕获”向下/向上/向下翻页/向上翻页击键并将它们转发到列表框。
我知道我可以使用 Win32 API 并发送 WM_KeyDown 消息。但是必须有一些 .NET 方法来做到这一点。
SendKeys.Send() 方法。
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
listBox1.Focus();
SendKeys.Send(e.KeyChar.ToString());
}
这是您可以选择列表项的代码。
private void Form1_Load(object sender, EventArgs e)
{
textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
textBox1.AutoCompleteSource=AutoCompleteSource.CustomSource;
string[] ar = (string[])(listBox1.Items.Cast<string>()).ToArray<string>();
textBox1.AutoCompleteCustomSource.AddRange(ar);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
listBox1.Text = textBox1.Text;
}
private void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.PageUp || e.KeyCode == Keys.PageDown || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
{
// Setting e.IsInputKey to true will allow the KeyDown event to trigger.
// See "Remarks" at https://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown(v=vs.110).aspx
e.IsInputKey = true;
}
}
private void textBox_KeyDown(object sender, KeyEventArgs e)
{
string send = "";
if (e.KeyCode == Keys.PageUp)
{
send = "PGUP";
}
else if (e.KeyCode == Keys.PageDown)
{
send = "PGDN";
}
else if (e.KeyCode == Keys.Up)
{
send = "UP";
}
else if (e.KeyCode == Keys.Down)
{
send = "DOWN";
}
if (send != "")
{
// We must focus the control we want to send keys to and use braces for special keys.
// For a list of all special keys, see https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send(v=vs.110).aspx.
listBox.Focus();
SendKeys.SendWait("{" + send + "}");
textBox.Focus();
// We must mark the key down event as being handled if we don't want the sent navigation keys to apply to this control also.
e.Handled = true;
}
}
您可以使用数据绑定
listBox1.DataBindings.Add("DataSource", textBox1, "Text", true, DataSourceUpdateMode.OnPropertyChanged).
Format += (sender, e) =>
{
e.Value = _strings.FindAll(s => s.StartsWith((string) e.Value));
};
在我们的 wpf 应用程序中,我们有一个过滤列表框的文本框,我们使用 previewkeyup 事件。在代码中,我们可以检查按下了哪个键(不要在我面前有我的代码,它类似于 e.Key == Key.UpArrow,无论哪种方式,C# 中都有一个内置类)。如果它是热键之一,我们会相应地操作用户控件。
对于列表框,我们将它扔到用户控件中并实现了一个接口,称为 NavigateableListbox 或类似的东西,强制它实现 MoveUp()、MoveDown()、PageUp()、PageDown() 等,所以文本框事件只是说如果e.Key = Key.UpArrow { mylistbox.MoveUp() }
SendKeys.Send()
方法在所有情况下都不起作用,因为Send()
方法可以寻址到另一个控件!
在 2020 年,确保 100% 的最佳解决方案是使用 SendMessage() 函数。
在 VB.Net 中,我使用以下代码
Public Declare Auto Function SendMessage Lib "user32.dll"
( ByVal hWnd As IntPtr
, ByVal wMsg As Int32
, ByVal wParam As Int32
, ByVal s As Int32
) As Int32
Private Const WM_CHAR As Int32 = &H102
SendMessage(txtInput.Handle, WM_CHAR, AscW(sValue.Chars(0)), 0)
txtInput
样本Textbox
控制在哪里。
就我而言,我单击控件中<div>
定义的 html 元素WebView
,当我单击它或鼠标移过时,该控件会改变颜色。当我单击这个时<div>
,调用 ScriptNotify() VB.Net 方法在Textbox
usingSendMessage()
函数中输入一些字符。
在旧解决方案中,我认为有时在调用方法WebView
之前获得焦点,SendKeys.Send()
以便传播的密钥不会发送到txtInput
文本框。
您可以使用旧的解决方案,但要确定有一天,SendKeys.Send() 函数会将您想要的内容发送到另一个句柄。