使用SWT中Display的Post方法控制键盘

使用SWT中Display的Post方法控制键盘

   最近在实现一个图片压缩的功能,想在Eclipse.org上看有没有办法能够通过SWT的API能够改变图片的分辨率,Eclipse.org上面提供了好些SWT的例子,发现了Display的post方法挺有趣的,以前没有注意到,现在赶快把它记录下来,post方法的参数为Event,通过制定这个Events的属性,可以控制系统的键盘事件,比如保持shift键一直按着。下面是代码:

 1  import  org.eclipse.swt. * ;
 2  import  org.eclipse.swt.widgets. * ;
 3 
 4  /**
 5   * 触发系统的键盘事件  。 
 6   *  @author  vwpolo
 7   * <p>2009-6-1</p>
 8    */
 9  public   class  Snippet146 {
10 
11  public   static   void  main(String[] args) {
12       final  Display display  =   new  Display();
13       final  Shell shell  =   new  Shell(display);
14       final  Text text  =   new  Text(shell, SWT.BORDER);
15      text.setSize(text.computeSize( 150 , SWT.DEFAULT));
16      shell.pack();
17      shell.open();
18       new  Thread(){
19           public   void  run(){
20              String string  =   " Love the method. " ;
21               for  ( int  i  =   0 ; i  <  string.length(); i ++ ) {
22                   char  ch  =  string.charAt(i);
23                   boolean  shift  =  Character.isUpperCase(ch);
24                  ch  =  Character.toLowerCase(ch);
25                   if  (shift) {
26                      Event event  =   new  Event();
27                      event.type  =  SWT.KeyDown;
28                      event.keyCode  =  SWT.SHIFT;
29                      display.post(event);    
30                  }
31                  Event event  =   new  Event();
32                  event.type  =  SWT.KeyDown;
33                  event.character  =  ch;
34                  display.post(event);
35                   try  {
36                      Thread.sleep( 10 );
37                  }  catch  (InterruptedException e) {}
38                  event.type  =  SWT.KeyUp;
39                  display.post(event);
40                   try  {
41                      Thread.sleep( 100 );
42                  }  catch  (InterruptedException e) {}
43                   if  (shift) {
44                      event  =   new  Event();
45                      event.type  =  SWT.KeyUp;
46                      event.keyCode  =  SWT.SHIFT;
47                      display.post(event);    
48                  }
49              }
50          }    
51      }.start();
52       while  ( ! shell.isDisposed()) {
53           if  ( ! display.readAndDispatch()) display.sleep();
54      }
55      display.dispose();
56  }
57  }

  上面的例子功能是演示在一个文本框中模拟用户输入一段字符串,字符串的内容是"Love the method.",还可以通过这个来移动鼠标的箭头,像下面这样:
 1  public   static   void  main(String[] args) {
 2       final  Display display  =   new  Display();
 3       final  Shell shell  =   new  Shell(display);
 4       final  Button button  =   new  Button(shell,SWT.NONE);
 5      button.setSize( 100 , 100 );
 6      button.setText( " Click " );
 7      shell.pack();
 8      shell.open();
 9      button.addListener(SWT.MouseDown,  new  Listener() {
10           public   void  handleEvent(Event e){
11              System.out.println( " Mouse Down (button:  "   +  e.button  +   "  x:  "   +  e.x  +   "  y:  "   +  e.y  +   " ) " );
12          }
13      });
14       final  Point pt  =  display.map(shell,  null , 5 0 50 );
15       new  Thread(){
16          Event event;
17           public   void  run(){
18               try  {
19                  Thread.sleep( 300 );
20              }  catch  (InterruptedException e) {}
21              event  =   new  Event();
22              event.type  =  SWT.MouseMove;
23              event.x  =  pt.x;
24              event.y  =  pt.y;
25              display.post(event);
26               try  {
27                  Thread.sleep( 300 );
28              }  catch  (InterruptedException e) {}
29              event.type  =  SWT.MouseDown;
30              event.button  =   1 ;
31              display.post(event);
32               try  {
33                  Thread.sleep( 300 );
34              }  catch  (InterruptedException e) {}
35              event.type  =  SWT.MouseUp;
36              display.post(event);
37          }    
38      }.start();
39       while  ( ! shell.isDisposed()) {
40           if  ( ! display.readAndDispatch()) display.sleep();
41      }
42      display.dispose();
43  }

    首先创建一个100*100大小的按钮,然后通过display.map(shell, null, 50, 50);这段代码获得指定shell上的相对坐标,这里是指shell的相对坐标上的x=50,y=50,然后再换算成显示屏幕系统的绝对坐标,设置事件类型为鼠标移动,移动的目标坐标位置是刚才我们取得的系统坐标

   event  =   new  Event();
   event.type 
=  SWT.MouseMove;
   event.x 
=  pt.x;
   event.y 
=  pt.y;
   display.post(event);

 

  在触发这个事件后,让它休眠0.3秒

try  {
    Thread.sleep(
300 );
    } 
catch  (InterruptedException e) {}

 

  接着再将事件的类型设置为鼠标按下事件:

    event.type  =  SWT.MouseDown;
    event.button 
=   1 ;
    display.post(event);
  
  这样就基本上模拟出了系统鼠标的动作了。 大家有兴趣可以研究一下,比如用它来做点坏事情,呵呵

你可能感兴趣的:(使用SWT中Display的Post方法控制键盘)