Linux下的鼠標操作

若干年前,我自認爲很喜歡Linux;若干年後,我發現我當初是何等的天真。
恩,一分錢,一分貨!我堅信這一點!所以我現在堅持用MS的Vista,正版的哦!

言歸正傳,前段時間因爲工作,需要在Linux下操作鼠標,當然啦,肯定不會是在X-window下操作,那樣的話也就不會有這篇文章的存在了。我要做的就是在Console下面得到鼠標的座標。百度、谷歌都用上了,可就是找不到相關的資料。無奈之下,只能拿起Linux的內核啃代碼了。下面是這段時間的成果:

1. 關於"/dev/input/mice"
相信很多人都用過Linux,也許你發現不管是在X-window下面,還是在Console下面,鼠標都是可以操作的。那麼你有沒有考慮過這些鼠標都是從哪來的?

不錯!他們都是從"/dev/input/mice"這個文件裏來的。如果你對Linux比較熟,那麼你肯定看得出來這是一個設備文件。"mice"就是Linux下面鼠標的設備文件,不管你用的是PS2的還是USB的,所有關於鼠標的操作都被抽象到"mice"這個文件中。

2. "mice"之母
"mice"之母是誰?female mouse? 當然不是!在linux下面,她是"mousedev.c"這個文件。你可以在內核的"Drivers/input"目錄裏找到她。在她那裏,你可以得到關於"mice"的一切。但是我想99%的人對於"mice"他媽到底是幹嘛的是不會感興趣的。所以我就不廢話了。如果你有興趣,可自行翻閱。

3. 座標
如何得到mouse的當前座標值?可通過如下幾步:

1)打開"/dev/input/mice"文件。

2)讀3個字節。三個字節的值分別是“Button類型”,“X的相對位移”,“Y的相對位移”。這裏先用Button, xRel, yRel表示。

3)取Button的低3位(Button & 0x07)。0x00 = LeftButtonUp, 0x01 = LeftButtonDown, 0x02 = RightButtonDown.

4)因爲這裏取得是相對位移,所以X, Y要分別與上一次的座標值相加。xPos += xRel; yPos +=yRel.

好了,到這裏完成了一次讀取操作。


#include <stdio.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <linux/input.h>//鼠標鍵盤事件


int main(int argc,char **argv)
{
    int fd, retval;
    char buf[6];
    fd_set readfds;
    struct timeval tv;


    if(( fd = open("/dev/input/mice", O_RDONLY))<0)
    {
        printf("Failed to open \"/dev/input/mice\".\n");
        exit(1);
    }
    else
    {
        printf("open \"/dev/input/mice\" successfuly.\n");
    }


    while(1)
    {
        tv.tv_sec = 5;
        tv.tv_usec = 0;


        FD_ZERO(&readfds);
        FD_SET(fd, &readfds);


        retval = select(fd+1, &readfds, NULL, NULL, &tv);
        if(retval==0)
            printf("Time out!\n");
        if(FD_ISSET(fd,&readfds))
        {
            if(read(fd, buf, 6) <= 0)//終端設備,一次只能讀取一行
            {
                continue;
            }
            printf("Button type = %d, X = %d, Y = %d, Z = %d\n", (buf[0] & 0x07), buf[1], buf[2],   buf[3]);
        }
    }
    close(fd);
    return 0;
}

發佈了2 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章