ubuntu|linux下 如何用python 模拟按键

ubuntu|linux下 如何用python 模拟按键,第1张

ubuntu下,也就是linux下,通常会用kill -事件编号实现。 你查一下LINUX下的事件就明白了。

kill 进程号 实现上是发了一个信号给指定的进程。 在python里,也可以加载事件处理模块,处理来自其它程序发过来的信号, 当然你可以用KILL工具发信号过来。

ctrl+d也是一个信号,ctrl+c也是一个。具体信号编码我不记得了。不过以前我做多进程管理时就是使用这个方法。 好象信号还可以带参数过来。

你打开python的帮助。看看signal这个模块。我把它的例子拿过来。对你有用不

import signal, os

def handler(signum, frame):

    print 'Signal handler called with signal', signum

    raise IOError("Couldn't open device!")

# Set the signal handler and a 5-second alarm

signal.signal(signal.SIGALRM, handler)

signal.alarm(5)

# This open() may hang indefinitely

fd = os.open('/dev/ttyS0', os.O_RDWR)

signal.alarm(0)          # Disable the alarm

下面是我找到的一些资料。也许有用。

信号的概念

信号(signal)--     进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。

几个常用信号:

SIGINT     终止进程  中断进程  (control+c)

SIGTERM   终止进程     软件终止信号

SIGKILL   终止进程     杀死进程

SIGALRM 闹钟信号

进程结束信号 SIGTERM和SIGKILL的区别

SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。

对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里。

发送信号一般有两种原因:

1(被动式)  内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号

2(主动式)  通过系统调用kill来向指定进程发送信号

linux *** 作系统提供的信号

[100003@oss235 myppt]$ kill -l

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL

5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE

9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2

13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT

17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP

21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU

25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH

29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN

35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4

39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8

43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12

47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14

51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10

55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6

59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2

63) SIGRTMAX-1  64) SIGRTMAX

Python提供的信号

Python 2.4.3 (#1, Jun 11 2009, 14:09:58)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>import signal

>>>dir(signal)

['NSIG', 'SIGABRT', 'SIGALRM', 'SIGBUS', 'SIGCHLD', 'SIGCLD',

'SIGCONT', 'SIGFPE', 'SIGHUP', 'SIGILL', 'SIGINT', 'SIGIO', 'SIGIOT',

'SIGKILL', 'SIGPIPE', 'SIGPOLL', 'SIGPROF', 'SIGPWR', 'SIGQUIT',

'SIGRTMAX', 'SIGRTMIN', 'SIGSEGV', 'SIGSTOP', 'SIGSYS', 'SIGTERM',

'SIGTRAP', 'SIGTSTP', 'SIGTTIN', 'SIGTTOU', 'SIGURG', 'SIGUSR1',

'SIGUSR2', 'SIGVTALRM', 'SIGWINCH', 'SIGXCPU', 'SIGXFSZ', 'SIG_DFL',

'SIG_IGN', '__doc__', '__name__', 'alarm', 'default_int_handler',

'getsignal', 'pause', 'signal']

*** 作系统规定了进程收到信号以后的默认行为

但是,我们可以通过绑定信号处理函数来修改进程收到信号以后的行为

有两个信号是不可更改的SIGTOP和SIGKILL

绑定信号处理函数

import os  

import signal  

from time import sleep  

 

def onsignal_term(a,b):  

   print '收到SIGTERM信号'  

 

#这里是绑定信号处理函数,将SIGTERM绑定在函数onsignal_term上面  

signal.signal(signal.SIGTERM,onsignal_term)  

 

def onsignal_usr1(a,b):  

   print '收到SIGUSR1信号'  

#这里是绑定信号处理函数,将SIGUSR1绑定在函数onsignal_term上面  

signal.signal(signal.SIGUSR1,onsignal_usr1)  

 

while 1:  

   print '我的进程id是',os.getpid()  

   sleep(10)  

运行该程序。然后通过另外一个进程来发送信号。

发送信号

发送信号的代码如下:

import os  

import signal  

 

#发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改  

os.kill(16175,signal.SIGTERM)  

#发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改  

os.kill(16175,signal.SIGUSR1)

#include <gtk/gtk.h>

#include <gdk/gdkkeysyms.h>

#include <fakekey/fakekey.h>

#include <X11/keysym.h>

Display* disp

FakeKey *fk

GtkWidget *win = NULL

static char *numkeyboard_display[]=

{

  "1\0", "2\0", "3\0", "+","4\0", "5\0", "6\0","-", "7\0", "8\0", "9\0", ".", "0\0",  "←\0", "→\0", "Backspace\0", "Delete\0", "Enter\0"

}

static gushort numkeyboard_send[] =

{

  XK_1, XK_2, XK_3, XK_plus, XK_4, XK_5, XK_6, XK_minus, XK_7, XK_8,  XK_9, XK_period, XK_0,  XK_Left, XK_Right, XK_BackSpace, XK_Delete, XK_Return

}

gboolean numbt_release (GtkWidget *widget, GdkEventButton *event,

      gpointer user_data)

{

  gint i = GPOINTER_TO_UINT(user_data)

  fakekey_press_keysym(fk, numkeyboard_send[i], 0)

  fakekey_release(fk)

  return TRUE

}

void clicked_callback(GtkButton *button1, GtkWindow *window)

{

  gint j

  GtkWidget *button[5]

  GtkWidget *vbox = gtk_vbox_new(FALSE, 5)

  GtkWidget *hbox[5]

  if(win)

  {

      gtk_widget_destroy (win)

      win = NULL

  }

  else

  {

      win = gtk_window_new (GTK_WINDOW_POPUP)

      hbox[0] = gtk_hbox_new(TRUE, 5)

      for (j = 0 j <4j++ ) {

          button[0] = gtk_button_new_with_label (numkeyboard_display[j])

          gtk_box_pack_start_defaults(GTK_BOX(hbox[0]), button[0])

          g_signal_connect(G_OBJECT(button[0]), "button-release-event",

                  G_CALLBACK(numbt_release), GUINT_TO_POINTER (j))

      }

      gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[0])

      hbox[1] = gtk_hbox_new(TRUE, 5)

      for (j = 4 j <8j++ ) {

          button[1] = gtk_button_new_with_label (numkeyboard_display[j])

          gtk_box_pack_start_defaults(GTK_BOX(hbox[1]), button[1])

          g_signal_connect(G_OBJECT(button[1]), "button-release-event",

                  G_CALLBACK(numbt_release), GUINT_TO_POINTER (j))

      }

      gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[1])

      hbox[2] = gtk_hbox_new(TRUE, 5)

      for (j = 8 j <12j++ ) {

          button[2] = gtk_button_new_with_label (numkeyboard_display[j])

          gtk_box_pack_start_defaults(GTK_BOX(hbox[2]), button[2])

          g_signal_connect(G_OBJECT(button[2]), "button-release-event",

                  G_CALLBACK(numbt_release), GUINT_TO_POINTER (j))

      }

      gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[2])

      hbox[3] = gtk_hbox_new(TRUE, 5)

      for (j = 12 j <15j++ ) {

          button[3] = gtk_button_new_with_label (numkeyboard_display[j])

          gtk_box_pack_start_defaults(GTK_BOX(hbox[3]), button[3])

          g_signal_connect(G_OBJECT(button[3]), "button-release-event",

                  G_CALLBACK(numbt_release), GUINT_TO_POINTER (j))

      }

      gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[3])

      hbox[4] = gtk_hbox_new(TRUE, 5)

      for (j = 15 j <18j++ ) {

          button[4] = gtk_button_new_with_label (numkeyboard_display[j])

          gtk_box_pack_start_defaults(GTK_BOX(hbox[4]), button[4])

          g_signal_connect(G_OBJECT(button[4]), "button-release-event",

                  G_CALLBACK(numbt_release), GUINT_TO_POINTER (j))

      }

      gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[4])

      gtk_container_add(GTK_CONTAINER(win), vbox)

      gtk_window_move (GTK_WINDOW (win), 200, 200)/* 设置窗口位置 */

      gtk_widget_show_all(win)

   

  }

}

