Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÔÚ»ùÓÚ Web µÄ VNC Ó¦ÓóÌÐòÖÐÖ§³Ö¶àÖÖ¼üÅ̲¼¾Ö
 
À´Ô´£ºIBM  ·¢²¼ÓÚ£º2016-11-25
  2189  次浏览      30
 

»ùÓÚ 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 Ëù×öµÄÒ»Ñù£©ÐèÒªÖ§³ÖÁ½ÖÖ²»Í¬µÄ¼üÅÌ´¦Àíģʽ¡£

   
2189 ´Îä¯ÀÀ       30
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ʹÓÃdecj¼ò»¯Webǰ¶Ë¿ª·¢
Web¿ª·¢¿ò¼ÜÐγÉÖ®ÂÃ
¸üÓÐЧÂʵÄʹÓÃVisual Studio
MVP+WCF+Èý²ã½á¹¹´î½¨¿ò¼Ü
ASP.NETÔËÐлúÖÆÇ³Îö¡¾Í¼½â¡¿
±àд¸üºÃµÄC#´úÂë
10¸öVisual Studio¿ª·¢µ÷ÊÔ¼¼ÇÉ

.NET¿ò¼ÜÓë·Ö²¼Ê½Ó¦Óüܹ¹Éè¼Æ
.NET & WPF & WCFÓ¦Óÿª·¢
UML&.Net¼Ü¹¹Éè¼Æ
COM×é¼þ¿ª·¢
.NetÓ¦Óÿª·¢
InstallShield

ÈÕÕÕ¸Û .NET Framework & WCFÓ¦Óÿª·¢
Éñ»ªÐÅÏ¢ .NETµ¥Ôª²âÊÔ
±±¾© .NetÓ¦ÓÃÈí¼þϵͳ¼Ü¹¹
̨´ïµç×Ó .NET³ÌÐòÉè¼ÆÓ뿪·¢
ÈüÃÅÌú¿Ë C#Óë.NET¼Ü¹¹Éè¼Æ
¹ã¶«ºËµç .NetÓ¦ÓÃϵͳ¼Ü¹¹