• 9106阅读
  • 9回复

xlib下怎么使用快捷键组合?? [复制链接]

上一主题 下一主题
离线bingogo
 
只看楼主 倒序阅读 楼主  发表于: 2008-11-09
— 本帖被 XChinux 从 Qt Installing & Deployment 移动到本区(2008-11-30) —
关键词: xlib快捷键
如题~
比如说我要使用xgrabkey( ) ;
怎么使用ALT或者Ctrl键,
实现ALT+Ctrl或者是Ctrl+Fn的功能呢?

看了XLIB的文档,看不懂,才提问的!

谢谢!
[ 此贴被XChinux在2009-01-06 14:12重新编辑 ]
离线bingogo
只看该作者 1楼 发表于: 2008-11-09
因为用QT的时候要用到底层的功能
只好动用X11了,不过被快捷键组合给难住了。。。
离线bingogo
只看该作者 2楼 发表于: 2008-11-10
我现在想使用ALT+CTRL的快捷键组合。

KeyCode key = XKeysymToKeycode(dpy,XK_Alt_R);
XGrabKey(dpy, key , AnyModifier , root,True, GrabModeAsync, GrabModeAsync);

or

KeyCode key = XKeysymToKeycode(dpy,XK_Control_R);
XGrabKey(dpy, key , AnyModifier , root,True, GrabModeAsync, GrabModeAsync);

都可以正常使用。

但是
KeyCode key = XKeysymToKeycode(dpy,XK_Control_R | XK_Alt_R );
XGrabKey(dpy, key , AnyModifier , root,True, GrabModeAsync, GrabModeAsync);
这样就不行了。

在XLIB里,快捷键组合是怎么实现的?
需要修改Modifier??
离线mumutouv

只看该作者 3楼 发表于: 2008-11-10
  xmk = XGetModifierMapping (dpy);
    if (xmk)
    {
        map = xmk->modifiermap;
        for (m = 0; m < 8; m++)
            for (k = 0; k < xmk->max_keypermod; k++, map++)
            {
                if (*map == XKeysymToKeycode (dpy, XK_Num_Lock))
                    NumLockMask = (1 << m);
                if (*map == XKeysymToKeycode (dpy, XK_Caps_Lock))
                    CapsLockMask = (1 << m);
                if (*map == XKeysymToKeycode (dpy, XK_Scroll_Lock))
                    ScrollLockMask = (1 << m);
            }
        XFreeModifiermap (xmk);
    }
离线bingogo
只看该作者 4楼 发表于: 2008-11-10
引用第3楼mumutouv于2008-11-10 15:33发表的  :
  xmk = XGetModifierMapping (dpy);
    if (xmk)
    {
        map = xmk->modifiermap;
        for (m = 0; m < 8; m++)
.......



完了~看不懂~555

谢谢大侠!
离线bingogo
只看该作者 5楼 发表于: 2008-11-11
还是不会用

各位,再给点意见吧!
离线bingogo
只看该作者 6楼 发表于: 2008-11-11
--------------------------
    Window root ;
    XEvent event;
   
    Display *dpy = XOpenDisplay(0);
   
    if(!dpy) 
    {
        printf("Error for openning display.\nExit..\n");
        return ;
    }
   
    root = DefaultRootWindow(dpy);

    KeyCode key = XKeysymToKeycode(dpy,XK_F8);
    printf("\n key = %X \n", key);
   
    unsigned int mod = 0 ;
    mod = mod | ControlMask ;
    printf("\n mod=%d \n",mod);
    XGrabKey(dpy, key ,  mod , root,True, GrabModeAsync, GrabModeAsync);

    for(;;)
    {

            XNextEvent(dpy, &event);
            if(event.type == KeyPress && event.xkey.keycode == key ) //
        {
            // do sth...           
            }
        }

    XAllowEvents(dpy,AsyncKeyboard,CurrentTime);
    XUngrabKey(dpy, key, AnyModifier, root);
    XSync(dpy,false);

--------------------------------

代码如上,就是截获不到组合键的信息,
设置成XGrabKey(dpy, key , AnyModifier, root,True, GrabModeAsync, GrabModeAsync);
可以截获单键的信息,
但是键盘组合呢? 怎么解决?

江湖救急...
离线bingogo
只看该作者 7楼 发表于: 2008-11-12
....头疼~
离线bingogo
只看该作者 8楼 发表于: 2010-01-14
旧贴总结!有需要的朋友可可以参考一下。

一年之后,已经不在原来的公司了。当初的问题的确困惑了我几个星期。
今天下午忽然又试了一下,才发现当时是因为Num Lock数字键被按下的缘故。
哎……


代码如下(仅在Fedora core 11下测试过):

//////////////////////////////////////////////////////////////////////////
//文件: x11grabkey.c
//日期: 2010-01-12
//
//编译: gcc -lX11 -DXK_MISCELLANY x11grabkey.c -o xgk
//执行: ./xgk
//效果: 截获"Control+F3"的组合按键, 不管键盘焦点在任何窗口上, 都会打印出hello字符串。
//     扩展一下可以做监控程序。
//注意:请先确认数字小键盘键(Num Lock)和大写锁定键(Caps Lock)没有按下
//
//////////////////////////////////////////////////////////////////////////

#include <X11/keysymdef.h>
#include <X11/Xlib.h>
#include <stdio.h>


int main()
{
    printf("=-=\n");

    Window root;
    XEvent ev;
    Display * dpy = XOpenDisplay(0);

    if(!dpy) return 1;
    root = DefaultRootWindow(dpy);

    XGrabKey(dpy, XKeysymToKeycode(dpy, XK_F3), ControlMask, \
           DefaultRootWindow(dpy), True, GrabModeAsync, GrabModeAsync);

    for(;;)
    {
        XNextEvent(dpy, &ev);
        switch (ev.type)
        {
            case KeyPress:
            {
                KeySym k = XLookupKeysym(&ev.xkey, 0);
                switch (k)
                {
                    case XK_F3:
                    {
                        printf("hello\n");
                    }
                }
            }
        }
    }

    return;
}
离线xinqingfly

只看该作者 9楼 发表于: 2010-01-14
up,曾经很熟悉的函数
菜鸟也是鸟
快速回复
限100 字节
 
上一个 下一个