Я пытаюсь сделать приложение 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?
Я пытаюсь сделать приложение Winui3, которое включает в себя иконку. Когда я закрываю приложение, оно должно перейти в системный поднос и запустить в фоновом режиме. Когда я щелкнул правой кнопкой мыши на значок лотка, должны появиться два варианта меню: «Открыть» и «Выход». Когда «Открыть» нажимается, приложение должно вновь открыть, а когда «выход» нажимается, приложение должно закрыться. и щелкнуть правой кнопкой мыши заставляет меню появляться. Тем не менее, элементы меню не отзывчивы, и ничего не происходит, когда я нажимаю на пункты меню «Открыть» и «Выход». img alt = "Введите описание изображения здесь" src = "https://i.sstatic.net/6xamdmbm.png"/> emem>[b] mainwindow.xaml.cs [/b] [code]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 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 }
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; } } [/code] В методе [b] wndproc [/b] я никогда не получаю сообщение [b] wm_command [/b] и [b] wm_syscommand [/b] при работе с подносом и пунктами меню. Я также ожидаю, что меню исчезнет, когда я нажимаю где угодно, и мне нужно установить значок внутри значка лотка (в настоящее время оно пусто). Я не мог запустить [b] h.notifyicon [/b] и в настоящее время не хочу использовать это, поскольку это неполное. Как я могу сделать Надлежащий значок системы лотка в Winui3?
У меня есть приложение wpf , которое слушает копирование событий и хранит элементы буферизации в ListView .
Каждый ListViewItem содержит кнопку, которая выполняет команду ( EditClipboardTextCommand ), чтобы открыть EditTextWindow .
Проблема:...
У меня есть приложение WPF, которое прослушивает копирование событий и хранит элементы буфера об буферизации в списке Vist . Каждый ListViewItem содержит кнопку, которая выполняет команду ( EditClipboardTextCommand ) Чтобы открыть EditTextWindow ....
У меня есть приложение WPF, которое прослушивает копирование событий и хранит элементы буфера об буферизации в списке Vist . Каждый ListViewItem содержит кнопку, которая выполняет команду ( EditClipboardTextCommand ) Чтобы открыть EditTextWindow ....
Я пишу программу, и в какой-то момент внутри моей программы я хочу наблюдать за клавиатурой, пока моя программа не имеет фокуса. Я использую банку под названием JNativeHook , которую можно найти здесь
Я пишу программу, и в рамках своей программы в момент я хочу посмотреть клавиатуру, пока моя программа не имеет внимания. Я использую банку под названием «jnativehook» и можно найти здесь
на мою проблему:
Эта банка работает и захватывает каждое...