如何以编程方式调用应用程序菜单?

2024-06-18

我有自定义样式的非矩形透明窗口。

<Window
    x:Class="TestWindow" x:Name="Window"
    Width="350" Height="450"  AllowsTransparency="True"  WindowStyle="None"
WindowStartupLocation="CenterScreen" FontSize="14 px" FontFamily="Fonts/#Tahoma" 
Background="Transparent">

我有一个标题和系统按钮的网格,并且想通过右键单击它来显示应用程序菜单。目前应用程序菜单只能通过按 ALT+空格键显示。 我怎么解决这个问题?


于是,在谷歌了两个小时后,我终于找到了解决方案。

步骤1:定义RECT结构如下:

 [StructLayout(LayoutKind.Sequential)]
 public struct RECT
     {
          public int Left;
          public int Top;
          public int Right;
          public int Bottom;
     }

Step2:导入两个user32.dll函数:

[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

[DllImport("user32.dll")]
public static extern int TrackPopupMenu(int hMenu, int wFlags, int x, int y, int nReserved, int hwnd, ref RECT lprc);

第三步:添加“鼠标右键单击标题”事件处理程序:

private void headerArea_PreviewMouseDown(object sender, MouseButtonEventArgs e)
       {               
          switch (e.ChangedButton)
            {
              case MouseButton.Right:
                   {
                      // need to get handle of window
                      WindowInteropHelper _helper = new WindowInteropHelper(this);

                      //translate mouse cursor porition to screen coordinates
                      Point p = PointToScreen(e.GetPosition(this));

                      //get handler of system menu
                      IntPtr systemMenuHandle = GetSystemMenu(_helper.Handle, false);

                      RECT rect = new RECT();
                      // and calling application menu at mouse position.
                      int menuItem = TrackPopupMenu(systemMenuHandle.ToInt32(), 1,(int)p.X, (int) p.Y, 0, _helper.Handle.ToInt32(), ref rect);
                      break;
                   }                   
             }   
       }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式调用应用程序菜单? 的相关文章

  • ExecuteNonQueryAsync 并在 SQL 事务中提交

    我正在寻求对我创建的一段代码的帮助 我正在尝试在事务中从 C 进行异步 SQL 调用 例如我可能正在更新或删除表中的行 这是我到目前为止所拥有的 但我似乎无法找到有关在事务中执行此操作的太多信息 根据我在这里所拥有的以及到目前为止我所理解的
  • 资源文件中的控制字符 C#

    我想添加Left To Right控制字符在resource resx文件输入Visual Studio 我在互联网上搜索并找到了一个名为在 NET 资源文件中转义序列的另一种方法 http www devx com tips Tip 34
  • 带有成员 (operator[]) 函数的 invoke_result

    如何为成员函数正确调用invoke result 或者专门用于运算符成员函数 我试过std invoke result
  • 安装/编译 pylzma(lzma python 绑定)

    我已经向作者提出了这个问题website http www joachim bauch de projects pylzma comment page 1 comment 5211 但我想我也可以在这里问 我一直在尝试使用以下设置安装 py
  • 减少最大值并保存其索引

    int v 10 2 9 1 3 5 7 1 2 0 0 int maximo 0 int b 0 int i pragma omp parallel for shared v private i reduction max maximo
  • 如何更改控制台中的光标位置?

    我想用Console ReadLine 在上一行中并使其显示如下 HeresomeText gt input Not like HeresomeText gt input 可以做吗 使用 Write 方法而不是 WriteLine 方法 C
  • 使用 rhino 模拟进行 lambda 单元测试失败

    如果我有这个测试 Expect Call session Single
  • 更改 Json 中属性的键

    这些天我正在尝试制作一个 json 编辑器 与树视图一起使用 我确实更改了值函数 我也可以更改一些键 但我无法在对象中设置键 我可以设置值 SetValue ref JObject main JToken token JToken newV
  • 清除指针向量[重复]

    这个问题在这里已经有答案了 假设我定义了一个这样的类 class foo private std vector lt int gt v public void bar1 for int i 0 i lt 10 i int a new int
  • 对指针列表进行排序

    我再次发现自己在 C 中的一些非常简单的任务上失败了 有时我希望我能从 Java 中的 OO 中学到所有知识 因为我的问题通常是从像 Java 一样思考开始的 无论如何 我有一个std list
  • dotnet core 创建文件名中不含“CoreFxPipe_”的命名管道

    使用以下命令创建命名管道时命名管道客户端流 or 命名管道服务器流dotnet core 的类中 关联的 管道 看起来实际上是一个套接字 已自动将 CoreFxPipe 添加到文件名的前面 有没有一种非黑客的方法来防止这种行为 我只是希望文
  • 使用 MemoryCache 而不是普通的旧 Dictionary 的令人信服的理由是什么

    我刚刚遇到内存缓存 http msdn microsoft com en us library system runtime caching memorycache aspx这是 NET 4 中的新增功能 我知道如果你想的话它会很有用 限制
  • “未定义对 clrscr() 的引用;” [复制]

    这个问题在这里已经有答案了 include
  • 静态成员函数中的封闭类的 C++ 类型

    我认为这是完全不可能的 但如果呢 在任何版本的 C 中 是否有可能以某种方式获取静态成员函数中封闭类的类型 class Impossible public static void Fun typedef Impossible Enclosi
  • 在多个线程中添加和删除时 List 中的 null 值

    我知道 C System Collections Generic List 对象不是线程安全的 但我想知道为什么这段代码会生成空值 Task Run gt for var i 0 i lt 10 i var str Test i list
  • 获取上下文菜单的控制

    我有一个如下所示的上下文菜单 A 1 2 3 选择 1 2 或 3 后 我需要访问调用上下文菜单的对象 意思是如果这是 textbox1 的上下文菜单 那么我需要访问该对象 我该怎么做 忘了说了 这是一个WPF应用程序 所以我使用 Syst
  • 将变量传递给 SSIS 中的项目参数

    我是这个网络的新手 希望我能找到这个问题的答案 我有一个 SSIS 项目 其中包含多个使用项目参数的包 我正在尝试更新项目参数 例如 PeriodStart 2014年5月31日 我找不到动态写入项目参数的方法 我在 4 0 框架中使用 V
  • Cmake:在自定义目录中查找 protobuf 包

    我有 cmake 3 10 x 并下载了当前的 protobuf 源 3 6 1 使用 cmake 我创建了 bin 目录 PROTOBUF SOURCE DIR bin 在其中成功构建了该库 下一步我想在我的基于 cmake 的项目中使用
  • 我如何在 WPF 中模仿这种行为?

    我对 WPF 和 C 开发相当陌生 我正在制作这个应用程序 我不知道是否有人熟悉 VOIP App Discord 但他们有一个我非常喜欢的特定行为 并且想尝试使用 WPF 创建类似的风格 当您在 Discord 上添加服务器时 单击一个按
  • 如何用纯色填充位图?

    我需要使用唯一的 RGB 颜色创建 24 位位图 分辨率 100x100 像素 并将生成的图像保存到磁盘 我目前使用的是SetPixel http msdn microsoft com en us library 6c7eyzyb aspx

随机推荐