1. 程式人生 > >用C語言在linux下獲取滑鼠指標的相對位置

用C語言在linux下獲取滑鼠指標的相對位置

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

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

2. "mice"之母
在linux下面,她是"mousedev.c"這個檔案。你可以在核心的"Drivers/input"目錄裡找到她。在她那裡,你可以得到關於"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 <stdlib.h>  
#include <linux/input.h>  
#include <fcntl.h>  
#include <sys/time.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <unistd.h>  
  
  
int main(int argc,char **argv)  
{  
    int fd, retval;  
    char buf[6];  
    fd_set readfds;  
    struct timeval tv;  
    // 開啟滑鼠裝置  
    fd = open( "/dev/input/mice", O_RDONLY );  
    // 判斷是否開啟成功  
    if(fd<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;  
}  
轉自:

https://blog.csdn.net/u013467442/article/details/51175172

相關推薦

C語言linux獲取滑鼠指標相對位置

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

linuxC語言獲取本地時間

一個小專案需要以系統時間(精確到微秒)為變數建立檔名,在網上搜索資料,在stackoverflow上找到了需要的東西,記下來備用 #include <sys/time.h> #include <time.h> #include <stdio

Linuxc語言實現發送http請求 方式可以Get或者Post例程參考

sockaddr select sleep online 創建 線程終止 index -s lse [1].[代碼] Linux下用c語言實現發送http請求 方式可以Get或者Post 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 1

Linuxc語言實現傳送http請求 方式可以Get或者Post例程參考

[1].[程式碼] Linux下用c語言實現傳送http請求 方式可以Get或者Post 跳至 [1] ? 1 2

軟體素材---linux C語言linux獲取可執行檔案的絕對路徑--getcwd函式

      //標頭檔案:#include <unistd.h>     //定義函式:char * getcwd(char * buf, size_t size);    

C語言Linux獲取時間戳

在Unix/Linux系統下,使用gettimeofday函式來獲得當前系統的時間戳,精度可達到微秒(microsecond,即μs)級別。 #include <stdio.h> #include <sys/time.h> int main(void) {

Linuxc語言實現傳送http請求

前言 在linux下,使用socket進行程式設計,需要到伺服器上進行獲取資料,伺服器使用的php程式設計,需要使用http的方式進行獲取資料。 程式碼 #include <stdio.h> #include <string.h&

Linux C 語言實現 ls 命令

這次主要的目的是用 C語言 實現 Linux 系統中的 ls 命令。 在編寫命令之前,需要介紹一下幾個結構體: 第一個 DIR: struct __dirstream { void *__fd; char *__data; in

初學Linux(二)---LinuxC語言中的陣列與指標

初學Linux(二)—Linux下C語言中的陣列與指標 在經過階段一的linux學習之後,我來到了階段二的Linux下的C語言程式設計,雖然學到目前linux下的C語言似乎跟之前學的C語言所差無幾,但是按照老師的話來說,C語言指標這塊尤為重要,而我在這一方面的

C語言Linux系統建立守護程序(Daemon)

      守護程序(daemon)是指在後臺執行的,沒有控制終端與之相連的程序。它獨立於控制終端,週期性地執行某種任務。Linux的大多數伺服器就是用守護程序的方式實現的。如web伺服器程序http等。守護程序在後臺執行,類似於Windows中的系統服務。      

編寫LinuxC語言訪問MySQL資料庫的程式

  在編寫這個程式的時候我和同學費了很大的力氣特別是在編譯的時候,下面我就把自己編譯的經驗給大家分享一下,希望大家能少走一些彎路。     我自己裝了mysql-5.0.41-linux-i686-glibc23.tar.gz 安裝部分就不說了!

LinuxC語言判斷程式是否已執行

通過程式名獲得程序號,然後和當前程式程序號做對比。 int isRunning() { int ret = 0; char sCurrPid[16] = {0}; spri

Linux C語言判斷文件和文件夾

nis ces 文件 char int pat code col exist Linux 用C語言判斷文件和文件夾 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #

大神幫我做這個題要C語言不要C++

2.0 大神 b2c 17.1 smd baidu html ++ quest http://baobao.baidu.com/question/9aba706e437305e0b1c98c73af45448e.html?18/Uf=sMDs http://baobao.

Linux終端程序c語言實現改變輸出的字的顏色

光標位置 高亮 AI 藍色 屬性 用c語言實現 TE c語言 說明 顏色代碼: 格式: echo "\033[字背景顏色;字體顏色m字符串\033[0m" 例如: echo "\033[41;36m something here \033[0m" 其中41的位置代表

C語言建立 線性表## *指標法*

最近在學習資料結構,講到線性表的實現,在這裡,球球同學要給大家展示一下自己的程式,用指標實現的順序表(當然你也可以用陣列去實現順序表,不過陣列的大小是固定的,這是使用陣列不方便的地方) 好了,接下來就是展示程式的時候了! 主函式: 建立線性表: 接下來是初

Linux C語言環境如何輸出寬字元 -- 轉載

                自己整理如下C++#include <iostream>#include <string>#include <locale>using namespace std;int main(void) {  wstring w = L"Out中文";

不用vs,c 語言windows編寫socket,gcc編譯

windows下socket一般都要vs,因為socket執行庫可能在win-sdk裡 反正在system32裡我沒找到ws2.32.lib,因此需要下載一份這個,如果能在其他地方找到也可以,點選這裡可以WS2.32下載我上傳到雲盤裡的檔案,密碼:10nc。

C語言實現Linux系統的cp指令

在實現cp指令之前,首先先要了解這樣一個概念,我們平時在寫程式碼時 int main() 這個括號裡省略了3個引數。 int main(int argc,char** argv,char** environ) //argc 表示引數的數量 //argv 是一個字串陣列

九之再續:教你一步一步c語言實現sift演算法、

                      教你一步一步用c語言實現sift演算法、下作者:July、二零一一年三月十二日出處:http://blog.csdn.net/v_JULY_v。參考:Rob Hess維護的sift 庫環境:windows xp+vc6.0條件:c語