如何按 Ctrl + A 选择编辑控件中的所有文本? 我可以在WndProc中为父窗口捕获 Ctrl + A 。 但我不知道如何捕获 ctrl + a ,它们被用于编辑控制。 我也尝试使用加速器,但它同样适用于父窗口。 谢谢。 编辑:1-st最简单的方法 这个方法基于@phord在这个问题中的答案: win32 select all on edit ctrl (textbox)
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
if (msg.message == WM_KEYDOWN && msg.wParam == 'A' && GetKeyState(VK_CONTROL) < 0)
{
HWND hFocused = GetFocus();
wchar_t className[6];
GetClassName(hFocused, className, 6);
if (hFocused && !wcsicmp(className, L"edit"))
SendMessage(hFocused, EM_SETSEL, 0, -1);
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
编辑:第二种方法 需要使用CreateAcceleratorTable + TranslateAccelerator函数:
//全局变量:
enum {ID_CTRL_A = 1};
HACCEL accel;
//主程序
ACCEL ctrl_a;
ctrl_a.cmd = ID_CTRL_A; // Hotkey ID
ctrl_a.fVirt = FCONTROL | FVIRTKEY;
ctrl_a.key = 0x41; //'A' key
accel = CreateAcceleratorTable(&ctrl_a, 1); //we have only one hotkey
// GetMessage循环的外观
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
if (!TranslateAccelerator(hWnd, accel, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
//在WndProc中我们必须添加下一个案例
case WM_COMMAND:
{
if (LOWORD(wParam) == ID_CTRL_A && HIWORD(wParam) == 1)
{
//on which control there was pressed Ctrl+A
//there is no way of getting HWND through wParam and lParam
//so we get HWND which currently has focus.
HWND hFocused = GetFocus();
wchar_t className[6];
GetClassName(hFocused, className, 6);
if (hFocudsed && !wcsicmp(className, L"edit"))
SendMessage(hFocused, EM_SETSEL, 0, -1);
}
}
break;
case WM_DESTROY:
{
DestroyAcceleratorTable(accel);
PostQuitMessage(0);
}
break;
正如您所看到的,这很简单。
答案 0 :(得分:9)
无需处理WM_KEYDOWN!我知道这里的大多数例子(以及CodeProject和许多其他地方)都说有,但它无法治愈每当WM_CHAR出现时都会产生的嘟嘟声。
相反,试试这个:
LRESULT CALLBACK Edit_Prc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
if(msg==WM_CHAR&&wParam==1){SendMessage(hwnd,EM_SETSEL,0,-1); return 1;}
else return CallWindowProc((void*)WPA,hwnd,msg,wParam,lParam);
}
请记住使用WPA = SetWindowLong(...)将EDIT控件子类化为此Edit_Prc(),其中WPA是CallWindowProc的窗口过程地址(...)
答案 1 :(得分:6)
首先更改编辑控件的WindowProc:
if (!(pEditProc = (WNDPROC)SetWindowLong(hEdit, GWL_WNDPROC, (LONG)&EditProc)))
{
assert(false);
return false;
}
然后在新窗口proc中,处理ctrl + a:
LRESULT CALLBACK EditProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
if (msg == WM_KEYDOWN) {
if (GetKeyState(VK_CONTROL) & 0x8000 && wParam == 'A') {
SendMessage(hwnd, EM_SETSEL, 0, -1);
}
}
return CallWindowProc(pEditProc, hwnd, msg, wParam, lParam);
}
答案 2 :(得分:1)
好消息!
似乎Win10上的Edit Controls(不是多行)现在支持Ctrl + A。
我当前的Windows SDK版本是10.0.17763.0。
仅在使用纯Windows API创建的简单GUI APP上进行了测试。
MFC APP应该具有相同的结果。
测试二进制平台是x86,操作系统是Win10 x64。
答案 3 :(得分:0)
我还使用加速器表编写了自己的版本。 这有点清理了WinMain,我试图尽可能地将所有内容都作为n00b证明(因为我是一个)。 由于不需要枚举,因此也可以省略枚举。
如上所述,我只是使用winapi的初学者,所以请务必 如果我错了,请纠正我。
在&#34; Resource.h&#34;我定义了两个ID 一个用于我们将使用的加速器表, 一个用于我们将要使用的selectall命令。
在Resource.h内:
#define IDR_ACCEL1 101
#define ID_SELECT_ALL 9003
然后在资源文件内部(在vs2017中,这是 PROJECTNAME .rc) 我们定义加速器表。 的 PROJECTNAME .RC:强>
IDR_ACCEL1 ACCELERATORS
{
0x41, ID_SELECT_ALL, VIRTKEY, CONTROL // ctrl-A
}
0x41是virtkey&#39; a&#39;。
ID_SELECT_ALL(将是命令的ID,这应该是我们在Resource.h文件中定义的ID。
VIRTKEY关键字表示0x41应该被解释为虚拟键。
CONTROL是将a与(ctrl + a)组合所需的修饰符。
然后在WinMain函数内加载加速器:
HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCEL1));
if (hAccel == NULL)
{
MessageBox(NULL, _T("Failed to load accelerator table!"),_T("Error"), MB_OK | MB_ICONEXCLAMATION);
return 0;
}
注意:在尝试定义hAccel之后,我们会检查是否已分配有效句柄。 虽然这不是必需的,但我相信这是更好的惯例。
在此之后我们将TranslateAccelerator函数添加到消息循环中,因此可以在窗口过程中处理该命令:
BOOL bRet;
while (bRet = GetMessage(&Msg, NULL, 0, 0) > 0)
{
if (bRet == -1)
{
// Error handling can be done here.
}
else if (!TranslateAccelerator(hwnd, hAccel, &Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
然后最终进入Window程序 我们按如下方式添加代码:
switch(msg)
{
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case ID_SELECT_ALL:
{
HWND hEdit;
hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT) // Define IDC_MAIN_EDIT with an integer value in "Resource.h".
}
break;
}
break;
}
}
注意:传递给WM_COMMAND的消息是我们为ctrl + a accel定义的ID。
我希望这能帮助其他人。