WinAPI中的菜单:我是否将WMARAM或WPARAM用于WM_COMMAND?

Pau*_*ich 1 c winapi menu wm-command

我最近开始自学WinAPI,所以请耐心等待.

编译器:TDM-GCC 4.9.2
操作系统:Windows 8.1 64位

我最近学会了如何使用资源创建菜单.关于这一点,我注意到处理菜单的WM_COMMAND消息有些奇怪.在MSDN文档告诉我,如果我要处理从菜单中发送的消息,命令项ID可以在WPARAM的低位字中; 所以我假设我的窗口过程中的代码看起来像这样:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, LPARAM lParam, WPARAM wParam)
{
    switch (msg)
    {
    case WM_COMMAND:
        switch (LOWORD(wParam))  //<--
        {
        case /*IDs go here*/:

            break;
        }
        break;

    //...
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,我注意到菜单中的命令项不起作用.经过一些调试,我发现wParam总是0,我的ID实际上是在lParam中!我快速更改了以下代码:

switch (lParam)
{
case /*IDs go here*/:

    break;
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理!

我的问题:为什么?
为什么文件说它在wParam中是什么时候我在lParam?

另外,这是我的resource.rc和resource.h文件,以防它有帮助:

"RESOURCE.H":

#define IDR_MYMENU 101

//These are appearing in LPARAM instead of WPARAM
#define ID_FILE_EXIT 9001
#define ID_STUFF_GO  9002
Run Code Online (Sandbox Code Playgroud)

"RESOURCE.RC":

#include "resource.h"

IDR_MYMENU MENU
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "E&xit", ID_FILE_EXIT
    END

    POPUP "&Stuff"
    BEGIN
        MENUITEM "&Go", ID_STUFF_GO
        MENUITEM "G&o somewhere else", 0, GRAYED
    END
END
Run Code Online (Sandbox Code Playgroud)



编辑7/23/15:已
解决.我的窗口程序签名错误.不敢相信它是如此微不足道的东西!谢谢,cremno!

cre*_*mno 5

您的代码中的WPARAM和LPARAM参数的顺序不正确:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, LPARAM lParam, WPARAM wParam)
Run Code Online (Sandbox Code Playgroud)

WindowProc回调函数 MSDN文档:

LRESULT CALLBACK WindowProc(
  _In_ HWND   hwnd,
  _In_ UINT   uMsg,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);
Run Code Online (Sandbox Code Playgroud)

只需交换它们即可修复代码:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Run Code Online (Sandbox Code Playgroud)