C# 在.NET Windows窗体中包装msctls_hotkey32
我试图让一个热键控件在C#中工作,它基于control类和msctls#U热键32 win32类。我所拥有的一切都很有效,尽管并不完美: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;
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_*消息。