Системный лоток иконка в Winui3: меню не работаетC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Системный лоток иконка в Winui3: меню не работает

Сообщение Anonymous »

Я пытаюсь сделать приложение Winui3, которое включает в себя иконку. Когда я закрываю приложение, оно должно перейти в системный поднос и запустить в фоновом режиме. Когда я щелкнул правой кнопкой мыши на значок лотка, должны появиться два варианта меню: «Открыть» и «Выход». Когда «Открыть» нажимается, приложение должно вновь открыть, а когда «выход» нажимается, приложение должно закрыться. и щелкнуть правой кнопкой мыши заставляет меню появляться. Тем не менее, элементы меню не отзывчивы, и ничего не происходит, когда я нажимаю на пункты меню «Открыть» и «Выход». img alt = "Введите описание изображения здесь" src = "https://i.sstatic.net/6xamdmbm.png"/>
emem> mainwindow.xaml.cs

Код: Выделить всё

public sealed partial class MainWindow : Window
{
private const uint WM_LBUTTONUP = 0x0202; // Left button up
private const uint WM_COMMAND = 0x0111; // Left button up
private const int WM_SYSCOMMAND = 0x0112; //

private const int WM_APP = 0x8000; // Custom Windows message

private const uint NIM_ADD = 0x00000000;
private const uint NIM_DELETE = 0x00000002;
private const uint NIF_MESSAGE = 0x00000001;
private const uint NIF_ICON = 0x00000002;
private const uint NIF_TIP = 0x00000004;
public const int LR_LOADFROMFILE = 0x00000010;
private const int ID_TRAY_EXIT = 0x2000;
private const int ID_TRAY_OPEN = 0x2001;

private const int WS_MAXIMIZEBOX = 0x00010000;
private const int GWL_STYLE = -16;

public const int IMAGE_ICON = 1;

private IntPtr _prevWndProc;
private delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
private WndProcDelegate _wndProcDelegate;
private IntPtr _hwnd;

[DllImport("user32.dll")]
private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, WndProcDelegate newProc);

[DllImport("user32.dll")]
private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, int newProc);

[DllImport("user32.dll")]
private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetCursorPos(out POINT lpPoint);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern IntPtr CreatePopupMenu();

[DllImport("user32.dll")]
private static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);

[DllImport("user32.dll", SetLastError = true)]
private static extern bool AppendMenu(IntPtr hMenu, uint uFlags, uint uIDNewItem, string lpNewItem);

[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLongPtr(IntPtr hWnd, int nIndex);

[DllImport("user32.dll", SetLastError = true)]
private static extern bool DestroyMenu(IntPtr hMenu);

[DllImport("user32.dll", SetLastError = true)]
private static extern bool TrackPopupMenu(IntPtr hMenu, uint uFlags, int x, int y, int nReserved, IntPtr hWnd, IntPtr prcRect);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetWindowLongPtr(HandleRef hWnd, int nIndex, IntPtr dwNewLong);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr LoadImage(IntPtr hInst, string lpszName, UInt32 uType, int cxDesired, int cyDesired, UInt32 fuLoad);

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern bool Shell_NotifyIcon(uint dwMessage, [In] ref NOTIFYICONDATA lpdata);

public MainWindow()
{
this.InitializeComponent();
_wndProcDelegate = new WndProcDelegate(WndProc);
_hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this);

_prevWndProc = SetWindowLongPtr(_hwnd, GWLP_WNDPROC, _wndProcDelegate);  // GWLP_WNDPROC

CreateNotifyIcon();
this.Closed += MainWindow_Closed;
}

private const int GWLP_WNDPROC = -4;

private void myButton_Click(object sender, RoutedEventArgs e)
{
HiddenButton.Content = "Clicked";
}

