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) |