📄 keysimulate.txt
字号:
#include <gtk/gtk.h>
//FIXME:假造按键敲击事件
void manufacture_keystroke(GdkWindow *window,int state,guint uval,int press)
{
GdkKeymapKey *keys;
gint n_keys;
//FIXME:取得这个按键在标准键盘中的硬件编码
if (gdk_keymap_get_entries_for_keyval(NULL,uval,&keys,&n_keys)) {
guint16 hardware_keycode;
GdkEvent *event;
hardware_keycode = keys[0].keycode;
g_free(keys);
if(press > 0)
event = gdk_event_new(GDK_KEY_PRESS);
else
event = gdk_event_new(GDK_KEY_RELEASE);
event->key.window = g_object_ref(window);
event->key.hardware_keycode = hardware_keycode;
event->key.keyval = gdk_unicode_to_keyval(uval);
event->key.length = 1;
event->key.send_event = FALSE;
event->key.time = GDK_CURRENT_TIME;
event->key.state = state;
gtk_main_do_event(event);
gdk_event_free(event);
}
}
static gboolean idle_simulate_key(unsigned char* hardware_code)
{
int keyval;
GdkWindow *root;
if(*hardware_code >= 128)
return FALSE;
keyval = gdk_linux_keymap[*hardware_code];//按键表
//root = wbus->window->window;
//root = gdk_get_default_root_window();
root = gdk_screen_get_active_window(gdk_screen_get_default());
if(!root){
printf("simulate key no found active window!!!\n");
return FALSE;
}
manufacture_keystroke(root,0,keyval,1);//FIXME:假造按键事件
//FIXME:如果是注释窗口unref了之后会造成注释窗口释放掉了
//g_object_unref(root);
manufacture_keystroke(root,0,keyval,0);//FIXME:假造按键事件
//g_object_unref(root);
return FALSE;
}
//FIXME:kcode是_KEY_xx之类的硬件编码
void wbuscanner_simulate_key(int kcode)
{
static unsigned char hardware_code;
//FIXME:一定要用全局变量,因为要传递指针,局部变量会被释放掉
hardware_code = kcode;
gdk_threads_add_idle((GSourceFunc)idle_simulate_key,(gpointer)&hardware_code);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -