【问题标题】:How to get menu shortcuts working in C# GUI-DLL?如何让菜单快捷方式在 C# GUI-DLL 中工作?
【发布时间】:2019-08-01 12:08:52
【问题描述】:

我构建了一个在 windows10 上运行的 C# GUI,通过 Python 和 Python 模块 CLR 进行控制。

很遗憾,菜单快捷方式不起作用。如果我将 GUI 构建为 .EXE,则快捷方式可以工作,在 GUI-C#-code 中调用处理程序,我可以将其转发到 Python 代码。但是,如果我将项目构建为 DLL,则不能将菜单项称为 [CTRL]+[S]。

GUI 是通过 Python 启动的:

clr.AddReference(os.getcwd() + os.sep + "PadTestGuiC.dll")
import PadTestGuiC  #this imports previous loaded class from dll
pgui = PadTestGuiC.PadTestGuiC()
pgui.m_pythonCB = pgui.pythonCallbackHandler(cbs1s1)
pguit = Thread(target=pgui.ShowDialog)

这是 c# gui 中的处理程序:

    private void helpToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        tabControl1.SelectedIndex = 1;
        addDoIts("help."); #this also shows information in textbox
    }

如果 GUI 构建为 DLL,则不会调用它。 我没有找到有关此问题的信息。为什么这不起作用?我是否需要通过捕获所有击键来创建解决方法?让快捷方式再次起作用的最简单方法是什么?

【问题讨论】:

  • 如何控制?通过使用窗口消息?可访问性?您确定将消息发送到正确的窗口吗?您正在就尚未发布或描述的代码寻求帮助。
  • 我为你添加了代码,虽然我认为这不是代码问题。如果它是 DLL,则不会调用自动生成的 C# 处理程序。如果你真的感兴趣:生成一个 GUI。创建简单的菜单实体。使用 GUI 编辑器添加快捷方式(在此之前您不需要生成任何代码)现在从菜单条目修改文本框。将其构建为 DLL。您可以为我通过鼠标或键盘 [alt]+[...] bot 调用菜单条目,快捷方式不起作用。我不寻求代码方面的帮助。我就 C# exe 和 dll gui menue 行为之间的区别寻求帮助。
  • 没有 DLL GUI、C# 或其他东西。在 Windows 和 Linux 上,菜单都是由窗口系统管理的资源。点击、短消息等都是操作系统发送到应用程序的消息处理泵的消息,该应用程序的消息处理泵采取行动。 不执行,因此它们没有消息泵。只有 可执行文件 运行。如果您从 Python 进程调用该 DLL,那么它就是运行泵的那个。应将键盘或鼠标消息发送到该进程(特别是其主窗口)
  • 如果我在菜单中使用鼠标或键盘,它会自动对点击做出反应并执行我在函数中添加的代码,该代码是由 VisualStudio 自动创建的。无需创建额外的处理程序。请自己试一试,再说,不是这样的。
  • 这不是 Windows 的工作方式。 automatically 部分是操作系统本身向应用程序的消息泵发送键或鼠标事件。另一方面,如果您加载库本身,您为什么要尝试单击任何内容?只需调用方法本身。无论如何,业务逻辑都不应该放在事件处理程序中,因此您可以调用实现所需功能的对象和方法。

标签: c# python user-interface dll windows-10


【解决方案1】:

我通过创建一个解决方法解决了这个问题:

我为表单上的键盘事件添加了 2 个额外的全局处理程序。

    private void PadTestGuiC_Key(object sender, KeyEventArgs e)
    {
        if (m_keylock >0)
            return;
        string s = e.KeyData.ToString();
        if (e.KeyCode.ToString().Length >2)     //it's modifier only
            return;
        m_keylock = 1;
        addDoIts("mnu:" + s);
    }

    private void PadTestGuiC_KeyUp(object sender, KeyEventArgs e)
    {
        m_keylock = 0;
    }

此消息被添加到 toolStripMenu 检测器中。例如:

if cmd in ("getStatusToolStripMenuItem", "mnu:S, Shift, Control"):
   doThis...

if cmd in ("getTimeToolStripMenuItem","mnu:T, Control"):
   doThat...

如果鼠标或键盘使用菜单条,则执行此操作;如果使用快捷方式,此操作也有效。

不幸的是,我必须在每个条目中添加 ,"mnu:?, ????"。那,以及手动快捷方式检测是我想要避免的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2011-03-11
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多