注册 登录
编程论坛 VC.NET论坛

【红烧小鲫鱼】关于在纯C语言中的Shell_NotifyIcon应用

qq492927689 发布于 2012-08-01 11:15, 5837 次点击
有如下代码,可以运行,但是程序会崩溃,希望各位帮我看看啦!

// HELLO.cpp : Defines the entry point for the application.
//
#include "resource.h"
#include <windows.h>
#define MYWM_NOTIFYICON WM_USER+1

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
     // TODO: Place code here.
    static TCHAR szAppName[] = TEXT ("HelloWin") ;
    HWND hwnd ;
    MSG msg ;
    WNDCLASS wndclass ;

    wndclass.style = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra = 0 ;
    wndclass.cbWndExtra = 0 ;
    wndclass.hInstance = hInstance ;
    wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor = LoadCursor (hInstance, MAKEINTRESOURCE(IDI_ICON1)) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName = NULL ;
    wndclass.lpszClassName = szAppName ;

    if (!RegisterClass (&wndclass))
    {
        MessageBox (NULL, TEXT("This program requires Wndows NT !"),
            szAppName, MB_ICONERROR | MB_OK) ;
        return 0 ;
    }

    hwnd = CreateWindow (szAppName,
        TEXT ("The Hello Program"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,            //windows菜单的句柄
        hInstance,
        NULL);

    ShowWindow (hwnd, nCmdShow) ;
    UpdateWindow (hwnd) ;

    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage (&msg) ;
        DispatchMessage (&msg) ;
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    //DWORD dwMessage;
    NOTIFYICONDATA lpdata;


    switch (message)
    {
    case MYWM_NOTIFYICON :
        {
            if(WM_LBUTTONDBLCLK == lParam)
            {
                ShowWindow (hwnd, SW_SHOW) ;
            }
            else if(WM_RBUTTONDOWN == lParam)
            {
                //弹出式菜单
                MessageBox (hwnd, TEXT("     打开hello对话框      "), TEXT("标题"), MB_OK);
            }
        }
    case WM_CREATE:
        {
            //dwMessage = NIM_ADD;

            lpdata.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
            lpdata.hWnd = hwnd;        //这个句柄的设置其实我觉得是错误的。
            lpdata.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
            lpdata.uCallbackMessage = MYWM_NOTIFYICON ;
            lpdata.uID = IDI_ICON1;
            lpdata.hIcon = LoadIcon(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDI_ICON1));
            strcpy(lpdata.szTip, "系统托盘示例");

            Shell_NotifyIcon(NIM_ADD, &lpdata);
            
               
            //MessageBox (hwnd, TEXT("     打开hello对话框      "), TEXT("标题"), MB_OK);

   
        }
    case WM_PAINT:
        {
            hdc = BeginPaint (hwnd, &ps);

            GetClientRect (hwnd, &rect);

            DrawText (hdc, TEXT ("Hello, Windows NT !"), -1, &rect,
                DT_SINGLELINE | DT_CENTER | DT_VCENTER);

            EndPaint (hwnd, &ps);
            return 0;
        }
    case WM_SYSCOMMAND :
        {
            if(SC_MINIMIZE == wParam)
            {
                ShowWindow (hwnd, SW_HIDE);
            }
            return 0;
        }
    case WM_DESTROY:
        {
            PostQuitMessage (0);
            return 0;
        }
    }
    return DefWindowProc (hwnd, message, wParam, lParam);
}

求指教啊!
0 回复
1