»ùÓÚ Web µÄ KVM ¹ÜÀí¹¤¾ß£¨±ÈÈç Kimchi ºÍ Ovirt£©¿É°ïÖúÓû§ÇáËÉ´´½¨ºÍ¹ÜÀíÐéÄâ»ú
(VM)£¬ÉõÖÁÊÇ´ÓÒÆ¶¯É豸´´½¨ºÍ¹ÜÀíÐéÄâ»ú¡£ÕâЩ¹¤¾ßÒÀ¿¿Ô¶³Ì×ÀÃæ¹²Ïí¼¼Êõ£¬±ÈÈç ÐéÄâÍøÂç¼ÆËã (VNC)£¬¶øÊ¹ÓÃ
VNC µÄ¼¼ÊõÐèÒªÒ»¸ö»ùÓÚ Web µÄ VNC ¿Í»§¶Ë£¬±ÈÈç noVNC¡£
VNC ×î³õµÄÄ¿µÄÊÇʹÎïÀí PC Äܹ»´ÓÔ¶³Ì½øÐзÃÎÊ¡£ÒòΪÐéÄ⻯²»ÊÇ VNC ¹Ø×¢µÄÎÊÌ⣬ËùÒÔÔÚ½« VNC
ÓÃÓÚ VM ʱ£¬ÐèÒª¾¹ýÌØÊâ´¦Àí²ÅÄܽâÊͺͲÙ×÷»÷¼ü¡£Web ¼¼ÊõÒ²´øÀ´Á˶îÍâµÄÌôÕ½£ºWeb Ó¦ÓóÌÐò±ØÐë½â¾öä¯ÀÀÆ÷Ö§³ÖÉϵIJîÒ죬·ñÔò½öÄÜÓÃÓÚijЩѡ¶¨µÄä¯ÀÀÆ÷¡£Web
Ó¦ÓóÌÐòÖ»ÄÜͨ¹ýä¯ÀÀÆ÷ API ·ÃÎÊ PC Ó²¼þ£¬¶ø×ÀÃæÓ¦ÓóÌÐòÄܹ»¸üÖ±½ÓµØ½øÐзÃÎÊ¡£
±¾ÎÄÖ¼ÔÚ°ïÖú JavaScript ¿ª·¢ÈËÔ±Àí½âºÍ½â¾öÏà¹ØÌôÕ½£¬ÈûùÓÚ Web µÄ VNC ¿Í»§¶Ë£¨»òÆäËûÈκÎÃæÁÙͬÑùÎÊÌâµÄ»ùÓÚ
Web µÄÓ²¼þÄ£ÄâÆ÷£©Äܹ»×¼È·µØÏìÓ¦´Ó¶àÖÖ¼üÅ̲¼¾ÖÉú³ÉµÄ»÷¼üÐÅÏ¢¡£ÎÒÊ×ÏȽ«½âÊÍ×ÀÃæ²Ù×÷ϵͳÈçºÎ´¦Àí¼üÅÌÐźš£È»ºó£¬Äú½«Ñ§Ï°
RFB£¨VNC ʹÓõÄÐÒ飩ÈçºÎ½«»÷¼üÐÅÏ¢´Ó VNC ¿Í»§¶Ë·¢Ë͵½ VNC ·þÎñÆ÷£¬»¹½«Á˽â´Ë¹ý³ÌÔÚÐéÄ⻯³¡¾°ÖÐÉæ¼°µ½ÄÄЩÎÊÌ⣬ÒÔ¼°
QEMU ÉçÇøÈçºÎΪ×ÀÃæ VNC ¿Í»§¶Ë½â¾öÕâЩÎÊÌ⡣Ȼºó£¬ÎÒ½«½éÉÜÈçºÎʹÓÃÒ»¸öÏà¶Ô½ÏеÄä¯ÀÀÆ÷ API
Ϊ»ùÓÚ Web µÄ VNC ¿Í»§¶ËʵÏÖ QEMU ½â¾ö·½°¸¡£
²Ù×÷ϵͳÈçºÎ´¦Àí»÷¼ü
¼üÅÌÊÇÒ»ÖÖÓ²¼þÉ豸£¬¶ÔÓÚÿ¸ö°´Ï»òÊͷŵļü£¬Ëü¶¼»á·¢ËÍÒ»¸öÐźš£ÕâЩÐźųÆÎªÉ¨ÃèÂ룬ÓÉÒ»¸ö»ò¶à¸ö×Ö½Ú×é³É£¬ÓÃÓÚΨһµØ±êʶ°´Ï»òÊÍ·ÅʵÌå¼üµÄ²Ù×÷¡£
IBM ÔÚ IBM XT ÖÐÉèÁ¢Á˵ÚÒ»¸öɨÃèÂë±ê×¼¡£´ó²¿·ÖÖÆÔìÉ̶¼×ñÑ XT ±ê×¼À´È·±£É豸Óë IBM
Ó²¼þ¼æÈÝ¡£µ«ÊÇ£¬É¨ÃèÂë²»ÊÇÒ»ÖÖÈÝÒ×¹©Ó¦ÓóÌÐòʹÓõĺõļüÅ̱íʾ£¬ÒòΪ²»Í¬µÄ¼üÅÌÀàÐÍ¿ÉÄÜʹÓò»Í¬µÄɨÃèÂë¡£¾ÙÀý¶øÑÔ£¬USB
¼üÅÌ×ñÑÓë XT ±ê×¼²»Í¬µÄɨÃèÂë±ê×¼¡£
¼üÂë
ΪÁËʹӦÓóÌÐòÄܹ»´¦ÀíÈκÎÀàÐ͵ļüÅÌ£¬²Ù×÷ϵͳ½«É¨ÃèÂëת»»ÎªÓë²»ÒÀÀµÓÚ¼üÅ̵ļüÂë¡£ÀýÈ磬ÔÚ PS2 ¼üÅÌÖа´
Q£¬»áµÃµ½ÓëÔÚ USB ¼üÅÌÖа´ Q ÏàͬµÄ¼üÂë¡£µÃÒæÓÚ´ÓɨÃèÂëµ½¼üÂëµÄת»»£¨¼üÅÌÇý¶¯³ÌÐò µÄµÚÒ»¸öÈÎÎñ£©£¬Ó¦ÓóÌÐò²»ÐèÒª´¦ÀíËùÓÐÒÑÖªµÄ¼üÅÌÀàÐÍ¡£
ɨÃèÂëÓë¼üÂëÖ®¼äµÄת»»ÊÇ¿ÉÄæµÄ¡£ÈκμüÂë¶¼¿ÉÒÔת»»»ØÉú³ÉËüµÄ׼ȷµÄÓ²¼þɨÃèÂë¡£ÀýÈ磬ÔÚ±ê×¼ÃÀ¹ú 102
¼ü¼üÅÌÉϰ´Ï±êΪ Q µÄ¼ü£¬²»»á½âÊÍΪ Q ¼ü±»°´Ï£¬¶øÊǽâÊÍΪλÓÚµÚÈýÐеڶþÁеļü±»°´Ï¡£
¼ü·û (keysyms)
¶ÔÓ¦ÓóÌÐò¶øÑÔ£¬Ê¹ÓüüÂëÈÔ²»ÊǺÜÀíÏ룬ÒòΪ¸ù¾Ý²»Í¬µÄ¼üÅ̲¼¾Ö£¬Í¬Ò»¸öʵÌå¼ü¿ÉÄܱíʾ²»Í¬µÄ·ûºÅ¡£ÀýÈ磬ÔÚ·¨¹ú¼üÅÌÖУ¬Î»ÓÚµÚÈýÐеڶþÁеļüÊÇ
A£¬²»ÊÇ Q¡£´ó²¿·ÖÓ¦ÓóÌÐò£¨ÀýÈçÎı¾±à¼Æ÷£©¶¼Ï£Íû»ñÖªÓû§°´ÏÂÁË Q£¬¶ø²»Êǰ´ÏµļüÔÚ²¼¾ÖÖеÄλÖá£
¼ü·û (keysym) ÊÇÔÚ¿¼ÂǼüÅ̲¼¾Öͼ (keymap) ºó´ÓÒ»´Î»ò¶à´Î°´¼ü/ÊͷżüµÄ²Ù×÷Éú³ÉµÄ·ûºÅ¡£´Ó¼üÂëµ½¼ü·ûµÄת»»ÊDzÙ×÷ϵͳִÐеÄ×îºóÒ»´Îת»»£¬¸Ã²Ù×÷»áÏòÓ¦ÓóÌÐòÌṩ׼ȷµÄ¼ü·û¡£
ͼ 1 ÑÝʾÁËÒ»¸ö¼æÈÝ XT µÄ¼üÅ̽«Ò»¸ö´ÓÃÀ¹ú»ò·¨¹ú¼üÅ̲¼¾Ö½«°´¼üÐźŷ¢Ë͵½»ùÓÚ Linux µÄϵͳµÄת»»Ë³Ðò¡£
ͼ 1. °´¼üÐźÅÈçºÎ´Ó¼üÅÌ·¢Ë͵½Ó¦ÓóÌÐò
²»Í¬ÓÚɨÃèÂëµ½¼üÂëµÄת»»£¬´Ó¼üÂëµ½¼ü·ûµÄת»»ÊDz»¿ÉÄæµÄ£¬ÔÒòÓÐÁ½¸ö¡£Ê×ÏÈ£¬ÕâÖÖת»»ÐèÒªÖªµÀÓÃÓÚÉú³É¼ü·ûµÄ¼üÅ̲¼¾Öͼ£¬¶øÇÒ²»ÊÇËùÓг¡¾°¶¼¿ÉÒÔ»ñµÃ´ËÐÅÏ¢¡£Æä´Î£¬ÎÞ·¨ÖªµÀʹÓÃÁËÄÄÖÖ¼ü×éºÏÀ´´´½¨¼ü·û¡£ÀýÈ磬A
µÄ¼ü·û¿Éͨ¹ý°´ Shift + a »òÔÚËø¶¨´óдʱ°´ a À´Éú³É¡£ÕâÖÖÄ£ºýÐÔÊÇ QEMU ÔÚʹÓà RFB
ʱÓöµ½µÄÎÊÌâµÄÀ´Ô´¡£
RFB ÐÒé¡¢QEMU/KVM ÐéÄ⻯ºÍ VNC
RFB£¨Ô¶³ÌÖ¡»º³åÇø£©ÊÇ VNC ÓÃÓÚÔ¶³Ì·ÃÎÊ GUI µÄÐÒé¡£ÔÚ¸ÃÐÒé¼°ÆäÀ©Õ¹ÐÒéÖж¨ÒåµÄ¶àÖÖ RFB
¿Í»§¶Ëµ½·þÎñÆ÷ÏûÏ¢ÀàÐÍÖУ¬±¾ÎĹØ×¢µÄÊÇ KeyEvent£¬Ò²¾ÍÊÇÔÚ°´Ï»òÊÍ·ÅÒ»¸ö¼üʱ´Ó RFB ¿Í»§¶Ë·¢Ë͵½·þÎñÆ÷µÄÏûÏ¢¡£Í¼
2 ÏÔʾÁ˸ÃÏûÏ¢¸ñʽ¡£
ͼ 2. RFB KeyEvent ¿Í»§¶ËÏûÏ¢µÄ¸ñʽ
message-type Ö¸¶¨ÏûÏ¢ÀàÐÍ¡£KeyEvent ÏûϢΪÀàÐÍ 4¡£
down-flag Ö¸¶¨¼üµÄ״̬¡£Èç¹û°´Ï¸üü£¬¸ÃֵΪ 1£»Èç¹ûÊÍ·Å£¬¸ÃֵΪ 0¡£
padding ÊÇÒ»¸öÌî³äÁË 0 µÄ 2 ×Ö½Ú×ֶΡ£
keysym Êǰ´Ï»òÊͷŵļüµÄ¼ü·û¡£
µ±ÊÕµ½ KeyEvent ÏûϢʱ£¬ÒÀ¾Ý down-flag µÄÖµ£¬RFB ·þÎñÆ÷½«°´Ï»òÊͷżüʱµÄ¼ü·û¸´ÖƵ½Ô¶³Ì×ÀÃæÖС£ÔÚ´ËÏûÏ¢ÖÐʹÓüü·û£¬ÊÇÔçÆÚ
QEMU °æ±¾ÔÚÓÃÓÚÐéÄ⻯µÄ VNC ¿Í»§¶Ë/·þÎñÆ÷ÉÏÓöµ½Éè¼ÆÎÊÌâµÄ¸ùÔ´¡£
Ê״γ¢ÊÔ
QEMU ÏîÄ¿Ê״γ¢ÊÔÒýÈë keymap Ñ¡ÏÒÔ¸æËß QEMU Éú³É¼ü·ûµÄ VNC ¿Í»§¶ËÖÐʹÓÃÁËÄĸö¼üÅ̲¼¾Öͼ¡£ÓÐÁË´ËÐÅÏ¢£¬QEMU
¾Í¿ÉÒÔ³¢ÊÔ´Ó¼ü·ûת»»»Ø¼üÂ룻Èç¹ûδָ¶¨¼üÅ̲¼¾Öͼ£¬Ëü»áʹÓÃĬÈϵÄÃÀ¹ú²¼¾Ö¡£´Ë·½·¨²»×ãÒÔ½â¾ö·ÇÃÀ¹ú¼üÅ̵Ä
QEMU ÎÊÌâ¡£QEMU ÐèÒªÄܹ»Ö§³Ö VNC ¿Í»§¶ËʹÓõÄÈκμüÅ̲¼¾Ö£¨Õë¶Ô 100 ¶àÖÖÓïÑԵIJ¼¾Ö£©£¬¶øÇÒ´ÓÉÏÒ»½ÚÖÐÎÒÃÇÒѾ֪µÀ£¬²»Í¬µÄ×éºÏ¼ü¿ÉÄÜÉú³ÉÏàͬµÄ¼ü·û¡£
QEMU ÊÇÒ»¸öÓ²¼þÄ£ÄâÆ÷¡£µ±ÄúÁ¬½Óµ½ÔÚ QEMU ÐéÄâ»úÖÐÔËÐÐµÄ VNC ·þÎñÆ÷ʱ£¬·þÎñÆ÷²»»áµ¥´¿µØ½ÓÊÕºÍÏÔʾ»÷¼ü£»Ëü»áÄ£ÄâËüÃÇ£¬¾ÍÏñÓÐÈËÔÚÐéÄâ»úÖеÄÒ»¸öÕæÊµ¼üÅÌÉϰ´¼üÒ»Ñù¡£½á¹û£¬ÔÚÊÕµ½
RFB KeyEvent ÏûϢʱ£¬QEMU »á³¢ÊÔ׎«ÒÑ·¢Ë͵ļüת»»ÎªÉú³É¸Ã¼üµÄ XT ɨÃèÂë¡£µ«ÊÇ£¬KeyEvent
ÏûÏ¢·¢Ë͵ÄÊǼü·û¡£QEMU Ôø¾ÃæÁÙ×ÅÈçºÎ¸ù¾Ý¼ü·ûÀûÓÃÒѰ´Ï»òÒÑÊͷŵļüÀ´»ñȡʵ¼Ê XT ɨÃèÂëµÄÌôÕ½¡£
ÔÚ QEMU ×î³õ³¢ÊÔ½â¾ö´ËÎÊÌâʧ°Üºó£¨²Î¼û ¡°Ê״γ¢ÊÔ¡± ±ßÀ¸£©£¬GTK-VNC ºÍ QEMU ÉçÇøºÏ×÷´´½¨ÁË
RFB ÐÒéµÄÒ»¸ö¹Ù·½À©Õ¹£¬¸ÃÀ©Õ¹Ìí¼ÓÁËÒ»ÌõÐ嵀 KeyEvent ÏûÏ¢£¬ÆäÖв»½ö°üº¬¼ü·û£¬»¹°üº¬ÔÚ VNC
¿Í»§¶ËÖа´ÏµļüÂ롣ͼ 3 ÏÔʾÁ˸ÃÏûÏ¢¸ñʽ¡£
ͼ 3. QEMU À©Õ¹ KeyEvent RFB ÏûÏ¢µÄ¸ñʽ
message-type Ö¸¶¨ÏûÏ¢ÀàÐÍ¡£À©Õ¹µÄ QEMU KeyEvent ÏûϢΪÀàÐÍ 255¡£
submessage-type ÓÐÒ»¸öÒ»×Ö½ÚµÄĬÈÏÖµ 0¡£
down-flag Ö¸¶¨¼üµÄ״̬¡£Èç¹û°´Ï¸üü£¬¸ÃֵΪ 1£»Èç¹ûÊÍ·Å£¬¸ÃֵΪ 0¡£
keysym ÊÇÒѰ´Ï»òÊͷŵļüµÄ¼ü·û¡£
keycode ÊÇÉú³É¸Ã¼ü·ûµÄ¼üÂë¡£
½èÖú¶îÍâµÄ keycode ÐÅÏ¢£¬QEMU ¿É½«¼üÂëת»»»ØÉ¨ÃèÂë²¢½øÐÐÄ£Äâ¡£´ËÄÜÁ¦»¹Ê¹ VNC ·þÎñÆ÷²»ÖªµÀ
VNC ¿Í»§¶ËʹÓÃÁËÄĸö¼üÅ̲¼¾Öͼ¡£Ö»Òª¿Í»§¶ËµÄ¼üÅ̲¼¾ÖͼÓëÀ´±ö²Ù×÷ϵͳ£¨ÔÚÐéÄâ»úÖÐÔËÐеIJÙ×÷ϵͳ£©ÖÐÅäÖõļüÅ̲¼¾ÖͼÏàͬ£¬¼üÅ̾ͻᰴԤÆÚ¹¤×÷¡£
Web ¼¼ÊõºÍ»÷¼ü´¦Àí
ÔÚ×ÀÃæÓ¦ÓóÌÐòºÍ Web Ó¦ÓóÌÐòÖ®¼äµÄ¼üÅÌʼþ´¦Àí²îÒì£¬ÎªÈ«ÃæÊµÏÖ»ùÓÚ Web µÄ VNC ¿Í»§¶ËÔö¼ÓÁËÒ»¸ö¸´ÔÓÐԲ㡣¸Ã²ãÊÇä¯ÀÀÆ÷¡£×ÀÃæÓ¦ÓóÌÐò¿É¸üÖ±½ÓµØ·ÃÎʵײãÓ²¼þ£¬¶ø
Web Ó¦ÓóÌÐòÊܵ½ä¯ÀÀÆ÷Ö§³ÖµÄÏÞÖÆ¡£
ä¯ÀÀÆ÷ÖеĻ÷¼ü´¦Àí»ù±¾ÖªÊ¶
ÏÖÔÚ³öÏÖµÄÎÊÌâ×ÜÊý±È 2000 Äê´ú³õÆÚ¸üÉÙ£¬µ«ä¯ÀÀÆ÷Ö®¼äÈÔȻȱ·¦±ê×¼»¯¡£¶øÇÒ̸µ½¼üÅÌ´¦Àí£¬²îÒì¿ÉÄܴܺó¡£
ä¯ÀÀÆ÷ÌáÏò Web Ó¦ÓóÌÐòÌṩÁË 3 ÖÖ¼üÅÌʼþ£º
keydown£º°´ÏÂÒ»¸ö¼ü¡£
keyup£ºÊÍ·ÅÒ»¸ö¼ü£º
keypressed£º°´ÏÂÒ»¸ö×Ö·û¼ü¡£
keydown ºÍ keyup ʼþÓë²Ù×÷ϵͳ´¦ÀíµÄ¼üÅÌʼþÀàËÆ¡£keypressed ʼþ½öÔÚÉú³É¼ü·ûʱ·¢Éú¡£Shift
»ò Alt µÈÌØÊâ¼ü²»»áÉú³É keypressed ʼþ¡£Web Ó¦ÓóÌÐòÒª¿É¿¿µØ»ñµÃÉú³ÉµÄ×Ö·û£¬Ôò±ØÐëÒÀ¿¿
keypressed ʼþ¡£
ÿ¸öʼþÓµÓÐÖÁÉÙÒÔÏ 3 ¸öÊôÐÔ£º
keyCode ÊôÐÔÖ¸°´Ïµļü£¬²»º¬ÐÞÊμü£¬±ÈÈç Shift »ò Alt¡£µ±°´Ï a ¼üʱ£¬ÉõÖÁÔÚÉú³ÉµÄ¼ü·ûΪ
A ʱ£¬keyCode Ò²ÊÇÏàͬµÄ¡£Ðí¶àÍøÕ¾ºÍ Web ½Ì³Ì»áÎóµ¼ÐԵؽ«´ËÊôÐÔ³ÆÎª¼üµÄɨÃèÂë¡£
charCode ÊôÐÔÊǼüʼþ£¨Èç¹ûÓУ©Éú³ÉµÄ¼ü·ûµÄ ASCII Âë¡£
which ÊôÐÔ·µ»ØµÄÖµÔÚ´ó¶àÊýʱºòÓë keyCode Ïàͬ£¬Ìṩ°´ÏµļüµÄ Unicode Öµ¡£
¿ÉÒÔʹÓà Javascript ¼üʼþ²âÊԽű¾ Ò³Ãæ²é¿´ÔÚ°´ÏÂij¸ö¼üʱ¼üÅÌʼþÓкÎÐÐΪ¡£ÀýÈ磬°´ÏÂ×ó Shift
¼ü»áµÃµ½£º
keydown keyCode=16 which=16 charCode=0 keyup keyCode=16 which=16 charCode=0 |
°´Ï a ¼ü»áµÃµ½£º
keydown keyCode=65 (A) which=65 (A) charCode=0 keypress keyCode=0 which=97 (a) charCode=97 (a) keyup keyCode=65 (A) which=65 (A) charCode=0 |
°´×¡ a ¼ü²»·Å»áµÃµ½£º
keydown keyCode=65 (A) which=65 (A) charCode=0 keypress keyCode=0 which=97 (a) charCode=97 (a) keydown keyCode=65 (A) which=65 (A) charCode=0 keypress keyCode=0 which=97 (a) charCode=97 (a) keydown keyCode=65 (A) which=65 (A) charCode=0 keypress keyCode=0 which=97 (a) charCode=97 (a) keyup keyCode=65 (A) which=65 (A) charCode=0 |
ÕâÖÖ¶Ô¼üÅÌʼþµÄä¯ÀÀÆ÷Ö§³ÖʹʵÏÖ VNC Web ¿Í»§¶Ë³ÉΪ¿ÉÄÜ¡£Ò»Ð© VNC ¿Í»§¶ËÏîÄ¿ÒÑ¿ªÊ¼ÊÔÑé½â¾ö¶à¼üÅ̲¼¾ÖÎÊÌâ¡£µ«
noVNC ÏîĿûÓÐʵÏÖ QEMU VNC À©Õ¹À´´¦Àí¸ÃÎÊÌ⣬ËùÒÔÔÚ 2015 Ä꣬ÎÒÃǾö¶¨³¢ÊÔһϡ£ºÁÎÞÒÉÎÊ£¬ÎÒÔøÈÏΪ½â¾ö¸ÃÎÊÌâ½öÐèʹÓÃ
keyCode£¨ä¯ÀÀÆ÷ÌṩµÄËùνµÄɨÃèÂ룩²¢½«Æä·ÅÔÚ QEMU À©Õ¹µÄ KeyEvent ÏûÏ¢ÖС£ÄÄÀï¿ÉÄܳö´íÁË£¿
keyCode£¬ËùνµÄɨÃèÂë
ÔÚ noVNC ÖÐʹÓà keyCode ÊôÐÔʵÏÖ QEMU À©Õ¹£¬Ã»Óнâ¾ö¼üÅ̲¼¾ÖÎÊÌâ¡£ÎÒÁ˽⵽£¬¾¡¹Ü
keyCode ÊôÐÔÓµÓж¨Î»ÐÐΪ£¬µ«ËüÒÀÀµÓÚ²¼¾Ö£¬Òò´ËÎÞ·¨ÔÚ QEMU KeyEvent ÏûÏ¢ÖÐÓÃ×÷¼üÂë¡£
ÏÂÃæµÄ¼òµ¥ÊÔÑéչʾÁ˲»Í¬²¼¾ÖÖÐµÄ keyCode ÊôÐÔµÄÐÐΪ¡£ÎÒÃÇÔÙ´ÎʹÓà Javascript ¼üʼþ²âÊԽű¾
Ò³ÃæÀ´Õ¹Ê¾¼üÅÌʼþ£¬ÒÔÏÂÊÇÔÚÃÀ¹ú²¼¾Ö¼üÅÌÖа´Ï q ¼üʱµÄÊä³ö£º
keydown keyCode=81 (Q) which=81 (Q) charCode=0 keypress keyCode=0 which=113 (q) charCode=113 (q) keyup keyCode=81 (Q) which=81 (Q) charCode=0 |
½«²¼¾Ö¸ü¸ÄΪ·¨¹ú£¬ÒÔÏÂÊÇͬһ¸ö¼üµÄÊä³ö£º
keydown keyCode=65 (A) which=65 (A) charCode=0 keypress keyCode=0 which=97 (a) charCode=97 (a) keyup keyCode=65 (A) which=65 (A) charCode=0 |
Çë×¢Ò⣬µ±²¼¾Ö·¢Éú¸ü¸Äʱ£¬keyCode Öµ´Ó 81 ±äΪÁË 65¡£ÔÚ·¨¹ú AZERTY ²¼¾Ö¼üÅÌÖУ¬µÚÈýÐеڶþ¸ö¼üÊÇ
a£¬keyCode ·´Ó³ÁËÕâÒ»²¼¾Ö±ä»¯¡£
ÔÚÎÒ³¢ÊÔÔÚ noVNC ÏîÄ¿ÖÐʵÏÖ QEMU À©Õ¹Ê±£¬ä¯ÀÀÆ÷µÄ JavaScript ÖÐûÓÐÃèÊöÎïÀíλÖõÄÊôÐÔ
¡ª a ¼üµÄ²»ÒÀÀµÓÚ²¼¾ÖµÄ¼üÂë¡£ËùÒÔ£¬ÎÒ±ØÐëÔÝʱ¸éÖÃÕâÏ×÷¡£
KeyboardEvent.code ³ÉΪÁ˾ÈÐÇ
2016 Äê³õ£¬Chrome ä¯ÀÀÆ÷Îȶ¨°æ 48 Öаüº¬Ò»¸öÃûΪ code µÄРKeyboardEvent
ÊôÐÔ¡££¨Firefox ֮ǰÒÑÒýÈë´ËÊôÐÔ£¬Opera ËæºóÒ²ÌṩÁËËü¡££©Mozilla Developer
Network ¶Ô´ËÊôÐÔ½øÐÐÁËÈçÏÂÃèÊö£º
KeyboardEvent.code °üº¬Ò»¸ö±êʶËù°´ÏµÄʵÌå¼üµÄ×Ö·û´®¡£¸ÃÖµ²»Êܵ±Ç°¼üÅ̲¼¾Ö»òÐÞÊμü״̬µÄÓ°Ï죬ËùÒÔÌØ¶¨µÄ¼ü½«Ê¼ÖÕ·µ»ØÏàͬµÄÖµ¡£
½èÖúÕâ¸öÐÂÊôÐÔ£¬ÎÒ¿ÉÒÔ¼ÌÐø²¢Íê³ÉÎÒµÄʵÏÖ¡£
ÓÐЧµÄʵÏÖ
ä¯ÀÀÆ÷Ö§³Ö×´¿ö
½ØÖÁ±àд±¾ÎÄʱ£¬Chrome¡¢Firefox¡¢Firefox for Android ºÍ Opera ¶¼Ö§³Ö
KeyboardEvent.code ÊôÐÔ¡£Microsoft Edge ·Ïßͼ ½«´Ë API ÁÐÈë ¡°¿¼ÂÇ¡±
·¶Î§¡£¶ÔÓÚÈκβ»Ö§³Ö KeyboardEvent.code µÄä¯ÀÀÆ÷£¬VNC Web ¿Í»§¶Ë±ØÐë½ûÓà QEMU
VNC À©Õ¹£¬Í˶øÊ¹ÓÃĬÈ쵀 RFB KeyEvent ÏûÏ¢£¬»òÕßÕÒµ½ÁíÒ»ÖÖ·½·¨À´Ê¹ÓÿÉÓÃµÄ KeyboardEvent
ÊôÐÔ»ñÈ¡²»ÒÀÀµÓÚ²¼¾ÖµÄʵÌå¼ü¡£
À©Õ¹µÄ QEMU KeyEvent ÏûÏ¢ÒÑÔÚ¶à¸ö×ÀÃæ VNC ¿Í»§¶ËÖÐÁ¼ºÃµØ½¨Á¢ºÍʵÏÖ¡£¼ÈÈ» KeyboardEvent.code
ÊôÐÔʹ»Ö¸´°´ÏµÄʵÌå¼ü³ÉΪ¿ÉÄÜ£¬ÄÇô VNC Web ¿Í»§¶Ë¾ÍûÓÐÀíÓɲ»²ÉÓÃÏàͬ·½Ê½ÊµÏÖ¸ÃÀ©Õ¹¡£ÎÒΪ noVNC
ÏîĿʵÏֵĽâ¾ö·½°¸¿É¹©ÈκλùÓÚ Web µÄ VNC ¿Í»§¶ËʹÓá£
ºöÂÔ keypressed ʼþ
ÎÒÔÚ½â¾ö·½°¸ÖÐÑ¡ÔñÁ˺öÂÔ keypressed ʼþ¡£ÕâЩʼþ½öÔÚÒ»¸ö»ò¶à¸ö keypressed ʼþÉú³ÉÒ»¸ö¿É¶Á×Ö·û£¨Ò»¸ö¼ü·û£©Ê±´¥·¢¡£¼ì²âµ½À´×ÔÖ§³Ö
QEMU VNC À©Õ¹µÄ¿Í»§¶ËµÄÁ¬½Óʱ£¬QEMU VNC ·þÎñÆ÷»á£¨ÔÚ´ó¶àÊýʱºò£¬ÎÒÉÔºó½«ÌÖÂÛ£©ºöÂÔÏûÏ¢µÄ
keysym ×ֶΣ¬½öÒÀ¿¿ keycode ×Ö¶ÎÔÚÐéÄâ»úÖÐÄ£Äâ XT ɨÃèÂë¡£
´úÂëʵÏÖ
ÎÒÉè¼ÆµÄÍêÕû¡¢ÓÐЧµÄʵÏÖ¿ÉÔÚ GitHub ÉÏ»ñµÃ¡£
ÔÚÕâÀÎÒ½«Öصã½éÉÜÒ»Ð©ÌØ±ðÖµµÃ×¢ÒâµÄϸ½Ú¡£
ÈçºÎ½« KeyboardEvent.code ת»»Îª xt_scancode
KeyboardEvent.code ÌṩÁ˼üµÄÎïÀíλÖ㬵«Î´Ê¹ÓÿÉÖ±½ÓÓÃÔÚ RFB ÏûÏ¢Öеĸñʽ¡£ÒÔÏÂÊǸÃÊôÐԵĿÉÄÜÖµµÄÒ»¸öʾÀý£º
'Esc' key: xt_scancode 0x0001 keyboardevent.code = "Escape" Spacebar: xt_scancode 0x0039 keyboardevent.code = "Space" 'F1' key: xt_scancode 0x003B keyboardevent.code = "F1" |
ÎÒµÄʵÏÖʹÓÃÁËÕâÆªÓÐ¹Ø KeyboardEvent.code µÄ Mozilla Developer Network
ÎÄÕ ÖÐÌṩµÄ±í£¬´´½¨Ò»¸ö½« KeyboardEvent.code ֵת»»ÎªÏàÓ¦µÄ xt_scancode
µÄ¹þÏ£±í£¬ÀýÈ磺
XT_scancode["Escape"] = 0x0001; XT_scancode["Space"] = 0x0039; XT_scancode["F1"] = 0x003B; |
´´½¨ QEMU RFB KeyEvent ÏûÏ¢
½« buff ÊÓΪһ¸ö´óСΪ 12 µÄ×Ö½ÚÊý×飺
buff[offset] = 255; // msg-type buff[offset + 1] = 0; // sub msg-type buff[offset + 2] = (down >> 8); buff[offset + 3] = down; buff[offset + 4] = (keysym >> 24); buff[offset + 5] = (keysym >> 16); buff[offset + 6] = (keysym >> 8); buff[offset + 7] = keysym; var RFBkeycode = getRFBkeycode(keycode) buff[offset + 8] = (RFBkeycode >> 24); buff[offset + 9] = (RFBkeycode >> 16); buff[offset + 10] = (RFBkeycode >> 8); buff[offset + 11] = RFBkeycode; |
Êý¾Ý½á¹¹Óë ͼ 3 ÀàËÆ£¬Õâ¾ø·ÇżȻ¡£ÔÚ±¾´úÂëÖУ¬keycode ÊÇ´Ó keyboardevent.code
ֵת»»µÃµ½µÄ xt_scancode£¬keysym ÊÇÒ»¸ö 0 ×ֶΣ¨´ó²¿·ÖÇé¿öÏÂÈç´Ë£©¡£
getRFBkeycode() º¯Êý½« XT_scancode ת»»Îª QEMU VNC À©Õ¹¶¨ÒåµÄ¸ñʽ£º
function getRFBkeycode(xt_scancode) { var upperByte = (keycode >> 8); var lowerByte = (keycode & 0x00ff); if (upperByte === 0xe0 && lowerByte < 0x7f) { lowerByte = lowerByte | 0x80; return lowerByte; } return xt_scancode } |
NumLock µÄ¶ÀÌØÇé¿ö£º¼ü·û·¢»Ó×÷ÓõÄʱ¿Ì
ÎÒÌáµ½¹ý¼ü·û»ù±¾Éϱ»ºöÂÔ¡£ÔÚÖÁÉÙÒ»ÖÖÇé¿öÏ£¬QEMU VNC ·þÎñÆ÷»á¿¼ÂǼü·û£ºµ±Ê¹ÓÃÊý×Ö¼üÅÌ (Numpad)
Öеļüʱ¡£
ÔÚÎҵĽâ¾ö·½°¸µÄµÚÒ»¸öʵÏÖÖУ¨ºöÂÔ QEMU KeyEvent ÏûÏ¢µÄ¼ü·û×ֶΣ©£¬³öÏÖÁËÒ»ÖÖÆæ¹ÖµÄÐÐΪ£ºµ±°´ÏÂÈκζàÓÃ;Êý×Ö¼üÅ̼üʱ£¬±ÈÈç
0¡¢1¡¢2¡¢3¡¢4¡¢6¡¢7¡¢8¡¢9 »òСÊýµã£¨en_US ²¼¾ÖÖеľäµã£©£¬¼´Ê¹ÐéÄâ»úºÍ¿Í»§¶ËÉ쵀 NumLock
״̬Ϊ ON£¬QEMU VNC ·þÎñÆ÷Ò²»á£º
½«ÐéÄâ»úµÄ NumLock ״̬¸ü¸ÄΪ OFF£¨Èç¹ûËüΪ ON£©
°´¼ü
ÀýÈ磬ÔÚ¿Í»§¶ËºÍÐéÄâ»úÉ쵀 NumLock ״̬Ϊ ON ʱ°´Êý×Ö¼üÅ̼ü 8£¬»á½«ÐéÄâ»úÖÐµÄ NumLock
״̬¸ü¸ÄΪ OFF£¬È»ºóÖ´ÐÐÏòÉϼýÍ·¼üµÄ²Ù×÷¡£ÔÚ NumLock ״̬Ϊ OFF ʱ°´Êý×Ö¼üÅ̼ü 8 µÄÐÐΪ²ÅÊÇ·ûºÏÔ¤ÆÚµÄ¡£
´ËÎÊÌâ¿Éͨ¹ý¿É¿¿·½Ê½ÀûÓÿͻ§¶ËºÍÐéÄâ»úµÄ NumLock ״̬À´½â¾ö¡£µ«Ô¶³Ì QEMU VNC ·þÎñÆ÷²»¿ÉÄÜÖªµÀ¿Í»§¶Ë¼üÅ̵Ä
NumLock ״̬¡£·þÎñÆ÷¿ÉÒÔ¿´µ½ºÎʱ°´ÏÂ/ÊÍ·Å NumLock ¼ü£¬µ«ÎÞ´ÓÁ˽⵱ǰµÄ NumLock
״̬£¬ÒòΪ QEMU VNC KeyEvent ÏûϢδ´«µÝ¸ÃÐÅÏ¢¡£
¾¹ýÔÚ×ÀÃæ VNC ¿Í»§¶ËÉϹ㷺²âÊÔºó£¬ÎÒÈÏʶµ½ÔÚÕâЩ»·¾³Öз¢ËÍÁ˼ü·û¡£¾¡¹Ü¼üÂë²»»á»ùÓÚ NumLock
״̬¶ø·¢Éú¸ü¸Ä£¬µ«¼ü·û»áÊܵ½Ó°Ïì¡£½áÂÛÊÇ£¬QEMU VNC ·þÎñÆ÷ʹÓüü·û×Ö¶ÎÀ´²Â²â¿Í»§¶ËµÄ NumLock
״̬£¬²¢²ÉÈ¡ÏàÓ¦Ðж¯À´³¢ÊÔͬ²½ÐéÄâ»ú״̬¡£ÔÚʵÏÖÖУ¬·¢Ë͵ļü·ûΪ 0 ʱ£¬·þÎñÆ÷½«´Ë½âÊÍΪ ¡°¿Í»§¶ËµÄ
NumLock ״̬Ϊ OFF¡±£¬Ç¿Öƽ«¿Í»§¶Ë NumLock ״̬¸ü¸ÄΪ OFF£¬È»ºó·¢ËͰ´ÏµļüÂë¡£
ÒòΪÈç¹û²»·¢Ëͼü·û£¬»áĬÈÏΪ NumLock ״̬Ϊ OFF£¬ËùÒÔ½â¾ö·½°¸ÊǽöÔÚ NumLock ״̬Ϊ
ON ʱ·¢Ëͼü·û¡£
·¢ËÍÊý×Ö¼üÅ̵ļü·û
Éú³É¼ü·ûµÄ¼üÅÌʼþÊÇ keypressed ʼþ£¬ÎҵĽâ¾ö·½°¸ºöÂÔÁ˸Ãʼþ¡£ÄÇôÈçºÎ½«¼ü·ûÓ¦ÓÃÓÚ QEMU
KeyEvent ÏûÏ¢£¿
ÐÒÔ˵ÄÊÇ£¬È·¶¨¼ü·û²»ÊÇÒ»¶¨ÐèÒª keypressed ʼþ¡£Êý×Ö¼üÅÌÔÚËùÓв¼¾ÖÖж¼ÊDZê×¼µÄ£¨·ñÔò£¬Èç¹ûûÓмüÅ̲¼¾Öͼ£¬QEMU
VNC ·þÎñÆ÷¾ÍÎÞ·¨²Â²â NumLock ״̬£©¡£ËùÒÔ£¬Êý×Ö¼üÅ̼üµÄ¼ü·ûÖµ¿ÉÔ¤ÏÈÈ·¶¨¡£
Õâ¾ÍÁôÏÂÁËÒ»¸öÎÊÌ⣬Èç¹û²»Ê¹Óà keypress ʼþ£¬ÈçºÎÇø·ÖÊý×Ö¼ü 7 ÓÃ×÷ Home ¼üµÄÇé¿öºÍÓÃ×÷Êý×Ö
7 µÄÇé¿ö¡£ÎÒµÄʵÏÖʹÓÃÁË KeyboardEvent.keyCode ÊôÐÔ£¨ÔÚ keydown ʼþÉÏÉèÖã©À´½øÐÐÇø·Ö£¬ÈçÏÂÃæµÄ´úÂëÆ¬¶ÎËùʾ¡£
ÏÂÃæµÄº¯Êý½ÓÊÕÒ»¸ö¼üÅÌʼþ evt£¬²¢½« KeyboardEvent.code ÖµÓëÊôÓÚÊý×Ö¼üÅ̵ÄÖµÏà±È½Ï£º
function isNumPadMultiKey(evt) { var numPadCodes = ["Numpad0", "Numpad1", "Numpad2", "Numpad3", "Numpad4", "Numpad5", "Numpad6", "Numpad7", "Numpad8", "Numpad9", "NumpadDecimal"]; return (numPadCodes.indexOf(evt.code) !== -1); } |
ÎÒʹÓÃÇ°ÃæµÄº¯ÊýÀ´²é¿´ÊÇ·ñÐèÒª¶Ôij¸öÖ¸¶¨µÄ¼üÅÌʼþ½øÐÐÈκÎÌØÊâ´¦Àí¡£
ÏÂÃæµÄº¯Êý½ÓÊÕÒ»¸ö¼üÅÌʼþ evt£¬²¢½«ËüµÄ keyboardevent.keyCode ÊôÐÔÓëÒ»¸öÃûΪ
numLockOnKeyCodes µÄÔ¤¶¨ÒåÖµ¼¯Ïà±È½Ï£º
function getNumPadKeySym(evt) { var numLockOnKeySyms = { "Numpad0": 0xffb0, "Numpad1": 0xffb1, "Numpad2": 0xffb2, "Numpad3": 0xffb3, "Numpad4": 0xffb4, "Numpad5": 0xffb5, "Numpad6": 0xffb6, "Numpad7": 0xffb7, "Numpad8": 0xffb8, "Numpad9": 0xffb9, "NumpadDecimal": 0xffac }; var numLockOnKeyCodes = [96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 108, 110]; if (numLockOnKeyCodes.indexOf(evt.keyCode) !== -1) { return numLockOnKeySyms[evt.code]; } return 0; |
ÔÚ NumLock ON ״̬Ï£¬numLockOnKeyCodes Öµ¶ÔÓ¦ÓÚÊý×Ö¼üÅ̼ü 0 µ½ 9 ºÍСÊýµã¡£Èç¹û
evt.keyCode ÊÇÕâЩֵ֮һ£¬ÄÇô¸Ãº¯Êý»á·µ»Ø numLockOnKeySyms ÌṩµÄµÈЧ¼ü·û£»·ñÔò£¬Ëü»á·µ»Ø
0¡£
ÒÔÏÂÊÇÔÚ´úÂëÄÚµ÷ÓÃÕâЩº¯ÊýµÄ·½Ê½£º
result.code = evt.code; result.keysym = 0; if (isNumPadMultiKey(evt)) { result.keysym = getNumPadKeySym(evt); } |
ÔÚ´Ë´úÂëÖУ¬result ÊÇÔÚ´¦Àí¹ý³ÌÖд«µÝµÄ¶ÔÏó¡£ÕâÑù£¬½â¾ö·½°¸¾Í¿ÉÒÔÈ·±£ÕýÈ·´¦Àí NumLock ¼ü¡£
AltGR ºÍ Windows
ÎÒÔÚ Windows 10 ÉÏÔËÐеÄËùÓÐÖ§³ÖµÄä¯ÀÀÆ÷£¨Chrome¡¢Firefox ºÍ Opera£©ÖвâÊÔ
noVNC ½â¾ö·½°¸Ê±³öÏÖÁËÁíÒ»¸öÒì³££ºAltGR ÐÞÊμüÔÚ Linux ÐéÄâ»úÉÏδ°´Ô¤ÆÚ¹¤×÷¡£
ͨ¹ýµ÷ÊÔ´úÂ룬ÎÒ·¢ÏÖ£¬ AltGR ¼üͨ¹ýÁ½Ìõ KeyEvent ÏûÏ¢·¢Ë͵½ QEMU VNC ·þÎñÆ÷£¬¶ø²»ÊÇÒ»ÌõÏûÏ¢¡£µÚÒ»ÌõÏûÏ¢ÊÇÒ»¸ö×ó
Ctrl ¼ü£»µÚ¶þÌõÏûÏ¢ÊÇÒ»¸öÓÒ Alt ¼ü ¡ª ÓëÄúÆÚÍûijÈ˰´ÏÂ×ó Ctrl ºóÁ¢¼´°´ÓÒ Alt µÄЧ¹ûÏàͬ¡£µ±¿Í»§¶ËÔÚ
Linux PC ÖÐÔËÐÐʱ£¬·¢ËÍ AltGR ¼ü×÷ΪÓÒ Alt¡£
³öÏÖ´ËÐÐΪ ÊÇÓÐÀúÊ·ÔÒòµÄ¡£³¤»°¶Ì˵£º¾ÉµÄÃÀ¹ú¼üÅÌûÓÐ AltGR ¼ü£¬Windows ×î³õʹÓÃ×ó Ctrl
+ ÓÒ Alt À´Ä£ÄâËü¡£´Ë½â¾ö·½°¸ÊʺÏûÓÐ AltGR ¼üµÄ¼üÅÌ£¬µ«ÔÚʹÓÃÓÐ AltGR µÄ¼üÅÌʱ¿ÉÄÜ´øÀ´Î󵼡£
Ò»¸ö½â¾ö·½°¸ÊǼǼ´ËÐÐΪ£¬²¢Ç¿ÖÆÓû§É¾³ý´ËĬÈÏÓ³Éä¡£ÁíÒ»¸öÊÇÎÒÑ¡ÔñµÄ½â¾ö·½°¸ ¡ª ÓÃÓÚ´¦Àí noVNC
ÖеÄÐÐΪ¡£ÎҵĴúÂë°üº¬¶Ô°´×ó Ctrl ºó°´ÓÒ Alt µÄ×éºÏµÄÌØÊâ´¦Àí£º
if (state.length > 0 && state[state.length-1].code == 'ControlLeft') { if (evt.code !== 'AltRight') { next({code: 'ControlLeft', type: 'keydown', keysym: 0}); } else { state.pop(); } } (...) if (evt.code !== 'ControlLeft') { next(evt); }
|
´Ë´úÂë¸æËß noVNC£ºÔÚ keydown ʼþÖУ¬Èç¹û KeyboardEvent.code µÈÓÚ ControlLeft£¬Ôò²»ÒªÁ¢¼´×ª·¢¸Ãʼþ¡£µÈ´ýµÚ¶þ¸ö
keydown ʼþ£¬²¢ÑéÖ¤ËüµÄ´úÂëÊÇ·ñµÈÓÚ AltRight£¬ÕâÒâζ×Åä¯ÀÀÆ÷ÊÕµ½ÁËÒ»¸ö×ó Ctrl +
ÓÒ Alt µÄ×éºÏ£¬Õâ¿ÉÄÜÒâζ×ÅÔÚ Windows ä¯ÀÀÆ÷Öа´ÏÂÁË AltGR ¼ü¡£ÔÚÕâÖÖÇé¿öÏ£¬¶ªÆú×ó
Ctrl£¬½öת·¢ÓÒ Alt£¬ÕâÊÇ Linux ÖеÄĬÈÏÐÐΪ¡£ÕâÖÖ´¦Àíʹ AltGR ¼üÄܰ´Ô¤ÆÚ¹¤×÷£¬ÉõÖÁÔÚ
Windows ä¯ÀÀÆ÷ÖÐÒ²ÊÇÈç´Ë¡£
´Ë·½·¨µÄȱµãÊÇ£¬¼´Ê¹Óû§ºÏÀíµØ°´ÏÂÁË×ó Ctrl + ÓÒ Alt µÄ×éºÏ£¬Ò²²»»áת·¢¸Ã×éºÏ¡£ÎÒ½«´ËÊÓΪ¿É½ÓÊܵÄȱµã£¬ÒòΪ×ó
Ctrl + ÓÒ Alt ²»ÊÇÒ»ÖÖ³£ÓõÄ×éºÏ¼ü£¨×ó Ctrl + ×ó Alt ºÍÓÒ Ctrl + ÓÒ Alt
ÈÝÒ×¼üÈëµÃ¶à£©¡£ÊÊÓÃÐÔÓ°Ï켫С£¬¶øÇÒÓû§²»ÐèÒªÔÚ Windows ÖØÐÂÅäÖüüÅ̲¼¾Öͼ¡£
ÆúÓõÄÊôÐÔ
ÎÒµÄʵÏÖµÄÁíÒ»¸öÒÑ֪ȱÏÝ£¬ÊÇÒ»¸öÓÃÓÚ´¦Àí NumLock ÎÊÌâµÄÊôÐÔ£º
if (numLockOnKeyCodes.indexOf(evt.keyCode) !== -1) { |
KeyboardEvent.keyCode£¨Á¬Í¬ which ºÍ charCode£¬¿ÉÔÚ ¡°Web ¼¼ÊõºÍ»÷¼ü´¦Àí¡±
²¿·Ö¿´µ½£©×Ô 2015 ÄêÒÔÀ´Òѱ» ÆúÓᣵ«ÊÇ£¬µ±Ê±Ôڴ󲿷Öä¯ÀÀÆ÷ÖÐûÓÐʵÏÖÓ¦ÔÚËüÃǵÄλÖÃʹÓõÄÊôÐÔ KeyboardEvent.key£¨¶øÇÒÔÚ±àд±¾ÎÄʱ£¬ËùÓÐ
Safari °æ±¾ºÍ Chrome ÒÆ¶¯°æ±¾ÈÔ²»Ö§³ÖËü£©¡£ËùÓÐÕâЩÆúÓõÄÊôÐÔ±»¹ã·ºÓÃÔÚ noVNC ºÍÆäËûÈκÎÐèÒª¼üÅÌ¿ØÖƵÄÓ¦ÓóÌÐòÖС£ÎÒ²»Ï£Íûä¯ÀÀÆ÷ºÜ¿ì¶ªÆúÕâЩÊôÐÔ£¬µ«ÒÀ¿¿Ò»¸öÆúÓõÄÊôÐÔ²»ÊÇÍÆ¼ö×ö·¨¡£ÎÒÇ¿ÁÒ½¨ÒéÊÜÓ°ÏìÓ¦ÓóÌÐòµÄ¿ª·¢ÈËÔ±½«
keyCode¡¢which ºÍ charCode ÖØ¹¹ÎªÐ嵀 KeyboardEvent.key API¡£
½áÊøÓï
×ÀÃæÓë Web VNC ¿Í»§¶Ë
¾¡¹Ü¸ü·½±ãʹÓ㬵«»ùÓÚ Web µÄ VNC ¿Í»§¶Ë±È×ÀÃæ¿Í»§¶Ë¸üÂý¡£Kimchi µÄÒ»¸öÉçÇøÒªÇóÊÇ£¬Ê¹ÓÃÃûΪ
Virt Viewer µÄ Linux VNC ¿Í»§¶ËÈÃ×ÀÃæ VNC ¿Í»§¶Ë¸üÈÝÒ×Á¬½Óµ½ Kimchi
¹ÜÀíµÄÐéÄâ»ú¡£×÷Ϊ Kimchi ÏîÄ¿µÄ»îÔ¾¹±Ï×Õߣ¬ÎÒ¿ª·¢ÁËÒ»¸ö Kimchi ÌØÐÔ£¬ÈÃÓû§¿ÉÒÔÑ¡ÔñʹÓÃ
Virt Viewer »¹ÊÇ noVNC À´Á¬½Óµ½ Kimchi ÐéÄâ»úµÄ VNC ·þÎñÆ÷¡£
µ÷²é VNC Web Ó¦ÓóÌÐòÖеļüÅ̲¼¾ÖÎÊÌ⣬ÔÚ noVNC ÏîÄ¿ÖÐʵÏÖ½â¾ö·½°¸²¢´¦ÀíδԤ¼ûµÄÎÊÌ⣬ÊÇÒ»¸öËä¼è¿àµ«ÓÐÒæµÄ¹ý³Ì¡£
Web ¿ª·¢×ÔÔçÆÚµÄجÃÎʱ´úÒÔÀ´ÒÑÓÐÁ˺ܴó¸ÄÉÆ¡£ä¯ÀÀÆ÷¼æÈÝÐÔµÄÌá¸ßʹµÃ´ó²¿·Ö Web Ó¦ÓóÌÐò¶¼Ö»Ðè±àÂëÒ»´Î£¬¼´¿ÉÔÚËùÓÐÖ÷Òªä¯ÀÀÆ÷Öа´Ô¤ÆÚÔËÐС£µ«µ±Ó¦ÓóÌÐòÐèÒª¸ü¸ß¼¶µÄ
API ʱ£¬±ÈÈç¼üÅÌ´¦Àí»òÕßÉõÖÁÒÆ¶¯É豸¼ÓËټƣ¬ÎÊÌâ¾Í³öÏÖÁË¡£ÔÚÕâЩ API ÖУ¬ä¯ÀÀÆ÷Ö§³Ö»º³åÇø£¬ÕâÖ±½ÓÓ°ÏìÁËӦʹÓÃÏàͬ´úÂë¿âÔÚ¶à¸öÉ豸ÉÏÔËÐУ¨½èÖúÏìӦʽ
Web Éè¼ÆºÍ HTML5£©µÄÓ¦ÓóÌÐòµÄ¿ª·¢¡£
ÔÚÃæÁÙ¼üÅ̲¼¾ÖÎÊÌâʱ£¬VNC Web ¿Í»§¶Ë¾Í»áÊܵ½ÕâÀà¿çä¯ÀÀÆ÷²îÒìµÄÓ°Ï졣δʵÏÖ QEMU VNC KeyEvent
À©Õ¹µÄÏîÄ¿ÎÞ·¨°ÚÍÑһЩÎÊÌ⣬±ÈÈçÈçºÎÔÚ²»ÖªµÀʹÓõļüÅ̲¼¾ÖͼµÄÇé¿öϽâÊÍ·ÇÃÀ¹ú¼üÅÌÖеĸø¶¨¼ü·û¡£³ý·Ç KeyboardEvent.code
ÊôÐÔ¿ÉÓÃÓÚËùÓÐä¯ÀÀÆ÷£¬·ñÔòʵÏÖ¸ÃÀ©Õ¹µÄÏîÄ¿£¨ÕýÈçÎÒΪ noVNC Ëù×öµÄÒ»Ñù£©ÐèÒªÖ§³ÖÁ½ÖÖ²»Í¬µÄ¼üÅÌ´¦Àíģʽ¡£ |