C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 通知图标接收WM_LBUTTONDBLCLK但不接收WM_CONTEXTMENU大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在基于对话框的应用程序中添加一个通知图标,当双击该图标时它收到了WM_LBUTTONDBLCLK,但是当右键单击图标或者用键盘突出显示图标并且上下文菜单键是上传时,它没有收到WM_COntexTMENU按下.我根据 Windows 7.1 SDK示例中的示例使用了通知图标.所以,我不知道我哪里出错了,或者为什么这不起作用.

注意:如果我将WM_COntexTMENU更改为WM_RBUTTONUP,它会收到事件,但光标坐标是错误的.

/******************************************************************************/
/* Menu resource                                                              */
/******************************************************************************/
LANGUAGE LANG_NEUTRAL,SUBLANG_NEUTRAL
IDR_TRAymENU MENU
{
    POPUP ""
    {
        MENUITEM "&Show Status Window",IDM__SHOW_STATUS_WINDOW
        MENUITEM "&About",IDM__ABOUT
        MENUITEM SEPARATOR
        MENUITEM "&Exit",IDM__EXIT
    }
}

/******************************************************************************/
/* WinMain()                                                                  */
/******************************************************************************/
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )
{

    // ... code unrelated to icon

    // Enable Visual Styles
    InitCommonControls();

    // create the main dialog
    if( NULL == (hWnd=CreateDialog(hInstance,MAKEINTresourcE(IDD_MAINDLG),NULL,(DLGPROC)WndProC)) )
    {
        messageBox( NULL,"Error creaTing the main dialog!",MB_OK | MB_ICONERROR );
        return -1;
    }

    // ... code unrelated to icon

    MSG msg;
    while( Getmessage(&msg,0) && IsWindow(hWnd) )
    {
        Translatemessage(&msg);
        Dispatchmessage(&msg);
    }

    return 0; 

}    
/******************************************************************************/
/* WndProc()                                                                  */
/******************************************************************************/
BOOL CALLBACK WndProc(HWND hWndDlg,UINT message,WPARAM wParam,LPARAM lParam)
{

    switch(messagE)
    {
        case WM_INITDIALOG:
        {

            // ... code unrelated to icon
            hIcon = (HICON)LoadImage( GetModuleHandle(NULL),MAKEINTresourcE(IDI_DDCMp),IMAGE_ICON,16,LR_DEFAULTSIZE );

            // Setup the system tray icon
            memset( &nid,sizeof(NOTIFYICONDATA) );
            nid.cbSize = sizeof(NOTIFYICONDATA);
            nid.hWnd = hWndDlg;
            nid.uID = 0xDDc;
            nid.uFlags = NIF_ICON | NIF_messaGE | NIF_TIP | NIF_SHOWTIP;
            nid.uCallBACkmessage = WM_APP + 0xDDc;
            nid.hIcon = hIcon;
            strcpy( nid.szTip,"DDCMP Driver" );
            SHell_NotifyIcon( NIM_ADD,&nid );

            // ... code unrelated to icon

            return true;
        } break;

        case WM_APP + 0xDDC:
        {
            switch( LOWORD(lParam) )
            {
                case WM_COntexTMENU:
                {
                    messageBox( hWndDlg,"This message Box never shows up.",MB_OK | MB_SY@L_651_11@mODAL );
                    HMENU hMenu = LoadMenu(GetModuleHandle(NULL),MAKEINTresourcE(IDR_TRAymENU));
                    if( hMenu )
                    {
                        HMENU hSubMenu = GetSubMenu(hMenu,0);
                        if( hSubMenu )
                        {
                            SetForegroundWindow( hWndDlg );
                            POINT pt = { LOWORD(wParam),HIWORD(wParam) };
                            UINT uFlags = TPM_RIGHTBUTTON;
                            if( 0 != GetSy@L_651_11@metrics(SM_MENUDROPALIGNMENT) )
                                uFlags |= TPM_RIGHTALIGN;
                            else
                                uFlags |= TPM_LEFTALIGN;
                            TrackPopupMenuEx( hSubMenu,uFlags,pt.x,pt.y,hWndDlg,NULL );

                        }
                        Destroymenu( hMenu );
                    }
                } break;
                case WM_LBUTTONDBLCLK:
                    if( IsWindowVisible(hWndDlg) )
                        ShowWindow( hWnd,SW_HIDE );
                    else
                        ShowWindow( hWnd,SW_SHOW );
                    break;
            }
            return true;
        } break;

        case WM_CLOSE:
            ShowWindow( hWndDlg,SW_HIDE );
            break;

        case WM_DESTROY:
        case WM_QUIT:
        {
            SHell_NotifyIcon( NIM_@R_674_9421@E,&nid );

            // ... code unrelated to icon

            return true;
        } break;
    }

    return false;
}

