Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET Windows窗体中包装msctls_hotkey32_C#_.net_Winapi_Custom Controls_Pinvoke - Fatal编程技术网

C# 在.NET Windows窗体中包装msctls_hotkey32

C# 在.NET Windows窗体中包装msctls_hotkey32,c#,.net,winapi,custom-controls,pinvoke,C#,.net,Winapi,Custom Controls,Pinvoke,我试图让一个热键控件在C#中工作,它基于control类和msctls#U热键32 win32类。我所拥有的一切都很有效,尽管并不完美: class Hotkey : TextBox { protected override CreateParams CreateParams { get { CreateParams parms = base.CreateParams;

我试图让一个热键控件在C#中工作,它基于control类和msctls#U热键32 win32类。我所拥有的一切都很有效,尽管并不完美:

    class Hotkey : TextBox
    {
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams parms = base.CreateParams;
                parms.ClassName = "msctls_hotkey32";
                return parms;
            }
        }
        // (some other p/invoke stuff for HKM_SETHOTKEY, etc.)
    }
优点是它简单有效。缺点是它从TextBox继承了一系列不适用于此控件的功能。所以我的问题是——有没有更好的方法来做到这一点而不必重新发明轮子


谢谢。

您始终可以直接从System.Windows.Forms.Control继承。当然,还要添加您想要支持的特定方法和属性。您需要适当地设置控件样式以使其正常工作,下面是一个简单的示例

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
  class HotKey : Control  
  {
    public HotKey()
    {
      SetStyle(ControlStyles.UserPaint, false);
    }

    protected override CreateParams CreateParams
    {
      get
      {
        CreateParams cp = base.CreateParams;
        cp.ClassName = "msctls_hotkey32";

        return cp;
      }
    }
  }
}

以前,当我尝试从控件派生时,它不起作用-似乎控件是“只读”的,是灰色的,尽管文本光标在其中闪烁,但它不接受任何输入。不过,添加SetStyle调用修复了这一问题。它到底是做什么的?基本上它告诉控件绘画不是由控件代码完成的,默认情况下控件类假定控件的绘画是由控件自己完成的,但是在这种情况下,绘制需要由本机控件完成,因此将UserPaint标志设置为false会告诉控件不要引发绘制事件。我有一个问题:如何设置/获取热键控件中的文本?@aztack,要与热键控件交互,您应该查看HKM_*消息。