[英]Detecting KeyDown and KeyUp events with no form in focus (nor in foreground)
[英]Form KeyUp and KeyDown events to change variables
在我的應用程序中,我有:
private bool _clear = true;
此布爾值用於查看用戶在其中輸入新文本時(通過在TreeView中按TreeNode按下)是否應清除文本框。
然后,我的表單有以下兩個事件:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control)
{
_clear = false;
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control)
{
_clear = true;
}
}
我想以某種方式在用戶按住CTRL鍵時將其清除為FALSE,而在釋放CTRL時將清除返回TRUE。
顯然我在這里寫的代碼行不通! 有什么問題和/或有更好的方法?
這是一個簡單的修復程序,因為當您釋放密鑰時,KeyUp事件不會收到有關釋放的密鑰本身的任何信息,因此只需將屬性設置為true即可:
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
_clear = true;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control)
{
_clear = false;
}
}
如果您希望實時查看它,請在表單中添加標簽,並將其添加到“ _clear”變量的每個設置下:
label1.Text = _clear.ToString();
根據您的評論,將第二個代碼塊更改為:
if (e.KeyData.ToString() == "ControlKey, Control")
{
_clear = false;
}
else if(other shortcut conditionals go here or on other else if's)
{
_clear = true;
}
該條件唯一成立的時間是控制權本身被保持。 在其他情況下,是為了在按下ctrl后再按下另一個鍵時將_clear設置為true,這是因為一旦按下Control鍵,它將觸發KeyDown事件。
基於此更改,只要您照顧if語句之后的按鍵操作(例如else if()的操作),就無需在KeyUp事件中進行任何設置。
如果您需要一些更深入的信息,請參見我的答案,了解鍵及其屬性的復雜性 。
編輯#3:
只要在每個條件的第一行中將_clear設置為true,就應該能夠避免注釋中遇到的問題:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData.ToString() == "ControlKey, Control")
{
_clear = false;
}
else if(e.KeyData.ToString() == "O, Control")
{
_clear = true;
//Do other stuff here, such as opening a file dialog
}
}
如果您以其他方式執行此操作,則容易得多 。 檢查CTRL鍵是否在樹視圖的事件中按下。 像這樣:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
if ((Control.ModifierKeys & Keys.Control) == Keys.Control) {
// Control key is down, do something...
}
}
您需要將窗體的KeyPreview屬性更改為True。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.