这是Windows 7.1 SDK示例中的WndProc

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,LPARAM lParam)
{
    static HWND s_hwndFlyout = NULL;
    static BOOL s_fCanShowFlyout = TRUE;

    switch (messagE)
    {
    case WM_CREATE:
        // add the notification icon
        if (!AddNotificationIcon(hwnd))
        {
            messageBox(hwnd,L"Please read the ReadMe.txt file for troubleshooTing",L"Error adding icon",MB_OK);
            return -1;
        }
        break;
    case WM_COMMAND:
        {
            int const wmId = LOWORD(wParam);
            // Parse the menu SELEctions:
            switch (wmId)
            {
            case IDM_LOWINK:
                ShowLowInkBalloon();
                break;

            case IDM_NOINK:
                ShowNoInkBalloon();
                break;

            case IDM_PRINTJOB:
                ShowPrintJobBalloon();
                break;

            case IDM_OPTIONS:
                // placeholder for an options dialog
                messageBox(hwnd,L"Display the options dialog here.",L"Options",MB_OK);
                break;

            case IDM_EXIT:
                DestroyWindow(hwnd);
                break;

            case IDM_FLYOUT:
                s_hwndFlyout = ShowFlyout(hwnd);
                break;

            default:
                return DefWindowProc(hwnd,message,wParam,lParam);
            }
        }
        break;

    case WMAPP_NOTIFYCALLBACK:
        switch (LOWORD(lParam))
        {
        case NIN_SELECT:
            // for NOTIFYICON_VERSION_4 clients,NIN_SELECT is prerable to listening to mouse clicks and key presses
            // directly.
            if (IsWindowVisible(s_hwndFlyout))
            {
                HideFlyout(hwnd,s_hwndFlyout);
                s_hwndFlyout = NULL;
                s_fCanShowFlyout = falSE;
            }
            else if (s_fCanShowFlyout)
            {
                s_hwndFlyout = ShowFlyout(hwnd);
            }
            break;

        case NIN_BALLOONTIMEOUT:
            RestoreTooltip();
            break;

        case NIN_BALLOONUSERCLICK:
            RestoreTooltip();
            // placeholder for the user clicking on the balloon.
            messageBox(hwnd,L"The user clicked on the balloon.",L"User click",MB_OK);
            break;


        // 
        //
        // As you can very plainly see,the Windows SDK Sample ONLY used WM_COntexTMNEU
        // 
        //

        case WM_COntexTMENU:
            {
                POINT const pt = { LOWORD(wParam),HIWORD(wParam) };
                ShowContextMenu(hwnd,pt);
            }
            break;
        }
        break;

    case WMAPP_HIDEFLYOUT:
        HideFlyout(hwnd,s_hwndFlyout);
        s_hwndFlyout = NULL;
        s_fCanShowFlyout = falSE;
        break;

    case WM_TIMER:
        if (wParam == HIDEFLYOUT_TIMER_ID)
        {
            // please see the comment in HideFlyout() for an explanation of this code.
            KillTimer(hwnd,HIDEFLYOUT_TIMER_ID);
            s_fCanShowFlyout = TRUE;
        }
        break;
    case WM_DESTROY:
        @R_674_9421@eNotificationIcon();
        PostQuitmessage(0);
        break;
    default:
        return DefWindowProc(hwnd,lParam);
    }
    return 0;
}

解决方法

通知图标多年来改变了行为.出于与预先存在的代码兼容的原因,您必须选择加入新行为.如果您不选择加入,则不会收到WM_COntexTMENU消息.相反,你必须回应WM_RBUTTONUP.即使您从键盘调用上下文菜单,系统仍会发送WM_RBUTTONUP.您必须通过调用GetcursorPos获取光标位置,以便知道显示菜单的位置.

您可以通过在NIM_ADD调用调用SHell_NotifyIcon传递NIM_SETVERSION,按照documentation中的描述选择新行为(和WM_COntexTMENU).据推测,您正在查看的SDK示例是在某处做的.我的猜测是你的代码遗漏了什么.

文档的关键摘录在备注部分:

大佬总结

以上是大佬教程为你收集整理的c – 通知图标接收WM_LBUTTONDBLCLK但不接收WM_CONTEXTMENU全部内容,希望文章能够帮你解决c – 通知图标接收WM_LBUTTONDBLCLK但不接收WM_CONTEXTMENU所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。