Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15530356
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2009-08-01 13:44:41

luther@gliethttp:/vobs/tmp$ vim power_key.c
#include
#include
#include
#include

int kbd;

int sim_key(int code, int value)
{
    struct input_event event;

    event.type = EV_KEY;
    event.code = code;      // 模拟输入键值.
    event.value= value;     // 1表示按下,0表示抬起[luther.gliethttp]
    gettimeofday(&event.time, 0);
    write(kbd, &event, sizeof(event));
}

int main(void)
{
    int count = 0;

    if((kbd = open("/dev/input/event1",O_RDWR)) <= 0)
        return -1;
    do {
        sim_key(KEY_POWER, 1);
        sim_key(KEY_POWER, 0);
        usleep(500*1000);       // 按下power key之后,会弹出一个确认窗口,所以使用alt+tab切换
        sim_key(KEY_LEFTALT, 1);// 过去,然后输入回车[luther.gliethttp]
        sim_key(KEY_TAB, 1);
        sim_key(KEY_LEFTALT, 0);
        sim_key(KEY_TAB, 0);
        
        usleep(100*1000);       // 等待确认窗体稳定[luther.gliethttp]
        sim_key(KEY_ENTER, 1);  // 输入回车[luther.gliethttp]
        sim_key(KEY_ENTER, 0);
        sim_key(KEY_POWER, 1);  // 可能有些其他操作系统没有弹出确认框,
        sleep(8);               // 所以保持power按键8秒,确保能够关机
        sim_key(KEY_POWER, 0);
    } while (++count < 10);     // 可能因为其他操作忽略了,所以重复以上操作10次,直到成功.

    /*
    do {
        sync();
        if (write(kbd, &event, sizeof(event)) < 0)
            printf("Error POWER_KEY\n");
        usleep(500*1000);
    } while (1);
    */

    return -1;
}
luther@gliethttp:/vobs/tmp$ gcc power_key.c
luther@gliethttp:/vobs/tmp$ sudo ./a.out
阅读(1737) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~