在Linux上使用F#和Eto.Forms,使用Gtk3后端.
编辑:添加此谷歌组线程的更新.我目前最好的理论是,Eto在其Gtk后端向窗口小部件添加按键事件的方式不允许您在默认处理程序处理它们之前捕获事件并阻止信号进一步传播.
我试图以一种形式捕获KeyDown事件:
let f = new Form(Topmost=true, ClientSize = new Size(600, 480))
f.KeyDown.Add(fun e ->
match e.Key with
| Keys.Up -> cursor.Move(Move_Up)
// ...
)
Run Code Online (Sandbox Code Playgroud)
但我遇到了这个问题: 向上,向下,向左和向右箭头键不会触发KeyDown事件
我无法弄清楚如何遵循那里提供的解决方案(覆盖PreviewKeyDown和设置e.IsInputKey = true).我尝试添加以下内容:
f.PreviewKeyDown.Add(fun e -> e.IsInputKey <- true)
Run Code Online (Sandbox Code Playgroud)
但那只是抱怨f.PreviewKeyDown说不存在.
编辑:这可能是这个Gtk#特定问题,而不是上面的问题
从版本0.15开始,Gtk#在将事件处理程序连接到信号时开始使用CONNECT_AFTER标志.这意味着事件处理程序直到默认信号处理程序之后才会运行,这意味着在事件处理程序运行时将更新窗口小部件.此更改的副作用是,在默认处理程序返回true以停止信号传播的情况下,将不会发出Gtk#事件.
更多细节:如果我同时按住修改键(例如shift +向上箭头),则KeyDown触发并e.Key匹配Keys.Up.也KeyUp总是触发,即使KeyDown没有.
我KeyDown该如何判断是否CtrlUp被按下了.
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up)
{
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
因为永远不会在同一秒内完全按下两个键,所以无法工作.你总是一开始Ctrl然后另一个......
首先看代码.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace winform_project
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
MessageBox.Show("Hello");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我能够检测字母数字键.但是我无法检测箭头键.
在这方面,任何帮助都将受到赞赏.
我遇到一种情况,我获得了一个 WinForms TextBox 实例,我想将自动完成功能附加到该实例。
我已经解决了自动完成(字符串匹配+下拉)的问题,并且到目前为止它工作可靠。
使用键盘导航下拉菜单的能力是什么(这是此类 UI 的标准)。
自然的解决方案是处理文本框的 KeyDown (或类似的)事件,并相应地移动下拉列表中的选择。
然而,要做到这一点,您需要重写该IsInputKey()事件以允许捕获箭头键事件。另一种方法是重写ProcessCmdKey()并处理那里的事件。这两个的问题是我无法覆盖任何内容,因为我无法替换文本框实例。
编辑:假设我有以下代码:
void _textBox_KeyDown(object sender, KeyEventArgs e)
{
if (_dropdown.Visible)
{
// TODO The stuff below fails because we need to either handle ProcessCmdKey or override IsInputKey
switch (e.KeyCode)
{
case Keys.Tab:
{
// click selected item
_dropdown.Items[GetSelectedItemIndex()].PerformClick();
break;
}
case Keys.Down:
{
// select next (or first) item
int i = GetSelectedItemIndex() + 1;
if (i >= _dropdown.Items.Count) i = 0;
_dropdown.Items[i].Select();
break; …Run Code Online (Sandbox Code Playgroud) 我正在使用Visual C#2005编写一个俄罗斯方块游戏.这是我设计的最广泛的程序.
我创建了一个形状类和一个块类来控制不同俄罗斯方块的位置,移动和显示.我有每个形状的moveDown(),moveLeft()和moveRight()函数(和相应的canMoveDown(),canMoveLeft(),canMoveRight()布尔函数,验证它可以移动).这一切都很美妙.
我想使用向下,向右和向左箭头键让用户移动块,除了使用计时器使形状每隔几毫秒自动下降一行.
我正在使用KeyDown事件处理程序来检查用户何时按下向下,向左和向右箭头键.这不是那么难.问题是我想允许对角线运动,我希望它能够顺利运行.我已经尝试了一系列不同的方法来解决这个问题,并取得了不同程度的成功.但我不能说得对......
我最成功的方法是使用三个布尔变量来跟踪向下,向左和向右箭头键被按下的时间.我会在KeyDown事件中将布尔值设置为true,在KeyUp事件中将布尔值设置为false.在KeyDown事件中,我还将告诉块如何移动,使用布尔变量来检查当前正在按下哪个组合.除了一件事,它的效果非常好.
如果我按下其中一个箭头键并按住,然后按下第二个箭头键然后释放第二个键,该块将完全停止移动,而不是继续向第一个箭头键的方向移动,而第一个箭头键尚未释放然而.我认为这是因为第二个键触发了KeyDown事件,并且在释放时,KeyUp事件被触发,并且KeyDown事件完全停止触发,即使第一个键被触发.
我不能为我的生活找到一个满意的解决方案来解决这个问题.
任何帮助将不胜感激=)
当按钮处于活动控制状态时,我需要根据箭头按下来调节程序流程。像这样:
Private Sub btn_OK_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles btn_OK.KeyDown
If e.KeyCode = Keys.Up Then
If mode = mymodes.first Then
firstcontrol.Focus()
Else
secondcontrol.Focus()
End If
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
正如我所看到的,按下任何箭头键根本不会触发 KeyDown 事件。相反,程序会执行一些内部功能,并通过使用表单的 Tab 键顺序(看起来是这样)来移动焦点。KeyPreview 在实际表单中设置为 true。
这里有什么方法可以使用箭头键获得所需的功能,而不需要子类化按钮并使用 ProcessCmdKey 吗?
在表格上我有一个带有一些按钮的面板.单击button1时,我将面板替换为具有标签的新UserControl(例如this.Controls.Clear(),this.Controls.Add(UserControl1)).除了我的userControl上的标签有一个KeyDown处理程序.它工作正常,事件触发,但不是键,向上,向下,向左和向右.任何人都可以解释为什么这些键之间存在差异?是什么决定事件是否被解雇?