编辑控制捕获进入键
Edit control capture enter key
我有一个编辑控件
HWND hInput = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_INPUT, GetModuleHandle(NULL), NULL);
和一个按钮:
HWND hSendButton = CreateWindowEx(WS_EX_CLIENTEDGE,"BUTTON","Send!",
BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,
0,0,0,0,hwnd,(HMENU)IDC_MAIN_SENDBUTTON,GetModuleHandle(NULL),NULL);
在编辑控件中键入时是否有方法查看按下Enter键然后发个信息,好像按钮被按下了?
我想也许
SendMessage(hwnd,WM_COMMAND,(WPARAM)IDC_MAIN_SENDBUTTON,LPARAM(0));
可以完成发送消息的工作,但是我仍然无法捕获Enter键。
提前谢谢你。
您需要子类化编辑控件并处理WM_KEYDOWN消息。如果它是您想要的键,则发送消息,否则,让默认的编辑控制过程完成它的工作。
代码是这样的:
WNDPROC oldEditProc;
LRESULT CALLBACK subEditProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_KEYDOWN:
switch (wParam)
{
case VK_RETURN:
//Do your stuff
break; //or return 0; if you don't want to pass it further to def proc
//If not your key, skip to default:
}
default:
return CallWindowProc(oldEditProc, wnd, msg, wParam, lParam);
}
return 0;
}
void somecreateeditproc()
{
HWND hInput = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_INPUT, GetModuleHandle(NULL), NULL);
oldEditProc = (WNDPROC)SetWindowLongPtr(hInput, GWLP_WNDPROC, (LONG_PTR)subEditProc);
}
我在dialog:
BOOL CDialogObject::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
{
SendMessage(WM_COMMAND, (WPARAM)IDC_BUTTON3,LPARAM(0));
}
return CDialog::PreTranslateMessage(pMsg);
}
当前答案建议的方法陈旧。根据这个页面,有一种稍微简单的方法来子类化控件。
下面的示例显示了子类控件的窗口过程的框架实现。
LRESULT CALLBACK OwnerEditProc(HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (uMsg)
{
case WM_KEYDOWN:
.
.
.
return TRUE;
// Other cases...
}
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}
窗口过程可以附加到对话过程的
WM_INITDIALOG
处理程序中的控件上,如下例所示。
case WM_INITDIALOG:
{
HWND control = GetDlgItem(hDlg, IDC_EDIT);
SetWindowSubclass(control, OwnerEditProc, 0, 0);
return TRUE;
}
相关文章:
- 控制允许动态运行c++的并发操作数
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 从控制台中删除最后打印的元素
- 是否可以使用if constexpr删除控制流语句
- 无法在windows控制台中为C++程序提供必要的输入
- 编辑文件中的文本
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- 控制到达非空函数clang(-Wreturn-type)的末尾
- SetDlgItemInt 不会更改嵌入资源的编辑框
- 查找 GCD:并非所有控制路径都返回值
- 通过 API 控制 DJI 相机
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- 禁止在控制台上记录谷神星
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- C++,Qt:仅在双击后编辑qtablewidget项目
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 编辑字符串以包含括号 c++ 之间的变量
- Arduino函数无法编辑数组
- MFC编辑控制消息处理访问文档对象
- 编辑控制捕获进入键