vs2019没有编译按键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vs2019没有编译按键相关的知识,希望对你有一定的参考价值。

参考技术A vs2019没有编译按键1. 单击“新建”按钮,然后单击“从现有代码创建项目”以在项目中创建项目。
2. 选择CreateVC项目类型,然后单击next。
3. 首先,单击“预览”按钮找到要加载现有项目的项目文件。

WinForms - 使用ProcessCmdKey VS KeyDown捕获按键组合

我的目标是实现一个自定义Control + S键按下处理程序,以连接到winforms应用程序中的自定义保存方法。

基于我的研发,有几种方法可以实现这一目标。首先,我尝试了明显的KeyPress事件处理程序。这不足以捕获我需要的按键(它没有在编辑器级别调用,这是我需要的)。

看起来更好的第二个选项是受保护的覆盖bool ProcessCmdKey(ref Message msg,Keys keyData)覆盖。这有效 - 它拦截了CTRL键点击,但显然我需要编写额外的代码来坚持按下CTRL键的事实并拦截下一次按键(在我的情况下将是S),然后执行自定义操作。

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.S | Keys.Control))
        {
            // This is never called
        }
        else if (keyData == (Keys.Menu | Keys.Alt))
        {
           // this is called each time I hit CTRL
        }
        return true;
    }

在我按下CTRL键后,似乎立即调用了ProcessCmdKey。

这篇文章建议创建一个KeyTracker类,它将持久按下按键并执行它需要做的事情:

Capture Key Sequence via ProcessCmdKey

这似乎是一个不错的选择,但在我开始实现纪念品跟踪模式之前,是否还有人对如何实现这个看似常见的功能有所了解?

另一种模式使用GetKeyboardState API函数:

Capture multiple key downs in C#

这看起来很有趣,但我不确定它是否符合我的需求。

[DllImport ("user32.dll")]

public static extern int GetKeyboardState(byte [] keystate);

private void Form1_KeyDown( object sender, KeyEventArgs e )
{
  byte[] keys = new byte[255];

  GetKeyboardState (keys);

  if( keys[(int)Keys.Up] == 129 && keys[(int)Keys.Right] == 129 )
  {
      Console.WriteLine ("Up Arrow key and Right Arrow key down.");
  }
}

谢谢你看看我的问题。

UPDATE

我已经为我的DataPanel添加了三个用于键处理的事件。当我在事件中设置断点时,VS都没有收到这些事件,所以这让我相信ProcessCmdKey是我的最佳选择。

如果我能让这些事件发挥作用,那也会很好:

        // Ctrl + S: Save Support
        this.ParentForm.KeyPreview = true;
        this.KeyPress             += new KeyPressEventHandler(DataPanel_KeyPress);
        this.KeyDown              += new KeyEventHandler(DataPanel_KeyDown);
        this.PreviewKeyDown       += new PreviewKeyDownEventHandler(DataPanel_PreviewKeyDown);

按任意键时似乎没有捕获到这些事件:

void DataPanel_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == (Keys.S | Keys.Control))
        {
            SessionManager.Trace.AddTrace("You Hit Save!!");
        }
    }

    void DataPanel_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == (Keys.S | Keys.Control))
        {
            SessionManager.Trace.AddTrace("You Hit Save!!");
        }
    }

    void DataPanel_KeyPress(object sender, KeyPressEventArgs e)
    {
        var key = e.KeyChar;
    }

UPDATE

我通过使用简单的KeyUp事件和KeyPreview标志解决了这个问题:

 void ShipmentDataPanel_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.S)
        {
            MessageBox.Show("Control + S Key Hit!");
        }
    }

谢谢。

答案

将我们表单的KeyPreview属性设置为true。此属性的摘要说:“获取或设置一个值,该值指示在将事件传递给具有焦点的控件之前表单是否将接收键事件。”然后使用KeyUp事件。除非KeyPressed它还提供有关特殊键的信息,如控制键。

另一答案

我解决了这个问题,

if(e.KeyData==(Keys.S | Keys.Control))

以上是关于vs2019没有编译按键的主要内容,如果未能解决你的问题,请参考以下文章

VS2017编译成功但是没有生成.exe文件

VS2019 C++ x64 与 x86 编译器的坑

VS2019继承的winforms控件未编译

win10下使用msys+vs2019编译ffmpeg源码

win10下使用msys+vs2019编译ffmpeg源码

win10下使用msys+vs2019编译ffmpeg源码