2015-08-14 61 views
2

我有一个带有菜单和编辑类句柄的窗口。在菜单中,我有一个编辑部分,包含剪切,复制,粘贴,ecc等选项。键盘加速器不会捕获CTRL + A

我已经定义了2个键盘快捷键:

IDR_ACCELERATOR2 ACCELERATORS 
BEGIN 
    "A",   ID_EDIT_SALL,   VIRTKEY, CONTROL, NOINVERT 
    "Z",   ID_EDIT_UNDO,   VIRTKEY, CONTROL, NOINVERT 
END 

CTRL + Z的作品,但CTRL + A没有。 在WM_COMMAND情况下,我有这样的:

switch (LOWORD(wParam)) 
      { 
      case ID_EDIT_CLEAR: 
       SendMessage(hwndEdit, WM_CLEAR, 0, 0); 
       break; 
      case ID_EDIT_COPY: 
       SendMessage(hwndEdit, WM_COPY, 0, 0); 
       break; 
      case ID_EDIT_CUT: 
       SendMessage(hwndEdit, WM_CUT, 0, 0); 
       break; 
      case ID_EDIT_PASTE: 
       SendMessage(hwndEdit, WM_PASTE, 0, 0); 
       break; 
      case ID_EDIT_SALL: 
       SendMessage(hwndEdit, EM_SETSEL, 0, -1); 
       break; 
      case ID_EDIT_UNDO: 
       SendMessage(hwndEdit, WM_UNDO, 0, 0); 
       break; 
      } 

当我点击菜单选项Select All,选择效果很好,但它选择在编辑器中处理所有的文字,但是当我尝试使用键盘组合CTRL + A的Windows使得该错误声音

更新(当您试图删除一个空文档中的单词等):消息循环

BOOL msgCheck;  

while ((msgCheck = GetMessage(&msg, NULL, 0, 0)) != 0) 
     { 
      if (msgCheck == -1) 
      { 
       MessageBox(NULL, TEXT("Error!"), TEXT("Error"), MB_ICONERROR); 
       return -1; 
      } 
      else 
      { 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
      } 
     } 
+0

仅用于测试,在IDR_ACCELERATOR2加速器表中反转A和Z,看看会发生什么。 –

+0

好的,我认为CTRL + Z是由系统控制的,因为它没有改变任何东西。现在我尝试添加链接到CUT选项的CTRL + L(不是“系统”组合),它也不起作用。 – Astinog

+0

你说得对,Ctrl-Z是由Windows处理的。 –

回答

1

邻要使用加速器,您需要先加载加速器表。然后你需要在消息循环中检查它们。

你还没有向我们展示了,如果你已经下载加速器表,所以我已经展示了如何做它下面:

HANDLE hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR2)); 

你应该这样做内WinMain,然后修改喜欢你的消息循环如下:

BOOL msgCheck;  

while ((msgCheck = GetMessage(&msg, NULL, 0, 0)) != 0) 
     { 
      if (msgCheck == -1) 
      { 
       MessageBox(NULL, TEXT("Error!"), TEXT("Error"), MB_ICONERROR); 
       return -1; 
      } 
      else 
      { 
       // Add the below call to your message loop 
       if(!TranslateAccelerator(hwnd, hAccel, &msg)) 
       { 
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
       } 
      } 
     } 

hwnd是主窗口的句柄,hAccel是手柄您加载与前面的代码片段加速器表。

为了更好地理解我做了什么以及为什么,请查看official documentation for accelerator tables,特别是我链接到的代码示例。

通过阅读它,你会看到你的错误,并能够理解我所做的修复它们。

+0

谢谢,我完全忘了那部分。 – Astinog

+0

@Agostino:很高兴能帮到你。最好的祝福 :) – AlwaysLearningNewStuff