次のコード スニペットは、特定のウィンドウを除いて、ほとんどの場合に機能します。たとえば、最新の Ubuntu では、ファイル エクスプローラーでフォルダーを選択することはできません。他のどこでも機能しているように見えますが、このギャップは重大です。XQueryPointer の使用方法に関係していると思われますが、見つけられるほぼすべての例を試しました。代わりにコンピューターのマウスを使用すると、問題なく動作します。参考までに: これらの質問に対する回答は既に試しました: Sending Programmatic events Capuring Mouse Input ですが、違いはありません...
コードは次のとおりです。
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
void SendClick(int button, int down) {
Display *display = XOpenDisplay(NULL);
XEvent event;
if(display == NULL)
{
return;
}
memset(&event, 0, sizeof(event));
event.xbutton.button = button;
event.xbutton.same_screen = True;
event.xbutton.subwindow = DefaultRootWindow (display);
while (event.xbutton.subwindow)
{
event.xbutton.window = event.xbutton.subwindow;
XQueryPointer (display, event.xbutton.window,
&event.xbutton.root, &event.xbutton.subwindow,
&event.xbutton.x_root, &event.xbutton.y_root,
&event.xbutton.x, &event.xbutton.y,
&event.xbutton.state);
}
event.type = down ? ButtonPress : ButtonRelease;
XSendEvent(display, PointerWindow, True, down ? ButtonPressMask : ButtonReleaseMask, &event);
XFlush(display);
XCloseDisplay(display);
}