C 子类编辑控件而不破坏复制/粘贴

C 子类编辑控件而不破坏复制/粘贴,c,winapi,virtual-keyboard,editcontrol,C,Winapi,Virtual Keyboard,Editcontrol,我想创建一个编辑控件,用户只能在其中键入浮点数,但我也希望能够在此编辑中复制/粘贴/剪切文本。因此,我使用以下窗口过程对编辑控件进行了子类化: LRESULT回调FloatTextboxWindowProc(HWND windowHandle、UINT msg、WPARAM WPARAM、LPARAM LPARAM、UINT_PTR子类、DWORD_PTR refData) { 开关(msg) { 案例WM_CHAR: //如果字符不是数字或点,则拒绝它。 如果(!(('0')符合MSDN上的文

我想创建一个编辑控件,用户只能在其中键入浮点数,但我也希望能够在此编辑中复制/粘贴/剪切文本。因此,我使用以下窗口过程对编辑控件进行了子类化:

LRESULT回调FloatTextboxWindowProc(HWND windowHandle、UINT msg、WPARAM WPARAM、LPARAM LPARAM、UINT_PTR子类、DWORD_PTR refData)
{
开关(msg)
{
案例WM_CHAR:
//如果字符不是数字或点,则拒绝它。
如果(!(('0')符合MSDN上的文档:

我们首先在模块1中看到的函数将笔划转换为字符。该函数检查向下键消息并将其转换为字符。对于生成的每个字符,
TranslateMessage
函数将or消息放入窗口的消息队列。
的wParam参数该消息包含UTF-16字符

某些CTRL键组合转换为ASCII控制字符。例如,CTRL+A转换为ASCII CTRL-A(SOH)字符(ASCII值0x01)。对于文本输入,通常应过滤掉控制字符。此外,避免使用来实现键盘快捷键。相反,请使用消息;或者更好,使用加速表。下一主题中介绍了加速表

因此,在应用程序的消息循环中将CTRL-C、CTRL-V和CTRL-X序列的
WM_KEYDOWN
消息转换为
WM_CHAR
消息,其中包含ASCII控制字符0x03(ASCII
ETX
,aka
^C
),0x16(ASCII
SYN
,aka
^V
)和0x18(ASCII
可以
,也称为
^X

WM\u CHAR
携带翻译后的字符代码,而不是,这就是为什么
VK\u CANCEL
(0x03)、
VK\u IME\u ON
(0x16)和
VK\u FINAL
(0x18)让您感到困惑的原因。虚拟键代码不在
WM\u CHAR
中使用。
VK\u返回
VK\u返回
(但不是
VK\u DELETE
)过滤中的“工作”是因为根据文档,这些键被转换为ASCII控制字符:

当函数转换与字符键对应的虚拟键代码时,窗口过程接收字符消息。字符消息为、、和。典型的窗口过程忽略除
WM\u CHAR
以外的所有字符消息
TranslateMessage
函数生成
WM\u CHAR
消息当用户按下以下任意键时

  • 任意字符键
  • 退格
  • 输入(回车)
  • 电子稳定控制系统
  • SHIFT+ENTER(换行)
  • 标签
ENTER被转换为ASCII控制字符0x0D(ASCII
CR
,也称为
^M
),它与
VK\u RETURN
的数值相同

退格转换为ASCII控制字符0x08(ASCII
BS
,又称
^H
),它与
VK\U BACK
的数值相同

请注意,删除键不在翻译键列表中,因此标准删除键不会生成
WM_CHAR
消息,因为没有用于删除的ASCII控制字符(但是,DEL(.)数字键盘上的键可能会生成一个带有
VK\u DELETE
WM\u CHAR
消息。在这种情况下,
lParam
的第24位将为1)

因此,
DefWindowProc()
将这些用于剪贴板操作的特殊
WM_CHAR
消息分别转换为
WM_COPY
WM_PASTE
WM_CUT
消息。但是,您正在过滤掉这些消息,以便它们不会到达
defsublassproc()
,因此无法到达
DefWindowProc()

因此,正如您已经发现的,您确实需要允许这些消息通过您的筛选,例如:

LRESULT回调FloatTextboxWindowProc(HWND windowHandle、UINT msg、WPARAM WPARAM、LPARAM LPARAM、UINT_PTR子类、DWORD_PTR refData)
{
if(msg==WM_CHAR)
{
//如果字符不是数字或点,则拒绝它。
如果((
(wparam>='0'&&wparam根据MSDN上的文档:

我们首先在模块1中看到的函数将笔划转换为字符。该函数检查向下键消息并将其转换为字符。对于生成的每个字符,
TranslateMessage
函数将or消息放入窗口的消息队列。
的wParam参数该消息包含UTF-16字符

某些CTRL键组合转换为ASCII控制字符。例如,CTRL+A转换为ASCII CTRL-A(SOH)字符(ASCII值0x01)。对于文本输入,通常应过滤掉控制字符。此外,避免使用来实现键盘快捷键。相反,请使用消息;或者更好,使用加速表。下一主题中介绍了加速表

因此,在应用程序的消息循环中将CTRL-C、CTRL-V和CTRL-X序列的
WM_KEYDOWN
消息转换为
WM_CHAR
消息,其中包含ASCII控制字符0x03(ASCII
ETX
,aka
^C
),0x16(ASCII
SYN
,aka
^V
)和0x18(ASCII
可以
,也称为
^X

WM_CHAR
携带翻译后的字符代码,而不是,这就是为什么
VK_CANCEL
(0x03)、
VK_IME_ON
(0x16)和
VK_FINAL
(0x18)让您感到困惑的原因。虚拟键代码不在
WM_CHAR
中使用。
VK_RETURN