[Ubuntu-zh] C/C++ 请教控制鼠标的库/头文件等
Guannan Ma
mythmgn在gmail.com
星期六 五月 7 03:57:22 UTC 2011
有时间的时候录个视频出来跟大家share一下.
挺有趣的.
2011/5/6 Guannan Ma <mythmgn在gmail.com>:
> :-).
>
> 我是通过手机putty wifi连接到自己笔记本实现的.
> 代码如下 今天晚上写出来个大概 测试了一下 可以使用 嘿嘿
>
>
> #include <stdio.h>
> #include <termios.h>
> #include <stdlib.h>
> #include <sys/time.h>
> #include <sys/types.h>
> #include <string.h>
> #include <unistd.h>
>
> #include <xdo.h>
>
>
> #define POS_PLUS 5
> #define D_POS_PLUS 50
>
> /** !@description
> Nokia Symbian S60 V3
>
> Arrow key UP ----> 27 91 65
> Arrow key LEFT ----> 27 91 68
> Down ----> 27 91 66
> Right ---> 27 91 67
>
> Confirm key----> 10 (simulate pressing enter)
>
> *
> *
> *
> *
> *
> */
>
> int setTTY() {
>
> int ttyDevice = STDOUT_FILENO;
>
> printf("%s\n","Noncanonical terminal mode is enabled");
> /* [-]icanon
> enable erase, kill, werase, and rprnt special characters*/
> /*min N with -icanon, set N characters minimum for a completed read */
> system("stty -icanon");
>
> printf(">");
> /* Make sure file descriptor is for a TTY device. */
> if ( ! isatty(ttyDevice) ) {
> printf("Not a TTY device.n");
> return(EXIT_FAILURE);
> }
> /* Flush both the input and output queues. */
> else {
> if (tcflush(ttyDevice, TCIOFLUSH) == 0)
> ;
> //printf("The input and output queues have been flushed\n");
> else
> perror("tcflush error");
> }
> }
> int nonCanonical(int sign) {
> struct termios ttystate;
> //get the terminal state
> tcgetattr(STDIN_FILENO, &ttystate);
> if (sign==1) {
> /*turn off canonical mode*/
> ttystate.c_lflag &= ~ICANON; /* To diable canonical input*/
> ttystate.c_lflag &= ~ECHO; // To disable user see what he types
> /*ttystate.c_lflag &= ~ISIG; To disable Control signals using
> control Keys
> minimum of number input read.*/
> ttystate.c_cc[VMIN] = 1;
> } else {
> /*turn on canonical mode*/
> ttystate.c_lflag |= ICANON; /*To enable Canonical mode*/
> ttystate.c_lflag |= ECHO; /*To enable user see what he pressed*/
>
> }
> /*set the terminal attributes.*/
> tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
> return 1;
> }
>
> int handlerKeyPress(char *display) {
> static fd_set rfds;
> struct timeval tv;
> char a,b,c;
> char str[20];
>
> xdo_t *p_xt=xdo_new(display);
> while (1==1) {
> // Set up stdin buffer probe
> FD_ZERO(&rfds);
> FD_SET(0, &rfds);
>
> tv.tv_sec = 0;
> tv.tv_usec = 0;
> if (!select(1, &rfds, NULL, NULL, &tv)) {
> // No input available
> //skips++;
> } else {
> // Input available immediately
> a = getchar();
> //printf("%d\n",c);
>
> switch(a) {
> /**< */
> case 27:
> b=getchar();
> c=getchar();
> switch(c) {
> /**< Arrow Up */
> case 65:
> xdo_mousemove_relative(p_xt,0,-POS_PLUS);
> break;
> /**< Arrow Down */
> case 66:
> xdo_mousemove_relative(p_xt,0,POS_PLUS);
> break;
> /**< Arrow Right */
> case 67:
> xdo_mousemove_relative(p_xt,POS_PLUS,0);
> break;
> /**< Arrow Left */
> case 68:
> xdo_mousemove_relative(p_xt,-POS_PLUS,0);
> break;
> };
> break;
>
> /**< left click */
> case 'q':
> xdo_click(p_xt,CURRENTWINDOW,1);
> break;
> case 'p':
> /**< right click */
> xdo_click(p_xt,CURRENTWINDOW,3);
> break;
>
>
> /**< mouse left button down */
> case 'w':
> xdo_mousedown(p_xt,CURRENTWINDOW,1);
> break;
>
> /**< mouse left button up */
> case 'e':
> xdo_mouseup(p_xt,CURRENTWINDOW,1);
> break;
>
> /**< for longer distance mouse move */
> case 'y':
> xdo_mousemove_relative(p_xt,0,-D_POS_PLUS);
> break;
> case 'n':
> xdo_mousemove_relative(p_xt,0,D_POS_PLUS);
> break;
> case 'g':
> xdo_mousemove_relative(p_xt,-D_POS_PLUS,0);
> break;
> case 'j':
> xdo_mousemove_relative(p_xt,D_POS_PLUS,0);
> break;
>
> /**< Delete key */
> case 127:
> xdo_keysequence(p_xt,CURRENTWINDOW,"BackSpace",12000);
> break;
>
> /**< copy paste and cancel */
> case 'c':
> xdo_keysequence(p_xt,CURRENTWINDOW,"Control_L+c",12000);
> break;
> case 'v':
> xdo_keysequence(p_xt,CURRENTWINDOW,"Control_L+v",12000);
> break;
> case 'z':
> xdo_keysequence(p_xt,CURRENTWINDOW,"Control_L+z",12000);
> }
> }
> }
>
> xdo_free(p_xt);
> }
>
> int main(int argc, char **argv) {
>
> if(argc<=1) {
> printf("rmctool needs a DISPLAY argument\n");
> }
> setTTY();
> nonCanonical(1);
> handlerKeyPress(argv[1]);
> return EXIT_SUCCESS;
> }
>
>
> 2011/5/6 RLP <rhyslpratt在yahoo.com.cn>:
>> On 2011-05-06 Guannan Ma <mythmgn在gmail.com> wrote:
>>
>>>蓝牙方向键?
>>>
>>>不明白....
>>>能给出个程序名称么 或者驱动名称
>>>
>>>我的手机是nokia e5-00
>>>就是symbian s60 v3
>>>
>>>我没有蓝牙方向键相关的程序控制
>>>我的笔记本和手机倒是都支持蓝牙.
>>>
>>>
>>
>> 嘿嘿, 蓝牙, (手机)方向键, 是我的错误, 中间没有断字. 我是老手机, 爱立信自带的软件, 不知道s60上有没有类似的软件.
>> 再说了, 这只是手机这一端的, 笔记本那里就是普通的ubuntu默认的什么东西, 我是通过那个蓝牙applet控制的, 也没有什么特别的对话框, set up new device就搞定了.
>>
>> --
>> ubuntu-zh mailing list
>> ubuntu-zh在lists.ubuntu.com
>> https://lists.ubuntu.com/mailman/listinfo/ubuntu-zh
>>
>
关于邮件列表 ubuntu-zh 的更多信息