int main(int argc, char *argv[])

{

   GtkWidget *window

   GtkWidget *button

   GtkWidget *entry

   GtkWidget *vbox

   gtk_init(&argc, &argv)

   window = gtk_window_new(GTK_WINDOW_TOPLEVEL)

   gtk_window_set_title(GTK_WINDOW(window), "KeyBoard")

   gtk_window_set_default_size(GTK_WINDOW(window),400,300)

   disp = XOpenDisplay(NULL)//屏幕按键函数改成为内核驱动代发

   if( disp == NULL )

       return 1

   fk = fakekey_init(disp)

   vbox = gtk_vbox_new(FALSE, 5)

   button = gtk_button_new_with_label("d出键盘")

   gtk_widget_set_size_request(GTK_WIDGET(button),400,250)

   gtk_box_pack_start_defaults(GTK_BOX(vbox), button)

   entry = gtk_entry_new()

   gtk_box_pack_start_defaults(GTK_BOX(vbox), entry)

   gtk_widget_set_size_request(GTK_WIDGET(entry),400,50)

   g_signal_connect(GTK_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL)

   g_signal_connect(GTK_OBJECT(button), "clicked",G_CALLBACK(clicked_callback), window)

   gtk_container_add(GTK_CONTAINER(window), vbox)

   gtk_widget_show_all(window)

   gtk_main()

   return 0

}

Linux概述 Linux是一个成熟而稳定的网络 *** 作系统。将Linux植入嵌入式设备具有众多的优点。首先,Linux的源代码是开放的,任何人都可以获取并修改,用之开发自己的产品。其次,Lirmx是可以定制的,其系统内核最小只有约134kB。一个带有中文系统和图形用户界面的核心程序也可以做到不足1MB,并且同样稳定。另外,它和多数Unix系统兼容,应用程序的开发和移植相当容易。同时,由于具有良好的可移植性,人们已成功使Linux运行于数百种硬件平台之上。 然而,Linux并非专门为实时性应用而设计,因此如果想在对实时性要求较高的嵌入式系统中运行Linux,就必须为之添加实时软件模块。这些模块运行的内核空间正是 *** 作系统实现进程调度、中断处理和程序执行的部分,因此错误的代码可能会破坏 *** 作系统,进而影响整个系统的可靠性和稳定性。Linux的众多优点还是使它在嵌入式领域获得了广泛的应用,并出现了数量可观的嵌入式Linux系统。 Linux的不足 由于在现在的个人电脑 *** 作系统行业中,微软的Windows系统仍然占有大部分的份额,绝大多数的软件公司都支持Windows。这使得Windows上的应用软件应有尽有,而其他的 *** 作系统就要少一些。许多用户在换 *** 作系统的时候都会考虑以前的软件能否继续使用,换了 *** 作系统后是否会不方便。虽然Linux具有DOS、Windows模拟器,可以运行一些Windows程序,但Windows系统极其复杂,模拟器所模拟的运行环境不可能完全与真实的Windows环境一模一样,这就使得一些软件无法正常运行。 许多硬件设备面对Linux的驱动程序也不足,不少硬件厂商是在推出Windows版本的驱动程序后才编写Linux版的。但一些大硬件厂商在这方面做得还不错,他们的Linux版驱动程序一般都推出得比较及时。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7466941.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存