linux应用层读写event,Linux应用层获取鼠标坐标

补充:在这个函数中要打开一个鼠标设备,但是在嵌入式的文件系统中没有这个设备节点,

鼠标设备的主设备号和次设备号有是如何确定的呢?

在  linux 系统中,鼠标和键盘的设备号都是固定的,可以在 PC 上查看,再在嵌入式的文件系统中自己建立。

linuxidc.com@Ubuntu:/tmp$ ls -l /dev/input/

total 0

drwxr-xr-x 2 root root     120 2008-11-06 08:49 by-path

crw-rw---- 1 root root 13,  64 2008-11-06 08:49 event0

crw-rw---- 1 root root 13,  65 2008-11-06 08:49 event1

crw-rw---- 1 root root 13,  66 2008-11-06 08:49 event2

crw-rw---- 1 root root 13,  67 2008-11-06 08:49 event3

crw-rw---- 1 root root 13,  68 2008-11-06 08:48 event4

crw-rw---- 1 root root 13,  69 2008-11-06 08:48 event5

crw-rw---- 1 root root 13,  70 2008-11-06 08:48 event6

crw-rw---- 1 root root 13,  63 2008-11-06 16:48 mice

crw-rw---- 1 root root 13,  32 2008-11-06 16:48 mouse0

crw-rw---- 1 root root 13,  33 2008-11-06 08:49 mouse1

crw-rw---- 1 root root 13, 128 2008-11-06 08:49 ts0

crw-rw---- 1 root root 13, 129 2008-11-06 08:49 ts1

鼠标设备一般为  mice  设备,主设备号为  13, 次设备号为  63。

键盘设备一般为  event 设备,主设备号为 13, 次设备号为 64 ~ 70。

#include

#include

#include

#include

#include

#include

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 = 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;

}0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux获取第三方应用程序的文本框光标位置,需要先了解 Linux 下的 X Window 系统。X Window 是 Linux 下的图形用户界面的基础,它可以通过程序接口 Xlib 来控制和获取窗口的信息。 通过 Xlib,我们可以获取窗口的 ID,然后使用 X Window 事件来监听该窗口的操作,比如鼠标点击、鼠标移动、键盘输入等。而获取文本框光标位置,就需要监听键盘事件,然后判断光标是否在文本框中,并获取光标的位置。 具体实现可以借助 GTK 或 Qt 等 GUI 库,它们提供了更高层次的接口,方便我们操作窗口和控件。例如,使用 GTK 可以通过以下代码获取当前激活窗口的文本框光标位置: ```c #include <gtk/gtk.h> // 回调函数,用于监听键盘事件 gboolean on_key_press (GtkWidget *widget, GdkEventKey *event, gpointer data) { // 获取当前激活窗口 GdkWindow *window = gtk_widget_get_window (gtk_window_get_focus (GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)))); // 获取鼠标位置,转换为窗口内的坐标系 gint x, y; gdk_window_get_device_position (window, event->device, &x, &y, NULL); gdk_window_get_origin (window, &x, &y); gdk_window_get_device_position (window, event->device, &x, &y, NULL); // 获取当前窗口内的控件,判断光标是否在文本框中 GtkWidget *widget_at_point = gtk_widget_get_ancestor (gtk_window_get_focus (GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL))), GTK_TYPE_ENTRY); if (widget_at_point != NULL && GTK_IS_ENTRY (widget_at_point)) { gint start, end; gtk_editable_get_selection_bounds (GTK_EDITABLE (widget_at_point), &start, &end); GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (widget_at_point)); gint cursor_position = gtk_entry_buffer_get_cursor_position (buffer); if (start <= cursor_position && cursor_position <= end) { // 光标在文本框中,返回光标位置 g_print ("The cursor position in the text box is %d\n", cursor_position); } } return FALSE; } int main (int argc, char *argv[]) { GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "key-press-event", G_CALLBACK (on_key_press), NULL); gtk_widget_show_all (window); gtk_main (); return 0; } ``` 以上代码使用 GTK 构建了一个窗口,并监听了窗口的键盘事件。当用户按下任意键时,会获取当前激活窗口的 ID,并通过 gdk_window_get_device_position() 函数获取鼠标位置,然后判断光标是否在文本框中。如果光标在文本框中,就获取文本框的光标位置,并输出到终端上。 当然,以上代码只是一种实现方式,如果你使用的是其他 GUI 库,可能需要使用不同的 API。不过基本思路都是类似的,需要监听键盘事件,并通过窗口 ID、鼠标位置和控件类型来判断光标位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值