我找不到信息,如何使用uinput
/ 创建带有几个按钮的操纵杆suinput
.python
使用示例python-uinput
:
import uinput
def main():
events = (
uinput.BTN_JOYSTICK,
uinput.ABS_X + (0, 255, 0, 0),
uinput.ABS_Y + (0, 255, 0, 0),
)
with uinput.Device(events) as device:
for i in range(20):
# syn=False to emit an "atomic" (5, 5) event.
device.emit(uinput.ABS_X, 5, syn=False)
device.emit(uinput.ABS_Y, 5)
device.emit_click(uinput.BTN_JOYSTICK)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
如您所见,在此示例中使用BTN_JOYSTICK
as按钮.如何创建第二个按钮/上瘾两个ABS_X
/ ABS_Y
?
注:我使用python
为例,应用语言是C
有libsuinput
.
我有一个在 python3.4 上运行的 python 脚本,并使用该包keyboard
来允许按键绑定;
keyboard.add_hotkey("enter", self.listener.stop, suppress=True)
keyboard.add_hotkey("shift+enter", self.listener.finish, suppress=True)
Run Code Online (Sandbox Code Playgroud)
当我在 Windows 上运行它时,它可以完美地监听两个热键,当在 Linux (CentOS) 上运行时它也可以工作。
在工作中,我通过 Windows 10 功能和应用商店在 Windows 上获得了 Ubuntu 环境。但是这个环境下这个键盘热键有问题。
/usr/local/lib/python3.6/dist-packages/keyboard-0.13.2-py3.6.egg/keyboard/_nixkeyboard.py:110: UserWarning: Failed to create a device file using `uinput` module. Sending of events may be limited or unavailable depending on plugged-in devices.
device = aggregate_devices('kbd')
Traceback (most recent call last):
File "main.py", line 32, in <module>
], 'test')
File "/mnt/.../can_controller.py", line 28, in __init__
self.__initialise_key_handler()
File "/mnt/.../can_controller.py", line 95, in __initialise_key_handler
keyboard.add_hotkey("enter", …
Run Code Online (Sandbox Code Playgroud) keyboard ubuntu python-3.x uinput windows-subsystem-for-linux
我正在开发一个单线程的进程applet,它创建一个代理虚拟设备(更确切地说是一个虚拟的Xbox 360 pad); 我设法使用uinput接口创建它,我正确设置它并且它工作得很好.
为了向这个虚拟设备提供命令,我从另一个真实接口(在这种情况下是PS3 pad)中读取事件,然后用这些标志打开真实的设备文件:
fd = open("/dev/input/event22", O_RDONLY); // open the PS3 pad
Run Code Online (Sandbox Code Playgroud)
主循环类似于(减去错误检查):
while(run) {
input_event ev = {0};
read(fd, &ev, sizeof(struct input_event));
// convert from PS3 --> Xbox 360
convert(ev);
// write to the new virtual pad
write(fd_virtual, &ev, sizeof(struct input_event));
}
Run Code Online (Sandbox Code Playgroud)
你可以想象这read(fd, &ev, sizeof(struct input_event));
是一个阻塞调用,我希望有一种超时循环循环并检查其他事件/执行其他代码.
由于这些原因,我想read(fd...
在epoll循环中封装该调用,所以我也可以暂停.
问题是,以这种方式完成它会有效吗?通过使用epoll_wait,我是否会对当前循环引入额外的延迟,从而延迟虚拟键盘的响应能力?
我在使用工作时获得代码的两面都遇到了一些问题uinput
.
基于uinput入门:用户级输入子系统[死链接; 存档 ]我总结了以下作家(减去错误处理):
int main(int ac, char **av)
{
int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
int ret = ioctl(fd, UI_SET_EVBIT, EV_ABS);
ret = ioctl(fd, UI_SET_ABSBIT, ABS_X);
struct uinput_user_dev uidev = {0};
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-rotary");
uidev.absmin[ABS_X] = 0;
uidev.absmax[ABS_X] = 255;
ret = write(fd, &uidev, sizeof(uidev));
ret = ioctl(fd, UI_DEV_CREATE);
struct input_event ev = {0};
ev.type = EV_ABS;
ev.code = ABS_X;
ev.value = 42;
ret = write(fd, &ev, sizeof(ev));
getchar(); …
Run Code Online (Sandbox Code Playgroud) 我已成功设置一个小程序来创建一个输入设备,我打算用它来自动测试接收键盘输入事件的应用程序.
当我的程序通过调用ioctl(fd, UI_DEV_CREATE)
新设备创建uinput设备出现在文件系统中时,我的测试应用程序可以附加到它并等待事件.我的目标系统已经有了一个/dev/input/event0
设备,所以新的设备获得了路径/dev/input/event1
.如果我为我的桌面系统编译并运行程序,那里有现有设备/dev/input/event[0-15]
,当程序运行时,新设备就会获得/dev/input/event16
.
我希望我的程序在创建后报告新设备名称.有办法搞定吗?
我对树莓派和Linux很陌生。我正在尝试使用以下代码在Raspbian(r Pi 3 B)上运行python库uinput的基本示例:
import uinput
device = uinput.Device([
uinput.BTN_LEFT,
uinput.BTN_RIGHT,
uinput.REL_X,
uinput.REL_Y,
])
for i in range(20):
device.emit(uinput.REL_X, 5)
device.emit(uinput.REL_Y, 5)
Run Code Online (Sandbox Code Playgroud)
我得到错误:
追溯(最近一次通话):
文件“/home/pi/Desktop/t1.py”,7号线,在uinput.REL_Y,文件“/home/pi/.local/lib/python3.5/site-packages/uinput/ 初始化的.py”,行178,初始化 自己。uinput_fd = fd或fdopen()文件“ /home/pi/.local/lib/python3.5/site-packages/uinput/__init .py”,第84行,在fdopen中返回_libsuinput.suinput_open()文件“ / home / pi / .local / lib / python3.5 / site-packages / uinput / init .py“,第70行,在_open_error_handler中引发OSError(code,msg)
OSError:[Errno 19]无法打开uinput设备:否这样的设备怎么了?我需要更改什么,在哪里更改?
uinput ×6
linux ×5
c ×2
epoll ×1
keyboard ×1
linux-kernel ×1
python ×1
python-3.x ×1
raspbian ×1
ubuntu ×1