C++ c++;键盘加速器功能不工作

C++ c++;键盘加速器功能不工作,c++,c,winapi,resource-files,C++,C,Winapi,Resource Files,我一直在学习如何制作键盘加速键,但当我尝试时,它不起作用。。 代码如下: 资源文件:: #include "resource.h" IDM_MAINMENU MENU BEGIN POPUP "&File" BEGIN POPUP "&Program" BEGIN MENUITEM "LED O&N", IDM_PROGRAM

我一直在学习如何制作键盘加速键,但当我尝试时,它不起作用。。 代码如下:

资源文件::

    #include "resource.h"

    IDM_MAINMENU MENU
    BEGIN
        POPUP "&File"
        BEGIN
            POPUP "&Program"
                BEGIN

                MENUITEM "LED O&N", IDM_PROGRAM_LED_ON
                MENUITEM "LED O&FF", IDM_PROGRAM_LED_OFF
                MENUITEM "LED &BLINK", IDM_PROGRAM_LED_BLINK

                END
            MENUITEM SEPARATOR
            MENUITEM "E&xit", IDM_FILE_EXIT
        END
        POPUP "&Help"
        BEGIN
            MENUITEM "&Info", IDM_INFO
        END

    END


    app_icon   ICON "untitled.ico"

    IDA_ACCEL_TABLE ACCELERATORS
    BEGIN
       "x", IDA_CTRL_X, CONTROL, VIRTKEY
    END
头文件:

        #define  app_icon              1
        #define  IDM_MAINMENU          2
        #define  IDM_FILE_EXIT         3
        #define  IDA_ACCEL_TABLE       4
        #define  IDD_DIALOG            5
        #define  IDA_CTRL_X            6
        #define  IDM_PROGRAM_LED_OFF   7
        #define  IDM_PROGRAM_LED_BLINK 8
        #define  IDM_PROGRAM_LED_ON    9
        #define  IDM_INFO              10
main.exe文件::

        #include <windows.h>
        #include "resource.h"
        #include "define.h"

        LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);

        int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd){


        window win;
        MSG msg;
        HMENU hMenu;
        hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDM_MAINMENU));
        HACCEL hAccel;
        hAccel = LoadAccelerators(hInst, MAKEINTRESOURCE(IDA_ACCEL_TABLE));

        win.cbClsExtra = NULL;                             //Additional parameters
        win.cbWndExtra = NULL;                            //Additional parameters
        win.hbrBackground = (HBRUSH)COLOR_WINDOW ;                        //Sets background color for the window
        win.hCursor = LoadCursor(NULL, IDC_ARROW);      //The cursor that will appear in the window
        win.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(app_icon));                              //Icon for the window
        win.hInstance = hInst;                        //Handle to the application instance
        win.lpszClassName = "Window Class";          //The unique name of the window class
        win.lpszMenuName = NULL;                    //Used for menus
        win.style = NULL;                          //The look and feel of the window
        win.lpfnWndProc=(WNDPROC)WinProc;         //The callback procedure (more on that later)

        RegisterClass(&win);
        HWND hwnd = CreateWindow("Window Class", "Atmel Microcontroller Programmer", WS_OVERLAPPEDWINDOW, 550, 300, 350, 260, NULL, hMenu, hInst, NULL);
        ShowWindow(hwnd, SW_SHOWNORMAL);

        while(GetMessage(&msg, NULL, 0, 0)){


            if(!TranslateAccelerator(hwnd, hAccel, &msg)){
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }

        }

        return 0;

        }

        LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){

        switch (message){

        case WM_CREATE:{

            CreateWindow("BUTTON", "LED on", WS_VISIBLE | WS_CHILD | WS_BORDER, 20, 20, 70, 50, hWnd, (HMENU)1, NULL, NULL);
            CreateWindow("BUTTON", "LED off", WS_CHILD | WS_VISIBLE | WS_BORDER, 125, 80, 70, 50, hWnd, (HMENU)2, NULL, NULL);
            CreateWindow("BUTTON", "LED blink", WS_CHILD | WS_VISIBLE | WS_BORDER, 240, 140, 70, 50, hWnd, (HMENU)3, NULL, NULL);
            break;

        }

        case WM_COMMAND:{

        if(wParam == 1){

            system("avrdude");


        }

        if(wParam == 2){

            system("avrdude");


        }

        if(wParam == 3){

            system("avrdude");


        }

        if (wParam == IDA_CTRL_X){

            MessageBeep(message);

        }

            break;
        }

        case WM_DESTROY:{

            PostQuitMessage(0);
            return 0;
            break;

        }

        default:{

            return DefWindowProc(hWnd, message, wParam, lParam);

        }
        }


        }
