⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keysimulate.txt

📁 在GTK下进行按键模拟
💻 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 + -