LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3698|回复: 5

GTK+ 或 wxWidgets 怎么 发送消息?

[复制链接]
发表于 2007-10-11 14:12:57 | 显示全部楼层 |阅读模式
想写这么一个程序,接收鼠标滚轮滚动消息 ,然后发送滚动消息给另外一个窗口 ,
GTK+ 或 wxWidgets 有 获取窗口句柄,发送消息函数吗?

win下的GetWindow和SendMessage类似的
发表于 2007-10-12 09:30:37 | 显示全部楼层

void                  g_signal_emitv        (const GValue       *instance_and_params,
                                             guint               signal_id,
                                             GQuark              detail,
                                             GValue             *return_value);
void                  g_signal_emit_valist  (gpointer            instance,
                                             guint               signal_id,
                                             GQuark              detail,
                                             va_list             var_args);
void                  g_signal_emit         (gpointer            instance,
                                             guint               signal_id,
                                             GQuark              detail,
                                             ...);
GTK没有窗口句柄的概念,而是GType Instance,每种特定的GType都有其可以触发的一些消息,GtkWindow也不例外。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-12 16:16:12 | 显示全部楼层
楼上好人呐,就你回我的帖


-----------
GTK没有窗口句柄,一个程序要怎么获得其它窗口程序的信息,比如位置,大小,窗口标题等等?
回复 支持 反对

使用道具 举报

发表于 2007-10-15 22:58:32 | 显示全部楼层
这个和 gtk 没有关系, 得用 X11 底层 API.

X11 自带了 xwininfo 和 xprop 两个小工具, 可以帮助用户查看某个窗口的信息. 既可以用鼠标选择, 也可以根据窗口的名称或者id. 你研究一下这两个工具的源代码, 看看它们怎么实现的.

原来是通过递归来找的, Xlib 没有提供直接的 API
  1. /*
  2. * Window_With_Name: routine to locate a window with a given name on a display.
  3. *                   If no window with the given name is found, 0 is returned.
  4. *                   If more than one window has the given name, the first
  5. *                   one found will be returned.  Only top and its subwindows
  6. *                   are looked at.  Normally, top should be the RootWindow.
  7. */
  8. Window Window_With_Name(dpy, top, name)
  9.      Display *dpy;
  10.      Window top;
  11.      char *name;
  12. {
  13.     Window *children, dummy;
  14.     unsigned int nchildren;
  15.     int i;
  16.     Window w=0;
  17.     char *window_name;
  18.     if (XFetchName(dpy, top, &window_name) && !strcmp(window_name, name))
  19.       return(top);
  20.     if (!XQueryTree(dpy, top, &dummy, &dummy, &children, &nchildren))
  21.       return(0);
  22.     for (i=0; i<nchildren; i++) {
  23.         w = Window_With_Name(dpy, children[i], name);
  24.         if (w)
  25.           break;
  26.     }
  27.     if (children) XFree ((char *)children);
  28.     return(w);
  29. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-16 18:55:47 | 显示全部楼层
楼上的,真是太感谢了

看来发消息也得用找这么底层的库来实现了
回复 支持 反对

使用道具 举报

发表于 2008-2-1 15:31:47 | 显示全部楼层
不需要底层的库,GTK+自己也可以IPC,应该是跨平台的在win32下xid换成HWND。
向别的应用发消息:
用gdk_event_send_client_message (GdkEvent *event, guint32 xid);
或者gdk_event_send_client_message_toall(GdkEvent *event);
自己的应用注册消息及消息处理函数:
gdk_add_client_message_filter (GdkAtom message_type,
GdkFilterFunc func, gpointer data);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表