#包括
#包括“resource.h”
#包括“define.h”
LRESULT回调WinProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM);
int-WINAPI WinMain(HINSTANCE-hInst、HINSTANCE-hPrevInst、LPSTR-lpCmdLine、int-nShowCmd){
窗口赢;
味精;
华浓华浓;
hMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDM_主菜单));
哈塞尔哈塞尔;
hAccel=装载加速器(hInst、MAKEINTRESOURCE(IDA_ACCEL_表));
win.cbClsExtra=NULL;//其他参数
win.cbWndExtra=NULL;//其他参数
win.hbrBackground=(HBRUSH)COLOR\u WINDOW;//设置窗口的背景色
win.hCursor=LoadCursor(NULL,IDC_箭头);//将显示在窗口中的光标
win.hIcon=LoadIcon(hInst,MAKEINTRESOURCE(app_icon));//窗口的图标
win.hInstance=hInst;//应用程序实例的句柄
win.lpszClassName=“窗口类”;//窗口类的唯一名称
win.lpszMenuName=NULL;//用于菜单
win.style=NULL;//窗口的外观
win.lpfnWndProc=(WNDPROC)WinProc;//回调过程(稍后将详细介绍)
注册类(&win);
HWND HWND=CreateWindow(“窗口类”,“Atmel微控制器程序员”,WS_OVERLAPPEDWINDOW,550、300、350、260,NULL,hMenu,hInst,NULL);
显示窗口(hwnd、SW_显示正常);
while(GetMessage(&msg,NULL,0,0)){
if(!TranslateAccelerator(hwnd、hAccel和msg)){
翻译信息(&msg);
发送消息(&msg);
}
}
返回0;
}
LRESULT回调WinProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM){
开关(信息){
案例WM_创建:{
CreateWindow(“按钮”,“LED亮起”,WS|U可见| WS|U子项| WS|U边框,20,20,70,50,hWnd,(HMENU)1,NULL,NULL);
CreateWindow(“按钮”、“LED熄灭”、WS|U子对象| WS|U可见| WS|U边框、125、80、70、50、hWnd、(HMENU)2、NULL、NULL);
CreateWindow(“按钮”、“LED闪烁”、WS|U子对象| WS|U可见| WS|U边框、240、140、70、50、hWnd、(HMENU)3、NULL、NULL);
打破
}
case WM_命令:{
if(wParam==1){
系统(“avrdude”);
}
如果(wParam==2){
系统(“avrdude”);
}
如果(wParam==3){
系统(“avrdude”);
}
if(wParam==IDA\u CTRL\u X){
MessageBeep(消息);
}
打破
}
案例WM_销毁:{
PostQuitMessage(0);
返回0;
打破
}
默认值:{
返回DefWindowProc(hWnd、message、wParam、lParam);
}
}
}
这是我一直在使用的所有文件,但还有一个头文件,我在其中定义了一些小东西,并添加了注释供我记住,但它太大了,我定义的最重要的东西是MessageBox消息和WNDCLASS窗口

我知道阅读这篇文章需要付出很多努力,但我真的需要帮助,谢谢大家=D

编辑


是的,如果你问我的问题,我正试图从计算机制作一个程序来控制我将从微控制器制作的电路,但我还没有做十六进制程序或电路,这就是我开始的全部内容。

我相信你的错误在这里:

if (wParam == IDA_CTRL_X){
    MessageBeep(message);
}
WM_命令的消息源是加速器时,
wParam
的高位字是
1
,低位字是加速器标识符。如果是菜单,则高位词为
0
,低位词为菜单标识符。(见附件。)

所以你要做的是:

switch (message)
{
    case WM_COMMAND:
       wmId    = LOWORD(wParam);
       wmEvent = HIWORD(wParam);

       switch(wmId)
       {
         case IDA_CTRL_X:
            MessageBeep(message);
            break; 
       }
    break;
}

看看这个:@dan你的意思是看这个而不是加速器,或者把它添加到代码中??因为据我所知,无论按键是否按下,它都会返回,因此您可以实现一个开关,如果按下一个按钮,则执行一些功能。=>只是用另一种方式做这件事。。。什么也没发生