Thật đơn giản, chỉ cần chèn mã này vào lớp Cửa sổ của bạn.
Mã này sử dụng interop để xóa kiểu WS_MINIMIZEBOX và WS_MAXIMIZEBOX và thêm kiểu mở rộng WS_EX_CONTEXTHELP (dấu chấm hỏi sẽ chỉ hiển thị nếu bạn loại bỏ các nút thu nhỏ và tối đa).
EDIT: thêm phát hiện nhấp chuột vào nút trợ giúp, điều này được thực hiện bằng cách móc vào WndProc sử dụng HwndSource.AddHook và lắng nghe thông báo WM_SYSCOMMAND với wParam của SC_CONTEXTHELP.
Khi nhấp chuột được phát hiện, mã này sẽ hiển thị hộp thư, thay đổi điều này thành sự kiện, sự kiện được định tuyến hoặc thậm chí lệnh (đối với ứng dụng MVVM) được để lại dưới dạng bài tập cho người đọc.
private const uint WS_EX_CONTEXTHELP = 0x00000400;
private const uint WS_MINIMIZEBOX = 0x00020000;
private const uint WS_MAXIMIZEBOX = 0x00010000;
private const int GWL_STYLE = -16;
private const int GWL_EXSTYLE = -20;
private const int SWP_NOSIZE = 0x0001;
private const int SWP_NOMOVE = 0x0002;
private const int SWP_NOZORDER = 0x0004;
private const int SWP_FRAMECHANGED = 0x0020;
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_CONTEXTHELP = 0xF180;
[DllImport("user32.dll")]
private static extern uint GetWindowLong(IntPtr hwnd, int index);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hwnd, int index, uint newStyle);
[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags);
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
uint styles = GetWindowLong(hwnd, GWL_STYLE);
styles &= 0xFFFFFFFF^(WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
SetWindowLong(hwnd, GWL_STYLE, styles);
styles = GetWindowLong(hwnd, GWL_EXSTYLE);
styles |= WS_EX_CONTEXTHELP;
SetWindowLong(hwnd, GWL_EXSTYLE, styles);
SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
((HwndSource)PresentationSource.FromVisual(this)).AddHook(HelpHook);
}
private IntPtr HelpHook(IntPtr hwnd,
int msg,
IntPtr wParam,
IntPtr lParam,
ref bool handled)
{
if (msg == WM_SYSCOMMAND &&
((int)wParam & 0xFFF0) == SC_CONTEXTHELP)
{
MessageBox.Show("help");
handled = true;
}
return IntPtr.Zero;
}
Tại sao thanh tiêu đề? Hầu hết các ứng dụng tôi thấy đặt nó trong thanh trình đơn. –
Vấn đề là chúng ta sẽ sử dụng nó chủ yếu trên các cửa sổ hộp thoại, thường không có một thanh menu. Nhấp vào nó sẽ mang đến trợ giúp theo ngữ cảnh cho cửa sổ đó. Một cái gì đó giống như trong MS Word 2007 trong cửa sổ hộp thoại phông chữ. – Carlo