how use WM_MENUSELECT message correctly?

i have these WM_MENUSELECT message:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
static Menu *mMenu=NULL;
                static UINT Last_Menu_ID=-1;
                case WM_MENUSELECT:
                {
                    //menuhandle=(HMENU)lParam;
                    //mouse leave the previous menu item
                    if(GetMenuState((HMENU)lParam,Last_Menu_ID,MF_BYCOMMAND)!=-1)
                    {
                        if (mMenu!=NULL)
                        {
                            if(mMenu->MouseLeave)
                                mMenu->MouseLeave();
                            mMenu=NULL;
                        }
                        Last_Menu_ID=-1;
                    }
                    if( ((HIWORD(wParam) & MF_POPUP)==MF_POPUP) && (HIWORD(wParam) & MF_MOUSESELECT))
                    {
                        MENUITEMINFO menuInfo1;
                        menuInfo1.cbSize = sizeof(MENUITEMINFO);
                        menuInfo1.fMask=MIIM_DATA;
                        GetMenuItemInfo((HMENU)lParam,LOWORD(wParam), TRUE, &menuInfo1 );
                        mMenu = (Menu *) menuInfo1.dwItemData;
                        if (mMenu!=NULL)
                        {
                            if(mMenu->MouseEnter)
                                mMenu->MouseEnter();
                        }
                        Last_Menu_ID = LOWORD(wParam);
                    }
                    else if(((HIWORD(wParam) & MF_HILITE) || (HIWORD(wParam) & MF_MOUSESELECT)) && ((HIWORD(wParam) & MF_POPUP)!=MF_POPUP))
                    {

                        //Mouse Enter on actual menu item
                        MENUITEMINFO menuInfo1;
                        menuInfo1.cbSize = sizeof(MENUITEMINFO);
                        menuInfo1.fMask=MIIM_DATA;
                        GetMenuItemInfo((HMENU)lParam,LOWORD(wParam), FALSE, &menuInfo1 );
                        mMenu = (Menu *) menuInfo1.dwItemData;
                        if (mMenu!=NULL)
                        {
                            if(mMenu->MouseEnter)
                                mMenu->MouseEnter();
                            return 0;
                        }
                        Last_Menu_ID = LOWORD(wParam);
                        menuhandle=(HMENU)lParam ;

                    }

                    return DefWindowProc(HandleWindow, msg, wParam, lParam);

                }
                break;

these code seems working normaly, but on Debugger, i get a SIGSEGV error.
the WM_MENUSELECT message is for 1 get:
1 - Menu Handle;
2 - Mouse Enter;
3 - Mouse Leave.
how i know these is where is the problem!?!
because i just click on menu(just for open and close the menu and not item click), i get the error. but if i comment these code, the problem don't happens.
i need get the Menu Handle for use it on WM_SYSCOMMAND message.
can anyone tell me something?
i was doing some errors, like not testing the GetMenuItemInfo() return.
so heres the code corrected:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
case WM_MENUCOMMAND:
                {
                    MENUITEMINFO menuInfo;
                    menuInfo.cbSize = sizeof(MENUITEMINFO);
                    menuInfo.fMask=MIIM_DATA;
                    if(GetMenuItemInfo((HMENU)lParam,(UINT) wParam, TRUE, &menuInfo )!=FALSE)
                    {
                        Menu *mMenu = (Menu *) menuInfo.dwItemData;
                        if(mMenu!=NULL && mMenu->ispopup==false)
                        {
                            if(mMenu->Click)
                                mMenu->Click();
                            //mMenu->imgMenu.reset();
                        }
                        return 0;
                    }
                    //menuhandle=NULL;
                }
                break;

                //when the mouse move, enter, leave and leave the menu
                static Menu *mMenu=NULL;
                static UINT Last_Menu_ID=-1;
                case WM_MENUSELECT:
                {
                    //menuhandle=(HMENU)lParam;
                    //mouse leave the previous menu item
                    if(GetMenuState((HMENU)lParam,Last_Menu_ID,MF_BYCOMMAND)!=-1)
                    {
                        if (mMenu!=NULL)
                        {
                            if(mMenu->MouseLeave)
                                mMenu->MouseLeave();
                            mMenu=NULL;
                        }
                        Last_Menu_ID=-1;
                    }
                    if( ((HIWORD(wParam) & MF_POPUP)==MF_POPUP) && (HIWORD(wParam) & MF_MOUSESELECT))
                    {
                        MENUITEMINFO menuInfo1;
                        menuInfo1.cbSize = sizeof(MENUITEMINFO);
                        menuInfo1.fMask=MIIM_DATA;
                        if(GetMenuItemInfo((HMENU)lParam,LOWORD(wParam), TRUE, &menuInfo1 )==FALSE)
                            break;
                        mMenu = (Menu *) menuInfo1.dwItemData;
                        if (mMenu!=NULL)
                        {
                            if(mMenu->MouseEnter)
                                mMenu->MouseEnter();
                        }
                        Last_Menu_ID = LOWORD(wParam);
                    }
                    else if(((HIWORD(wParam) & MF_HILITE) || (HIWORD(wParam) & MF_MOUSESELECT)) && ((HIWORD(wParam) & MF_POPUP)!=MF_POPUP))
                    {

                        //Mouse Enter on actual menu item
                        MENUITEMINFO menuInfo1;
                        menuInfo1.cbSize = sizeof(MENUITEMINFO);
                        menuInfo1.fMask=MIIM_DATA;
                        if(GetMenuItemInfo((HMENU)lParam,LOWORD(wParam), FALSE, &menuInfo1 )==FALSE)
                            break;
                        mMenu = (Menu *) menuInfo1.dwItemData;
                        if (mMenu!=NULL)
                        {
                            if(mMenu->MouseEnter)
                                mMenu->MouseEnter();
                        }
                        Last_Menu_ID = LOWORD(wParam);
                        menuhandle=(HMENU)lParam ;

                    }
                    return 0;
                }
                break;

                //some menus items are on system menu control
                case WM_SYSCOMMAND:
                {
                    //testing if the menu handle isn't null and if the menu item is valid
                    if (GetMenuState(menuhandle,wParam,MF_BYCOMMAND)  !=0xFFFFFFFF && menuhandle!=NULL )
                    {
                        MENUITEMINFO menuInfo;
                        menuInfo.cbSize = sizeof(MENUITEMINFO);
                        menuInfo.fMask=MIIM_DATA;

                        GetMenuItemInfo(menuhandle,(UINT) wParam, FALSE, &menuInfo );

                        Menu *mMenu = (Menu *) menuInfo.dwItemData;
                        if (mMenu!=NULL && mMenu->ispopup==false)
                        {
                            if(mMenu->Click)
                                mMenu->Click();
                            //mMenu->imgMenu.reset();
                            //return 0;
                        }
                    }
                    //menuhandle=NULL;

                    else
                        return DefWindowProc(HandleWindow, msg, wParam, lParam);
                }
                break;

see the diference on WM_MENUSELECT. the error was from there.
thanks to all
Topic archived. No new replies allowed.