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);
}
}
}
GUI 기반 응용 프로그램에서 printf를 사용하는 이유는 무엇입니까? 디버그 창에서 출력을 보려면 TRACE 매크로를 사용하십시오. – Ajay
Meh 콘솔에 표시하는 것을 선호합니다. – Joshua
그건 당신이 선택한거야. 그러나 나에게 이해가되지 않는다. 디버그 - Windows는 콘솔 일뿐입니다. GUI 용으로 다른 콘솔을 실행한다고해서 논리적 인 의미는 아닙니다. GUI 프로그램은'main'이 아닌'WinMain'으로 시작해야합니다 (많은 이유가 있습니다). 그래서 프로그램이'WinMain'으로 시작한다면, printf는 작동하지 않을 것입니다. – Ajay