private void CreateNotifyIcon()
{
NOTIFYICONDATA notifyIconData = new NOTIFYICONDATA
{
cbSize = (uint)Marshal.SizeOf(typeof(NOTIFYICONDATA)),
hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this), // Correctly obtain the window handle
uID = 1,
uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP,
uCallbackMessage = WM_APP + 1, // Custom message ID
szTip = "WinUI 3 System Tray Sample",
hIcon = LoadImage(IntPtr.Zero, @".\Properties\Icon\logo.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE) // Extracting icon from the executable
};

Shell_NotifyIcon(NIM_ADD, ref notifyIconData); // NIM_ADD to add the icon
}

private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
{
Debug.WriteLine($"msg: {msg}, lParam: {lParam}, wParam: {wParam & 0xFFFF}");
if( msg == WM_APP +1)
{
if (lParam.ToInt32() == WM_LBUTTONUP)
{
NotifyIcon_Click(this, EventArgs.Empty);
}
else if (lParam.ToInt32() == 0x0205) // WM_RBUTTONUP (right button up)
{
ShowContextMenu();
}

Debug.WriteLine($"msg: {msg}, lParam: {lParam.ToInt32()}");
return IntPtr.Zero;
}
else if(msg == WM_COMMAND)
{
int commandID = wParam.ToInt32() & 0xFFFF;
if(commandID == ID_TRAY_OPEN)
{
NotifyIcon_Click(this, EventArgs.Empty);
}
else if (commandID == ID_TRAY_EXIT) {
Application.Current.Exit();
}
Debug.WriteLine($"msg: {msg}, lParam: {lParam}, wParam: {wParam.ToInt32() & 0xFFFF}");
}
else if(msg == WM_SYSCOMMAND)
{
int commandID = wParam.ToInt32() & 0xFFFF;
if(commandID == ID_TRAY_OPEN)
{
NotifyIcon_Click(this, EventArgs.Empty);
}
else if (commandID == ID_TRAY_EXIT) {
Application.Current.Exit();
}
Debug.WriteLine($"msg: {msg}, lParam: {lParam}, wParam: {wParam.ToInt32() &  0xFFFF}");
}

return CallWindowProc(_prevWndProc, hWnd, msg, wParam, lParam);
}

private void ShowContextMenu()
{
// Get the current cursor position
if (GetCursorPos(out POINT cursorPos))
{
IntPtr hMenu = CreatePopupMenu();
AppendMenu(hMenu, 0x0, ID_TRAY_OPEN, "Open");
AppendMenu(hMenu, 0x0, ID_TRAY_EXIT, "Exit");

SetForegroundWindow(hMenu);
// Show the menu at the current cursor position
TrackPopupMenu(hMenu, 0x100, cursorPos.X, cursorPos.Y, 0, _hwnd, IntPtr.Zero);
DestroyMenu(hMenu);
}
}

private void MainWindow_Closed(object sender, WindowEventArgs e)
{
e.Handled = true;
this.AppWindow.Hide();
// Show notification icon in the system tray
}

private void NotifyIcon_Click(object sender, EventArgs e)
{
this.AppWindow.Show();
this.Activate();
}

public void ShowWindow()
{
this.AppWindow.Show();
this.Activate();
}
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct NOTIFYICONDATA
{
public uint cbSize;
public IntPtr hWnd;
public uint uID;
public uint uFlags;
public uint uCallbackMessage;
public IntPtr hIcon;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string szTip;
public uint dwState;
public uint dwStateMask;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string szInfo;
public uint uTimeoutOrVersion;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string szInfoTitle;
public uint dwInfoFlags;
public Guid guidItem;
public IntPtr hBalloonIcon;
}
}
В методе wndproc я никогда не получаю сообщение wm_command и wm_syscommand при работе с подносом и пунктами меню. Я также ожидаю, что меню исчезнет, ​​когда я нажимаю где угодно, и мне нужно установить значок внутри значка лотка (в настоящее время оно пусто). Я не мог запустить h.notifyicon и в настоящее время не хочу использовать это, поскольку это неполное.
Как я могу сделать Надлежащий значок системы лотка в Winui3?

Подробнее здесь: https://stackoverflow.com/questions/793 ... s-not-work
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»