0

바로 가기/컨텍스트 메뉴가있는 시스템 트레이 프로그램을 만들고 있지만 Windows 절차에서 WM_COMMAND 메시지를받을 수 없습니다. 메뉴 항목을 클릭하면 보내지 않고 메뉴를 올바르게 설정했는지 여부도 확인했습니다. 여기 Windows에서 WM_COMMAND 메시지를 수신하지 못했습니다. 절차

내 코드입니다 : ".. 그냥 당신이 게시 한 것 값을 돌려 WM_COMMAND 메시지를 게시하지 않는다"

#include <Windows.h> 
#include <stdio.h> 
#include "resource.h" 
#define WM_TRAYICON (WM_USER + 0x0001) //a custom message for the notification icon 

HWND hwnd; //window handle 
HINSTANCE hinst; //module handle 
WNDCLASSEX wnd; //window class 
MSG msg; //event message or notification 
NOTIFYICONDATA nid; //notification icon object 
HMENU cmenu; 
MENUITEMINFO menuitem1; 
MENUITEMINFO menuitem2; 
CURSORINFO cursor; 

LRESULT CALLBACK MainWProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 
    case WM_COMMAND: 
     printf("asfd\r\n"); 
     break; 
    case WM_CREATE: 
     printf("just created\r\n"); 
     break; 
    case WM_TRAYICON: 
     switch(LOWORD(lParam)) 
     { 
     case WM_CONTEXTMENU: 
      GetCursorInfo(&cursor); 
      //printf("xPos: %d\r\nyPos = %d\r\n\r\n", xPos, yPos); 
      TrackPopupMenuEx(cmenu, TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_NOANIMATION | TPM_HORIZONTAL | TPM_VERTICAL, cursor.ptScreenPos.x, cursor.ptScreenPos.y, hwnd, NULL); 
      //DestroyMenu(
      break; 
     } 
     break; 
    case WM_INITMENU: 
     printf("open menu\r\n"); 
     break; 
    case WM_DESTROY: 
     //clean things up 
     Shell_NotifyIcon(NIM_DELETE, &nid); 
     break; 
    default: 
     break; 
    } 

    return DefWindowProc(hwnd, uMsg, wParam, lParam); 
} 

void main() 
{ 
    int result; 

    hinst = GetModuleHandle(NULL); 
    cursor.cbSize = sizeof(cursor); 

    memset(&wnd, 0, sizeof(wnd)); 
    wnd.cbSize = sizeof(wnd); 
    wnd.lpszClassName = "MainWClass"; 
    wnd.lpfnWndProc = MainWProc; 
    wnd.hInstance = hinst; 
    result = RegisterClassEx(&wnd); 

    hwnd = CreateWindowEx 
     (
     0, //extended styles 
     wnd.lpszClassName, //class name 
     "Main Window", //window name 
     WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZEBOX, //style tags 
     CW_USEDEFAULT, //horizontal position 
     CW_USEDEFAULT, //vertical position 
     CW_USEDEFAULT, //width 
     CW_USEDEFAULT, //height 
     (HWND) NULL, //parent window 
     (HMENU) NULL, //class menu 
     (HINSTANCE) wnd.hInstance, //some HINSTANCE pointer 
     NULL //Create Window Data? 
     ); 
    if(!hwnd) 
    { 
     printf("CreateWindowEx failed: %d\n", GetLastError()); 
     Sleep(INFINITE); 
    } 

    nid.cbSize = sizeof(nid); 
    nid.hWnd = hwnd; 
    nid.uID = 1; 
    nid.uVersion = NOTIFYICON_VERSION_4; 
    nid.uCallbackMessage = WM_TRAYICON; 
    nid.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON1)); 
    strcpy(nid.szTip, "My Tooltip!"); 
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_SHOWTIP; 

    cmenu = CreatePopupMenu(); 
    menuitem1.cbSize = sizeof(menuitem1); 
    menuitem1.fMask = MIIM_TYPE; 
    menuitem1.fType = MFT_STRING; 
    menuitem1.hSubMenu = NULL; 
    //menuitem1.cch = ; 
    menuitem1.dwTypeData = "Open a world of wonder!"; 
    InsertMenuItem(cmenu, 0, true, &menuitem1); 

    if(! Shell_NotifyIcon(NIM_ADD, &nid)) 
    { 
     printf("Shell_NotifyIcon(NIM_ADD, &nid) failed.\r\n"); 
     Sleep(INFINITE); 
    } 
    if(! Shell_NotifyIcon(NIM_SETVERSION, &nid)) 
    { 
     printf("Shell_NotifyIcon(NIM_SETVERSION, &nid) failed.\r\n"); 
     Sleep(INFINITE); 
    } 

    UpdateWindow(hwnd); 
    for(; ;) 
    { 
     if(GetMessage(&msg, hwnd, 0, 0)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 
} 
+0

GUI 기반 응용 프로그램에서 printf를 사용하는 이유는 무엇입니까? 디버그 창에서 출력을 보려면 TRACE 매크로를 사용하십시오. – Ajay

+1

Meh 콘솔에 표시하는 것을 선호합니다. – Joshua

+0

그건 당신이 선택한거야. 그러나 나에게 이해가되지 않는다. 디버그 - Windows는 콘솔 일뿐입니다. GUI 용으로 다른 콘솔을 실행한다고해서 논리적 인 의미는 아닙니다. GUI 프로그램은'main'이 아닌'WinMain'으로 시작해야합니다 (많은 이유가 있습니다). 그래서 프로그램이'WinMain'으로 시작한다면, printf는 작동하지 않을 것입니다. – Ajay

답변

3

음, 당신은 의미 TPM_RETURNCMD 플래그를 통과

+0

오 똥 .... 나는 "메뉴 항목 식별자를 반환"wndproc에 그것을 반환하는 것을 의미한다고 생각. 정말 고마워! – Joshua

관련 문제