C# Mono中的全局热键

C# Mono中的全局热键,c#,linux,mono,x11,C#,Linux,Mono,X11,我试图在Mono和X11中实现全局热键。不幸的是,应用程序使用了System.Windows.Forms,因此我不能使用中提出的GDK事件过滤器 使用XGrabKey是可行的,但我发现事件循环有问题。关闭应用程序时,处理X11事件循环的线程仍挂起在XNextEvent中。有办法吗?我不想使用xpend进行轮询。我是否可以取消XNextEvent或发送一个虚拟事件 我正在根窗口上调用XGrabKey,因此不幸的是,我没有收到任何类似destronNotify或unpnotify的事件,使用XSen

我试图在Mono和X11中实现全局热键。不幸的是,应用程序使用了
System.Windows.Forms
,因此我不能使用中提出的GDK事件过滤器

使用
XGrabKey
是可行的,但我发现事件循环有问题。关闭应用程序时,处理X11事件循环的线程仍挂起在
XNextEvent
中。有办法吗?我不想使用
xpend
进行轮询。我是否可以取消
XNextEvent
或发送一个虚拟事件


我正在根窗口上调用
XGrabKey
,因此不幸的是,我没有收到任何类似
destronNotify
unpnotify
的事件,使用
XSendEvent
发送
XClientMessageEvent
。创建您自己的atom并设置事件的
atom
成员,以便可能正在根窗口上监视
XClientMessageEvent
的其他应用程序不受影响


在事件循环中,检查此原子,如果得到它,则退出

为什么不在您的程序中加入特定于平台的部分?然后您可以使用GDK/GTK。Anyhoo..嗯,这是平台特定部分的一部分,因为显然在Windows上使用
XGrabKey
不起作用。但是从SWF到Gtk的迁移不是一个选项,仅仅因为这一点就把整个Gtk都拉进来似乎有点过头了。我知道这是一篇很老的帖子,但我也遇到了同样的情况,你似乎成功地让它工作了,你有没有这个代码可用的地方?或者你能把它作为一个解决方案吗?我现在也做了类似的事情。因为我需要一个窗口,所以我使用窗口的
destronotify
事件,而不是
ClientMessage
。不过,提议的解决方案也应该奏效。