²Ä¤Q¤E³¹¡@Áä½L¥[³tÁä


¥ÎÁä½L¾Þ§@ Windows À³¥Îµ{¦¡

ÁöµM¤j³¡¤Àªº¤H³£²ßºD¨Ï¥Î·Æ¹«¾Þ§@ Windows §@·~¨t²Î¤WªºÀ³¥Îµ{¦¡¡A¦ý Windows ¤]´£¨Ñ¤F¤£¨Ï¥Î·Æ¹«ªº¤è¦¡¡A·íµM³o¨Ã¤£¦n¥Î¡CWindows ´£¨Ñ¤F¤@®M¼Ð·Ç«öÁ䤶­±¡A¥i¥H¥Î¨Ó¾Þ§@¥\¯àªí¡F°£¦¹¤§¥~¡AÀ³¥Îµ{¦¡¤]¥i¥H¦Û¦æ³]­p¨âºØ¤èªk¾Þ§@¥\¯àªí¡A©Ò¥H¡AÁ`¦@¦³¤TºØ¤èªk¥i¥H¥ÎÁä½L¾Þ§@¥\¯àªí¡G

¡@¡@①¡B¼Ð·Ç«öÁ䤶­±¡]standard keyboard interface¡^¡C

¡@¡@②¡B¥\¯àªí¦s¨úÁä©Î«K±¶Áä¡A­^¤å¬O menu access keys¡A¤]ºÙ¬°§U¾ÐÁä¡]mnemonic keys¡^¡C

¡@¡@③¡BÁä½L¥[³tÁä¡A²ºÙ¥[³tÁä¡A­^¤å¬O accelerators¡A¤]ºÙ¬° menu shortcut keys¡A¥i½Ķ¦¨¿ï³æ§Ö±¶Áä©Î²ºÙ§Ö±¶Áä¡C

²Ä¤@ºØ¬O Windows ´£¨Ñªº¡A«á¨âºØ¬OÀ³¥Îµ{¦¡´£¨Ñªº¡C

·íµM¡AWindows ¤]´£¨Ñ¤F¤@¨Ç¨t²Î¥[³tÁä¡A³oºØ¨t²Î¥[³tÁä§@¥Î½d³ò¨Ã¤£¬O¶È­­©óÀ³¥Îµ{¦¡¡A¦³¨Ç»P§@·~¨t²Î¤Î¨ä¥Lµ{¦¡¦³Ãö¡A¨Ò¦p Alt¡ÏEsc ¤Á´«¨ì¤U¤@­Óµøµ¡¡BAlt¡ÏPrintScreen §â·í«e¬¡°Êªºµøµ¡¤º®e¥H¹Ï¤ù®æ¦¡½Æ»s¨ì°Å¶Kï¡BAlt¡ÏF4 Ãö³¬µøµ¡¡K¡Kµ¥¡A³o¨Ç¥[³tÁ䤣¦b¥»³¹°Q½×½d³ò¡C

¼Ð·Ç«öÁ䤶­±

¼Ð·Ç«öÁ䤶­±¬O¥Ñ Windows ´£¨Ñªº¡A¨Ï¥ÎªÌ¥i¥H¥Î¥¦¨Ó¿ï¾Ü©Î°õ¦æ¥\¯àªí¤¤ªº¿ï¶µ¡A´N¦n¹³¨Ï·Æ¹«´å¼Ð¦b¥\¯àªí¤W²¾°Ê©Î¥H¥ªÁäÂIÀ»¿ï¶µ¤@¼Ë¡C®t§O¦b©ó¡AÁä½L¤¶­±¤£»Ý­n¯S§Oªºµ{¦¡½X¡CµL½×¨Ï¥ÎªÌ¬O³z¹LÁä½LÁÙ¬O·Æ¹«¿ï¾Ü¿ï¶µ¡AÀ³¥Îµ{¦¡³£·|±µ¦¬©R¥O°T®§¡C

«ö¡@Á仡¡@©ú
Alt Áä¤Á´«¶i¤J©M°h¥X¥\¯àªí¼Ò¦¡¡C
Alt¡ÏªÅ¥ÕÁäÅã¥Ü¨t²Î¥\¯àªí
¦V¥kÁä¨Ï°ª«G«×²¾¨ì¤U¤@¼h¥\¯àªí¡F¦pªG°ª«G«×¿ï¶µ¨S¦³¤U¤@¼h¤l¥\¯àªí¡A¨º»ò´N·|²¾¨ì¥D¥\¯àªíªº¤U­Ó¿ï¶µ¡F¦pªG¤w¨ì¥D¥\¯àªí³Ì¥kÃä¿ï¶µ¡A¨º»ò´N½ü¨ì¨t²Î¥\¯àªíÅܬ°°ª«G«×¡F¦pªG¤w¨ì¨t²Î¥\¯àªí¡A´N·|²¾¨ì¥D¥\¯àªí³Ì¥ªÃ䪺¿ï¶µ
¦V¥ªÁä»P¦V¥kÁäÃþ¦ü¡A¥u¬O¤è¦V¤£¦P©Î²¾¨ì¤W¼h¥\¯àªí
¦V¤WÁä
¦V¤UÁä
¨Ï°ª«G«×­I´º¦b¤l¥\¯àªí¤¤¦V¤W©Î¦V¤U²¾°Ê¡F¦pªG°ª«G«×ªº¿ï¶µ¦b¥D¥\¯àªí¡A«ö¦V¤W©Î¦V¤UÁä¯àÅã¥Ü¤U¼h¤l¥\¯àªí
Esc Áä°h¥X¥\¯àªí¼Ò¦¡
Enter ÁäÅã¥Ü¤U¤@¼h¤l¥\¯àªí©Î¬O°õ¦æ¿ï¶µ¡]³o®Éµøµ¡¨ç¦¡·|¦¬¨ì WM_COMMAND ©Î WM_SYSCOMMAND¡^

¥\¯àªí¦s¨úÁä

¥\¯àªí¦s¨úÁä¡]menu access keys¡^¡A²ºÙ¦s¨úÁä¤]ºÙ¬°§U¾ÐÁä¡]mnemonic keys¡^¡C·í¨Ï¥ÎªÌ«ö¤U Alt Áä¶i¤J¥\¯àªí¼Ò¦¡®É¡A¥\¯àªíªº¿ï¶µ¤å¦r¤¤·|¦³¬Y­Ó­^¤å¦r¥À©Îªü©Ô§B¼Æ¦rªº¤U­±¥X²{©³½u¡A¥¦¹ïÀ³ªº«öÁä¡A´NºÙ¬°¦s¨úÁä¡C¶i¤J¥\¯àªí¼Ò¦¡«á¡A¨Ï¥ÎªÌ¥i¥Hª½±µ«ö¤U³o­Ó¦s¨úÁä¨Ó¿ï¾Ü¸Ó¿ï¶µ¡A´N¦n¹³¥H·Æ¹«¥ªÁäÂIÀ»³o­Ó¿ï¶µ¤@¼Ë¡C¯S§Oªº¬O¡A³o®É¤£»Ý­n¯S§Oªºµ{¦¡½X¡A´N¯à²£¥Í WM_COMMAND ©Î WM_SYSCOMMAND °T®§¡A¨ä¤¤ wParam ªº 0¡ã15 ¦ì¤¸¬O¿ï¶µÃѧO½X¡AlParam ¬O 0¡C

»s§@¦s¨úÁ䪺¤èªk«Ü²³æ¡C¥u»Ý¦b¸ê·½´y­zÀɤ¤¡A§â MENUITEM ¤§«áªº¿ï¶µ¤å¦r¤¤ªº¬Y­Ó¦r¤¸«e¥[¤W¡u&¡v§Y¥i¡C¨Ò¦p¡G

MENUITEM "Â÷¶}(&E)",IDM_EXIT

«ö¤U Alt Áä«á¡A´N·|¬Ý¨£¿ï¶µ¤å¦r¬O¡uÂ÷¶}(E)¡v¡A¡uE¡vÁäºÙ¬°¦s¨úÁä©Î§U¾ÐÁä¡C

Áä½L¥[³tÁä

³Ì«á¤@¶µ¬OÁä½L¥[³tÁä¡A³q±`¥[³tÁä·|»P¥\¯àªí¤¤ªº¿ï¶µ©R¥O¬Û¦P¡A³o¥y¸Üªº·N«ä¬O¡A«ö¤U¬Y­Ó¥[³tÁä¡A¬Û·í©ó¥Î·Æ¹«¥ªÁäÂIÀ»¬Y­Ó¿ï¶µ°õ¦æ¨ä¥\¯à¡C»P§U¾ÐÁ䤣¦Pªº¬O¡AÀH®ÉÀH¦a³£¥i¥Hª½±µ«ö¥[³tÁäIJµo¡A¨Ã¤£»Ý­n¶i¤J¥\¯àªí¼Ò¦¡¡C


Áä½L¥[³tÁä

Áä½L¥[³tÁä¡]keyboard accelerators¡^¡A©ÎºÙ¥[³tÁä¡A¬O«ü¯à°÷²£¥Í WM_COMMAND ©Î WM_SYSCOMMAND ªº«öÁä©Î²Õ¦X«öÁä¡C»P¼Ð·Ç«öÁä©Î¦s¨úÁ䤣¦Pªº¦a¤è¡A¬OÀH®ÉÀH¦a³£¥i¥Hª½±µ«ö¥[³tÁäIJµo¡C­n¨Ï¥ÎÁä½L¥[³tÁä¡A¥²¶·¥ý¦b¸ê·½´y­zÀɤº«Ø¥ß¥[³tÁäªí®æ¡A­ì©lµ{¦¡¤¤·f°t¾A·íªºµ{¦¡½X³B²z¥[³tÁä°T®§¡C

ACCELERATORS °Ï¶ô

§Ö±¶Áä³q±`©w¸q¦b¸ê·½´y­zÀɤºªº ACCELERATORS °Ï¶ô¤º¡C¥²¶·¥ýµ¹ ACCELERATORS °Ï¶ô«ü©w¦WºÙ¡AºÙ¬°¥[³tÁäªí®æ¦WºÙ¡AµM«á¦b¤@¹ï BEGIN¡þEND ¤§¶¡¤~¬O¦UºØ¥[³tÁ䪺©w¸q¡C¾ã­Ó ACCELERATORS °Ï¶ô»yªk¦p¤U¡G

AccTableName    ACCELERATORS
[optional-statements]
BEGIN
  event, idvalue [,type] [,options]
    ⁝
END

©³¤U¬O ACCELERATORS °Ï¶ôªº»¡©ú¡G

  1. AccTableName ¬O¥[³tÁäªí®æ¦WºÙ¡A¥i¥H¬O­^¤å¦r¥À¡Bªü©Ô§B¼Æ¦rµ¥²Õ¦¨ªº¦r¦ê¡A¤]¥i¥H¬O 1¡ã65535 ¤§¶¡ªº¾ã¼Æ¡C¤£½×¬O­þ¤@ºØ¡A³£­n»P­ì©lµ{¦¡¬Û¤¬§k¦X¡A³oÂI­Ë»P«e­±¤¶²Ð¹Lªº¹Ï¥Ü¡B¥\¯àªí¤@¼Ë¡C
  2. optional-statements ¦b¤@¹ï¡u[¡v¡B¡u]¡v¤º¥Nªí¥i¥H¬Ù²¤¡A¤]¥i¥H¬O¤U­±´XºØ±¡§Î¡G
    ①¡BCHARACTERISTICS dword¡G©w¸q¥[³tÁä°Ï¶ôªº¯S¼x¸ê®Æ¡A³o¸ê®Æ¶È¤@­ÓÂù¦r²Õ¤j¤p¡A¦Ó¥B¥u«O¯d¦b RES Àɤ¤¡A¦b³sµ²¤§«á¤£·|«O¯d¦b EXE Àɤº¡C¦]¦¹³o¸ê®Æ¥u¯à³Q¸ê·½½s¿è¾¹©Î¸ê·½½sĶ¾¹¨Ï¥Î¡A¹ï¨t²Î¦Ó¨¥¨S¤°»ò¥Î³~¡C
    ②¡BLANGUAGE language, sublanguage¡G«ü©w¥D­n»y¨¥»P¦¸­n»y¨¥¡Aª½¨ì¤U¤@­Ó LANGUAGE »y¥y©ÎÀÉ®×¥½ºÝ¡C
    ③¡BVERSION dword¡G«ü©wª©¥»¸¹½X¡C
  3. BEGIN¡þEND¡G¦b BEGIN¡þEND ¤§¶¡ªº¤º®e¡A¬O¨C¤@ºØ¥[³tÁ䪺©w¸q¡ABEGIN¡þEND ¤]¥i¥H¥Î¤@¹ï¡u{¡v¡B¡u}¡v¥N´À¡C
  4. event¡G¥Î¨Ó§@¬°¥[³tÁ䪺«öÁä¡A¥i¥H¬O¤U­±¤TºØ±¡§Î¡G
    ①¡Bvirtual-key ©Î character¡G¥ý»¡ virtual-key¡Cvirtual-key ¬OµêÀÀÁä½Xªº·N«ä¡A¦b Windows §@·~¨t²Î¤¤¡AÁä½L¤Wªº¨C­Ó«öÁä³£¥Î±`¼Æªí¥Ü¡A³o¼Ë§@·~¨t²Î´N¯à¤À¿ë¨Ï¥ÎªÌ«ö¤F¤°»òÁä¡A¦¹±`¼Æ´N¬OµêÀÀÁä½X¡C¥HµêÀÀÁä½Xªí¥Ü¥[³tÁ䦳¨âÃþ±¡§Î¡G
    ⑴¡B­^¤å¦r¥À©Îªü©Ô§B¼Æ¦rµ¥¤@¯ë«öÁä¡G¥HÂù¤Þ¸¹§â¤j¼g¦r¥À©Î¼Æ¦r¬A°_¨Ó¡A¨Ò¦p¡A¡u"9"¡v©Î¡u"C"¡v¡C³oÃþ«öÁ䪺µêÀÀÁä½X«ê¦n»P¨ä¦r¤¸ªº ASCII ½X¬Û¦P¡A¦]¦¹¤@¯ë«öÁ䪺µêÀÀÁä½X´N¥Î¤j¼g¦r¥À©Î¼Æ¦rªí¥Ü¡C¨Ò¦p¦bÁä½L¤W¡A¡uC¡vÁ䪺µêÀÀÁä½X¬O 43H¡]¨£µù¤@ªº¹Ï¡^¦Ó­^¤å¦r¤¸¡uC¡vªº ASCII ½X¬O 43H¡]¨£ DOS ²Õ¦X»y¨¥ªþ¿ý¥|ASCII ²Ä¤G³¡¤À¡^¡C
    ⑵¡B¯S®í«öÁä¡G¨Ò¦p F1¡BF2¡K¡K©Î¤è¦VÁä¡K¡K¡A¦b¥¦­Ì«e­±¥[¤W¡uVK_¡v¡A´NÅܦ¨µêÀÀÁä½X¡CF1¡BF2¡K¡K¡B¦V¥ªÁä¡B¦V¤WÁä¡K¡K´NÅܦ¨ VK_F1¡BVK_F2¡K¡KVK_LEFT¡BVK_UP¡K¡K¡C³o¨Ç±`¼Æ³£©w¸q¦b RESOURCE.H ¤¤¡C
    ¨Æ¹ê¤W¡A⑴ªí¥Ü¤è¦¡´N¬O character ªí¥Ü¤è¦¡¡C¤£ºÞ¬O¥Î ⑴¡AÁÙ¬O ⑵¡Atype ³£¥²¶·¬O VIRTKEY¡C
    ②¡B"char"¡G³oºØªí¥Ü¥[³tÁ䪺¤è¦¡¬O¥H¨Ï¥ÎªÌ¦bÁä½L¤W«ö¥Xªº¦r¤¸¨Óªí¥Ü¡A¦]¦¹¦b¤@¹ï¡u"¡v¤§¶¡ªº char ¥i¥H¬O­^¤å¦r¥À¡Bªü©Ô§B¼Æ¦r¡A¬Æ¦Ü¬O¡u¡Ï¡v¡B¡u¡Ð¡v¡K¡Kµ¥µ¥¡A¦Ó type ¥i¬Ù²¤©Î¬° ASCII¡C¨Ò¦p¡G
      "b",  2000, ASCII
      "B",  2001, ASCII
      "+",  2002
    ¤W­±²Ä¤@­Ó¨Ò¤l¡A¨Ï¥ÎªÌ¥²¶·«ö¥X¤p¼gªº¡ub¡v¤~¦³§@¥Î¡C¦b CapsLock ¿Oº¶·À®É«ö¡uB¡vÁä¯à²£¥Í¤p¼gªº¡ub¡v¡A©Î¦b CapsLock ¿O«GµÛ®É«ö¡uShift¡ÏB¡vÁä¤]¯à²£¥Í¤p¼gªº¡ub¡v¡A¨âªÌ³£¦³¥[³tÁ䪺®ÄªG¡F°²¦p¦b CapsLock ¿O«GµÛ®É«ö¡uB¡vÁä¡A²£¥Íªº¬O¤j¼gªº¡uB¡v¡A³o¼Ë´N¨S¦³¥[³tÁ䪺®ÄªG¡C²Ä¤G­Ó¨Ò¤l«h»P²Ä¤@­Ó¨Ò¤l¬Û¤Ï¡C²Ä¤Tªº¨Ò¤l¡A¥u¦³·í¨Ï¥ÎªÌ«ö¡uShift¡Ï¡Ï¡vÁä¤~¦³§@¥Î¡]¥ý«ö¡uShift¡vÁ䤣©ñ¦A«ö¡u¡Ï¡vÁä¡^¡C
    ¤]¥i¥H¦b¡u"¡v»P¦r¤¸¤§¶¡¥[¤W¡u^¡v¡A¥Nªí¦P®É«ö¤U Ctrl Áä¤Î¸Ó¦r¤¸Áä¤~¦³§@¥Î¡Atype ¥i¬Ù²¤©Î¬° ASCII¡A¦p¤U­±¨Ò¤l¥²¶·¦P®É«ö¡uCtlt¡Ï"A"¡vÁä¤~¦³§@¥Î¡G
      "^A", 2003
    ¨Æ¹ê¤W¡A¤W­±ªº¨Ò¤l¤£½× CapsLock ¬Oº¶·ÀÁÙ¬O«GµÛ¡A«ö¡uCtlt¡ÏShift¡ÏA¡vÁä©Î¡uCtlt¡ÏA¡v³£¦³®ÄªG¡A¥u¯à³£°µ¨Ò¥~ªº¯S¨Ò§a¡I
    ③¡B¼Æ­È¡G¦¹¼Æ­È¬O 32¡ã127 ¤§¶¡ªº¾ã¼Æ¡A¨Æ¹ê¤W³o­Ó¾ã¼Æ¨ä¹ê´N¬O ASCII ½X¡A©Ò¥H¨ä«áªº type °Ñ¼Æ¥²¶·¬O ASCII¡A¥B¤£¯à¬Ù²¤¡C¦pªG±Ä¥Î³oºØ¤è¦¡¡A´NµLªk¨Ï¥Î¡u^¡v¥Nªí¥²¶·¦P®É«ö¤U Ctrl Áä¤Î¸Ó¦r¤¸Áä¤~¦³§@¥Î¡C
  5. idvalue¡G¥[³tÁ䪺ÃѧO½X¡A¬O 1¡ã65535 ¤§¶¡ªº¾ã¼Æ¡C¤@¯ë¦Ó¨¥¡A¥[³tÁä·|»P¥\¯àªí¤¤ªº¬Y­Ó¿ï¶µ·f°t¡A¥ç§Y«ö¤U¥[³tÁä¬Û·í©ó¥H·Æ¹«¥ªÁäÂIÀ»¸Ó¿ï¶µ¡C¦¹®É¥[³tÁ䪺ÃѧO½X»P¸Ó¿ï¶µªºÃѧO½X¬Û¦P¡A³o¼Ë´N¯à¹F¦¨¥Øªº¡A¦P®É¤]¤£¥²¦A¼g°w¹ï«ö¤U¥[³tÁä¨Æ¥ó³B²zªºµ{¦¡¡A¥u»Ýªu¥ÎÂIÀ»¿ï¶µ¨Æ¥ó³B²zªºµ{¦¡§Y¥i¡A¬Ù«o³\¦h³Â·Ð¡C
  6. type¡G·í event ¬° virtual-key ©Î character ®É¤~»Ý­n³]¸m type¡A¥B type ¥u¯à¬O ASCII ©Î VIRTKEY ¤¤ªº¤@ºØ¡C¦pªG¬Ù²¤ type¡A¹w³]­È¬° ASCII¡C¨Ò¦p¡G
      "Y",  2004,ASCII
      "Z",  2005,VIRTKEY
    ¤W­±ªº²Ä¤@­Ó¨Ò¤l¦]¬°¦³ ASCII Ãþ«¬¡A©Ò¥H¨Ï¥ÎªÌ¥²¶·¦bÁä½L¤W«ö¥X¡uY¡v¦r¤¸¤~¦æ¡A¦pªG CapsLock ¬Oº¶·Àªº´N±o«ö¡uShift¡ÏY¡v¤~¦³®ÄªG¡C²Ä¤G­Ó¨Ò¤l¦]¬°¬O VIRTKEY Ãþ«¬¡A©Ò¥H¥u­n«ö¤U¡uZ¡vÁä¥B¨S¦³«ö¨ä¥L²Õ¦XÁä¡]²Õ¦XÁä¬O«ü¦P®É¦A«ö¤U Shift¡BCtrl ©Î Alt Áä¡^¡A¨º»ò¤£½× CapsLock ¬Oº¶·ÀÁÙ¬O«GµÛ³£¦³¥[³tÁ䪺®ÄªG¡C
  7. options¡G¥i¥H¬O ALT¡BCONTROL¡BSHIFT ªº²Õ¦X¡A©Î¬O NOINVERT¡C«e¤TªÌ¥Nªí­n«ö¤U©Ò«ü©wªº«öÁä¤~·|±Ò°Ê¥[³tÁä¡F¦Ó NOINVERT ¬O¬°¤F»P Windows 3.x ¬Û®e¤~«O¯d¡A¤w¸g¹L®É¨S¦³·N¸q¤F¡C

¤U­±¨Ò¤l¨ÒÁ|¤F¤»ºØ¥[³tÁä¡A±Ò°Ê¥[³tÁ䪺«öÁä¦b«á­±ªºµù¸Ñ¤¤¡C¨ä¤¤¥H¤@¹ïÂù¤Þ¸¹¡]¡u"¡v¡^¬A¦íªº¬O¦r¤¸¡A¨S¦³¥ÎÂù¤Þ¸¹¬A¦íªº¬O«öÁä¡C

#define IDM_HELP    5005
    ⁝
MY_ACCE ACCELERATORS
{
  VK_PRIOR,5000,VIRTKEY,ALT,CONTROL //Alt¡ÏCtrl¡ÏPageUp
  "B",     5001,VIRTKEY             //B
  "^r",    5002                     //Ctrl¡Ï"r" ©Î Ctrl¡Ï"R"
  "G",     5003                     //"G"
  0x55,    5004,ASCII,ALT           //Alt¡Ï"U"
  "h",     IDM_HELP                 //"h"
}

¥Ñ¤W­±ªº»¡©ú¡A¥i¥H±oª¾¡A¦pªG type ³]¬° ASCII ªº¸Ü¡A­n¦Ò¼{ CapsLock ªºª¬ºA¥H¤Î¬O§_«ö¤U Shift Áä¡A¥¦­Ì³£·|¼vÅT¤j¤p¼g¡A¦Ó¥B¤S¦³¨Ò¥~¡A¤ñ¸û½ÆÂø¡C¦]¦¹¡A°£«D·Q¥Î¤p¼gªº­^¤å¦r¥À§@¬°¥[³tÁä¤~¨Ï¥Î ASCII Ãþ«¬¡A§_«h«Øij¦b³]¸m¥[³tÁä®É¡A¾¨¶q±Ä¥Î VIRTKEY Ãþ«¬¡A³o¼Ë´N¥uºÞ«öÁä¦Ó¤£²z¤j¤p¼g¡A¸û¬°³æ¯Â¡C¦¹¥~ÁÙ¦³­Ó²z¥Ñ¡A±Ä¥Î VIRTKEY Ãþ«¬¤w¯à«ü©wÁä½L¤Wªº©Ò¦³«öÁä¤F¡C

LoadAccelerators API

¦b¸ê·½¤¤©w¸q¤F¥[³tÁ䤧«á¡AÁÙ¥²¶·©I¥s LoadAccelerators ±N¨ä¸ü¤J¡A¨Ã¨ú±o¥[³tÁä¥N½X¡ALoadAccelerators ªº»yªk¦p¤U¡G

invoke  LoadAccelerators,\
        hInstance,\     ; handle of application instance
        lpTableName     ; address of table-name string

hInstance ¬O¼Ò²Õ¥N½X¡A¥i¥H©I¥s GetModuleHandle ±o¨ì¡ClpTableName ¬O¥[³tÁäªí®æ¦WºÙªº¦ì§}¡A¥[³tÁäªí®æ¦WºÙ¥i¥H¬O­^¤å¦r¥À¡Bªü©Ô§B¼Æ¦rµ¥²Õ¦¨ªº¦r¦ê¡A¤]¥i¥H¬O 1¡ã65535 ¤§¶¡ªº¾ã¼Æ¡C¥²¶·»P¸ê·½´y­zÀɤ¤ªº ACCELERATORS °Ï¶ô°t¦X¡C

¦pªG LoadAccelerators °õ¦æ¦¨¥\¡A¦^¶Ç­È¬O¥[³tÁäªí®æªº¥N½X¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡C

TranslateAccelerator API

TranslateAccelerator ·|¦b°T®§°j°é¤¤Àˬd WM_KEYDOWN ©Î WM_SYSKEYDOWN ¨â°T®§¡A¬Ý¬Ý¬O§_¦³²Å¦X¥[³tÁäªí®æ¤¤ªº¬Y¶µ¥[³tÁä¡A¦pªG¦³ªº¸Ü´N¦V¥Ø¼Ðµøµ¡µo°e WM_COMMAND ©Î WM_SYSCOMMAND °T®§¡A¨Ã§â¦^¶Ç­È³]¬°¤@¡F¦pªG¨S¦³ªº¸Ü¤£°µ³B²z¡A¦^¶Ç­È¬°¹s¡CTranslateAccelerator ªº»yªk¦p¤U¡G

invoke  TranslateAccelerator,\
        hWnd,\          ; handle of destination window
        hAccTable,\     ; handle of accelerator table
        lpMsg           ; address of structure with message

hWnd ¬°¥Ø¼Ðµøµ¡¥N½X¡ATranslateAccelerator ·|§â WM_COMMAND ©Î WM_SYSCOMMAND °T®§¶Ç°eµ¹¥Ø¼Ðµøµ¡¡ChAccTable ¬O¥[³tÁäªí®æ¥N½X¡ATranslateAccelerator ·|§â¨Ï¥ÎªÌ¿é¤JªºÁä½L°T®§»P¦¹¥[³tÁäªí®æ¥N½X¤¤ªº¥[³tÁä¤ñ¹ï¡ClpMsg ¬° MSG µ²ºcÅé¦ì§}¡A°T®§°j°é¤¤ªº°T®§³£¦s©ó¦¹¡C

°T®§°j°é

¥[³tÁä¨Ã¤£¬O¨Ï¥ÎªÌ¯u¥¿·Q¿é¤Jµøµ¡ªº¸ê®Æ¡A¤ñ¦p¨Ï¥ÎªÌ¦b°O¨Æ¥»¤¤¿é¤J¤å¦r¡AµM«á«ö Ctrl¡ÏC ¬O¬°¤F¡u½Æ»s¡v¡A¦Ó¨Ã¤£¬O·Q¿é¤J Ctrl¡ÏC Áä¹ïÀ³ªº¦r¤¸¡A©Ò¥H TranslateAccelerator ³B²z§¹ Ctrl¡ÏC Á䤧«á´NÀ³¸Ó¥á±ó¦¹°T®§¡C¤]´N¬O»¡²Å¦X¥[³tÁ䪺Áä½L°T®§¤£À³¸Ó¦Aµo°eµ¹µøµ¡¨ç¦¡¡A¥u¦³¤£²Å¦X¥[³tÁ䪺°T®§¡]¦^¶Ç­È¬°¹s¡^¤~­n©I¥s TranslateMessage »P DispatchMessage Ä~Äò³B²z¡C¦]¦¹°T®§°j°éªº¼gªk¦p¤U¡G

.while TRUE
        invoke  GetMessage,ADDR msg,0,0,0
.break .if rax==0
        invoke  TranslateAccelerator,hwnd,hAcce,ADDR msg
    .if rax==0
        invoke  TranslateMessage,ADDR msg
        invoke  DispatchMessage,ADDR msg
    .endif
.endw

¨Ò¤l¡GACCE

©³¤U¹ê§@¤@­Ó¨Ò¤l¡AACCE¡A¬Ý³o¦W¦r´Nª¾¹D ACCE ¬O«ü accelerator ªº·N«ä¡C°õ¦æ®É¦p¤U¹Ï¡A¦b¤u§@°Ï¥¿¤¤¥¡¦³´X¦æ»¡©ú¤å¦r¡A¤º®e¬O«ö¤U­þ¨Ç¥[³tÁä¯à§ïÅܤå¦rªºÃC¦â¡C°£¦¹¤§¥~¡A¥t¦³¤T­Ó¥[³tÁä¨S¦³¼g¥X¨Ó¡A¤À§O¬O«ö¤U¡uQ¡v¦r¤¸Â÷¶} ACCE.EXE¡B«ö¤U¡uh¡v¦r¤¸¼u¥X¤@µøµ¡Åã¥Ü ACCE ªº¤¤¤å¦WºÙ¡B«ö¤U¡uCtrl¡ÏV¡v¼u¥X¤@µøµ¡Åã¥Üª©¥»¡CÁ`¦@¤C­Ó¥[³tÁä¡C¤U¹Ï¬O¥H·Æ¹«¥ªÁäÂIÀ»¡uÀ˵ø¡vªºµ²ªG¡CACCE »Ý­n¤T­ÓÀɮסGACCE.ASM¡BACCE.RC¡BMENU.ico¡C©³¤U¬O ACCE.RC ªº¤º®e¡G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "RESOURCE.H"
#define IDM_QUIT        3000
#define IDM_BLACK       3001
#define IDM_RED         3002
#define IDM_GREEN       3003
#define IDM_BLUE        3004
#define IDM_HELP        3005
#define IDM_VERSION     3006

MY_MENU ICON    MENU.ico

MY_MENU MENU
{
  MENUITEM "Â÷¶}(&Q)",IDM_QUIT
  POPUP    "À˵ø(&V)"
           {
             MENUITEM   "¶Â\tCtrl-B",IDM_BLACK
             MENUITEM   "¬õ\tAlt-R",IDM_RED
             MENUITEM   "ºñ\tAlt-Shift-G",IDM_GREEN
             MENUITEM   "ÂÅ\tCtrl-Shift-U",IDM_BLUE
           }
  MENUITEM "À°§U(&h)",IDM_HELP,HELP
}

HOT_KEY ACCELERATORS
{
  "Q",  IDM_QUIT
  "^B", IDM_BLACK,ASCII
  "R",  IDM_RED,VIRTKEY,ALT
  "G",  IDM_GREEN,VIRTKEY,ALT,SHIFT
  "U",  IDM_BLUE,VIRTKEY,CONTROL,SHIFT
  "h",  IDM_HELP,ASCII
  "V",  IDM_VERSION,VIRTKEY,CONTROL
}

ACCE.RC ªº²Ä¤@¦æ¬O¡u#include "RESOURCE.H"¡v¡A³o¦æ¬O§â RESOURCE.H ¥]§tÀɧt¬A°_¨Ó¡A¦]¬°¥¦ùØ­±«Å§i¤FµêÀÀÁä½X¡C

ACCE.RC ªº MENU °Ï¶ô¤¤¡A¦b³»¼h¥\¯àªí¤¤ªº¤T­Ó¿ï¶µ¡GÂ÷¶}¡BÀ˵ø¡BÀ°§U¡A¨ä¿ï¶µ¤å¦r³£¦³¡u&­^¤å¦r¥À¡v¡A³o­Ó­^¤å¦r¥Àªº«öÁä´N¬O§U¾ÐÁä¡C¦bÀ˵ø¤l¥\¯àªí¤¤ªº¨C­Ó MENUITEM ¤¤¡A©Ò©w¸qªº¿ï¶µ¤å¦r¤¤§t¦³¡u\t¡v¡]¤]¥i¥H¨Ï¥Î¡u\T¡v¡^¡A·|Åý¦b³o¯S®íªº¨â¦r¤¸¤§«áªº¤å¦r¾a¥k¹ï»ô¡A¥Nªí³o«á­±ªº¬O¥[³tÁä¡C

§U¾ÐÁä¥u»Ý¦b MENU °Ï¶ô©w¸q¦n§Y¥i¡AWindows ·|¨Ì¾Ú¿ï¶µ¤å¦r«á­±ªº¿ï¶µÃѧO½X°õ¦æ¬Û¹ïÀ³ªº¥\¯à¡A¦]¦¹¦b¸ê·½´y­zÀÉ»P­ì©lµ{¦¡¤£»Ý­n²K¥[¨ä¥Lµ{¦¡½X¡C¦ý¬O¥[³tÁä´N¤£¬O³o¼Ë¤F¡A¥²¶·¦b ACCELERATORS °Ï¶ô¤¤©w¸q¬Û¹ïÀ³ªº«öÁä¡A¦Ó¥BÁÙ­n¦b­ì©lµ{¦¡¤¤²K¥[³B²z WM_COMMAND ©Î WM_SYSCOMMAND °T®§ªºµ{¦¡½X¡A¨Ã¦b°T®§°j°é¤¤©I¥s TranslateAccelerator ¤~¦æ¡C

¤W­± ACCE.RC ªº²Ä 25¡ã34 ¦æ©w¸q¤F ACCELERATORS °Ï¶ô¡C¨ä¤¤²Ä 27¡B28¡B32 ¦æªº type ¬O ASCII¡A¦Ó¨ä¥L¥[³tÁ䪺 type ¬O VIRTKEY¡C«e­±´£¹L¡Atype ¬O ASCII ªº¥[³tÁ䥲¶·­n¦bÁä½L¤W«ö¥X¸Ó¦r¤¸¡A¤]´N¬O»¡¡A­n«ö¥[³tÁäÂ÷¶} ACCE.EXE¡A¥²¶·«ö¥X¡uQ¡v¦r¤¸¡A¦pªG¦b CapsLock ¿Oº¶·Àªº±¡§Î¤U¥²¶·«ö¡uShift¡ÏQ¡v¡A©Î¬O¦b CapsLock ¿O«GµÛªº±¡§Î¤U«ö¡uQ¡vÁä¤~¯à±Ò°Ê¥[³tÁäÂ÷¶}µ{¦¡¡C±Ò°ÊÀ°§Uªº§Ö³tÁä¤]¬O¦p¦¹¡C¦ý¨Ï¤å¦rÃC¦âÅܶ¦⪺¥[³tÁä¬O¨Ò¥~¡A«e­±¤w´£¹L¡C¨ä¥L¥|­Ó¥[³tÁ䪺 type ¬O VIRTKEY¡A±¡ªp³æ¯Â¡A¨Ì¾Ú¨ä«á options ªº²Õ¦XÁä«ö¤U¡A´N¯à±Ò°Ê¥[³tÁä¡C

©³¤U¨Ó¬Ý¬Ý²Õ¦X»y¨¥­ì©lµ{¦¡¡AACCE.ASM¡G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
;¥Ü½d¥[³tÁä
;²ÕĶ»P³sµ²¡G
; uasm64 -win64 acce.asm
; rc acce.rc
; link acce.obj acce.res
OPTION CASEMAP:NONE
OPTION WIN64:7

INCLUDE         WINDOWS.INC
INCLUDELIB      GDI32.LIB
INCLUDELIB      KERNEL32.LIB
INCLUDELIB      USER32.LIB

IDM_QUIT        EQU     3000
IDM_BLACK       EQU     3001
IDM_RED         EQU     3002
IDM_GREEN       EQU     3003
IDM_BLUE        EQU     3004
IDM_HELP        EQU     3005
IDM_VERSION     EQU     3006
;*****************************************************************************************
.CONST
szMenuName      LABEL   BYTE
szClassName     LABEL   BYTE
szIconName      DB      "MY_MENU",0
szAcce          DB      "HOT_KEY",0
szAppName       DB      "¥[³tÁä½d¨Ò",0
szHelp          DB      "¥[³tÁä½d¨Òµ{¦¡¡C",0
szText          DB      "«ö©³¤U¥[³tÁä§ïÅÜÃC¦â¡G",0dh,0ah,\
                        "¡@Ctrl-BÅܶ¦â",0dh,0ah,\
                        "¡@Alt-RÅܬõ¦â",0dh,0ah,\
                        "¡@Alt-Shift-GÅܺñ¦â",0dh,0ah,\
                        "¡@Ctrl-Shift-UÅÜÂŦâ",0
szVersion       DB      "ª©¥»(&V)",0
szVerText0      DB      "ª©¥»½s¸¹¡G0.01ª©",0dh,0ah,"§A«öªº¬O§U¾ÐÁä",0
szVerText1      DB      "ª©¥»½s¸¹¡G0.01ª©",0dh,0ah,"§A«öªº¬O¥[³tÁä",0
szVerCaption    DB      "ª©¥»",0
;*****************************************************************************************
.DATA
hInstance       QWORD   ?       ;¼Ò²Õ¥N½X
hwnd            HWND    ?       ;µøµ¡¥N½X
hMenu           HMENU   ?       ;¥\¯àªí¥N½X
hViewSubMenu    HMENU   ?       ;À˵ø¤l¥\¯àªí¥N½X
hSysMenu        HMENU   ?
hAcce           HANDLE  ?       ;¥[³tÁäªí®æ¥N½X
color           DD      0       ;Åã¥Ü©ó¤u§@°ÏszTextªºÃC¦â
;*****************************************************************************************
.CODE
;-----------------------------------------------------------------------------------------
DrawTextCentered  PROC  hdc:HDC,pText:LPCTSTR,pRect:QWORD
;DrawTextCentered¯à§â¦h¦æªº¦r¦êÅã¥Ü¦b©Ò«ü©wªº¯x§Î¡]¥~³¡¯x§Î¡^¤¤¥¡¡]¤ô¥­¸m¤¤¥B¹]Áè¸m¤¤¡^
;¿é¤J¡Ghdc¡Ð¸Ë¸m¤º®e¥N½X
;¡@¡@¡@pText¡Ð¦r¦ê¦ì§}¡A¦¹¦r¦ê¬°ASCII©ÎBig5½s½X¥B¥H¹s¬°µ²§À¡C¦r¦ê®æ¦¡¦p¤U¡G
;¡@¡@¡@¡@¡@¡@¡@¡@¡@szText  DB    "²Ä¤@¦æ¤å¦r",0dh,0ah,\
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@"²Ä¤G¦æ¤å¦r",0dh,0ah,\
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@⁝
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@"³Ì«á¤@¦æ¤å¦r",0
;¡@¡@¡@pRect¡Ð¥~³¡¯x§Î¦ì§}¡A¯x§Î¥HRECTµ²ºcÅéªí¥Ü
;¿é¥X¡G¦¨¥\¦^¶Ç­È¬°«D¹s¡F¥¢±Ñ¦^¶Ç­È¬°¹s¡]³q±`¬O¥~³¡¯x§Î¤£¨¬¥H®e¯Ç¦r¦ê¡^
        LOCAL   min_rect:RECT           ;¯à¥]§t¦b¦ì§}pText¤W¦r¦êªº³Ì¤p¯x§Î
        mov     min_rect.top,0
        mov     min_rect.left,0
        invoke  DrawText,hdc,pText,-1,ADDR min_rect,DT_CALCRECT
        ASSUME  rax:PTR RECT
        mov     rax,pRect               ;EAX¡×¥~³¡¯x§Î¦ì§}
        mov     r10d,[rax].right
        mov     r11d,[rax].bottom
        sub     r10d,[rax].left         ;R10D¡×¥~³¡¯x§Î¼e«×
        sub     r11d,[rax].top          ;R11D¡×¥~³¡¯x§Î°ª«×
        sub     r10d,min_rect.right     ;R10D¡×¦©°£¥]§t¦r¦ê¼e«×¤§«áªº¼e«×
        jb      error                   ;¦pªGR10D¤p©ó¯à®e¯Ç¦r¦ê³Ì¤p¯x§Îªº¼e«×¡A¸õÅD¦Üerror³B
        sub     r11d,min_rect.bottom    ;R11D¡×¦©°£¥]§t¦r¦ê°ª«×¤§«áªº°ª«×
        jb      error                   ;¦pªGR11D¤p©ó¯à®e¯Ç¦r¦ê³Ì¤p¯x§Îªº°ª«×¡A¸õÅD¦Üerror³B
        shr     r10d,1                  ;R10D¡×¦b¦r¦ê¥ª©Î¥k¨âÃ䪺ªÅ¥Õ¼e«×
        shr     r11d,1                  ;R11D¡×¦b¦r¦ê¤W©Î¤U¨âÃ䪺ªÅ¥Õ°ª«×
        add     [rax].left,r10d
        add     [rax].top,r11d
        sub     [rax].right,r10d
        sub     [rax].bottom,r11d
        ASSUME  rax:NOTHING
        invoke  DrawText,hdc,pText,-1,rax,DT_LEFT or DT_TOP
        jmp     exit
error:  xor     rax,rax
exit:   ret
DrawTextCentered ENDP
;-----------------------------------------------------------------------------------------
WndProc PROC    hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
        LOCAL   ps:PAINTSTRUCT,rect:RECT
.switch uMsg
  .case WM_COMMAND
    .if r8w==IDM_QUIT
        jmp     quit
    .elseif r8w==IDM_BLACK
        mov     color,0
    .elseif r8w==IDM_RED
        mov     color,0ffh
    .elseif r8w==IDM_GREEN
        mov     color,0ff00h
    .elseif r8w==IDM_BLUE
        mov     color,0ff0000h
    .elseif r8w==IDM_HELP
        invoke  MessageBox,hWnd,OFFSET szHelp,OFFSET szAppName,MB_OK or MB_ICONINFORMATION
        jmp     @f
    .endif
        movzx   rax,r8w
        invoke  CheckMenuRadioItem,hViewSubMenu,IDM_BLACK,IDM_BLUE,eax,MF_BYCOMMAND
@@:     invoke  InvalidateRect,hWnd,0,1

  .case WM_PAINT
        invoke  BeginPaint,hWnd,ADDR ps
        invoke  GetClientRect,hWnd,ADDR rect
        invoke  SetTextColor,ps.hdc,color
        invoke  DrawTextCentered,ps.hdc,OFFSET szText,ADDR rect
        invoke  EndPaint,hWnd,ADDR ps

  .case WM_SYSCOMMAND
    .if r8w==IDM_VERSION
        mov     rdx,OFFSET szVerText0
        test    r9d,10000h
        jz      @f                      ;­YZR¡Aªí¥Ü«ö¤U§U¾ÐÁä¡]¦b¥\¯àªí¼Ò¦¡¤U«ö¡uV¡vÁä¡^
        mov     rdx,OFFSET szVerText1   ;­YNZ¡Aªí¥Ü«ö¤U¥[³tÁä¡uCtrl¡ÐV¡v
@@:     invoke  MessageBox,hWnd,rdx,OFFSET szVerCaption,MB_OK or MB_ICONQUESTION
    .else
        jmp     deflt
    .endif

  .case WM_CREATE
        invoke  GetSubMenu,hMenu,1
        mov     hViewSubMenu,rax
        invoke  CheckMenuRadioItem,hViewSubMenu,IDM_BLACK,IDM_BLUE,IDM_BLACK,MF_BYCOMMAND
        invoke  GetSystemMenu,hWnd,0
        mov     hSysMenu,rax
        invoke  AppendMenu,hSysMenu,MF_STRING,IDM_VERSION,OFFSET szVersion

  .case WM_DESTROY
quit:   invoke  PostQuitMessage,0

  .default
deflt:  invoke  DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
.endsw

        xor     rax,rax
        ret
WndProc ENDP
;-----------------------------------------------------------------------------------------
main    PROC
        LOCAL   wc:WNDCLASSEX,msg:MSG
        invoke  GetModuleHandle,0
        mov     hInstance,rax
        lea     rdx,WndProc
        mov     wc.cbSize,SIZEOF WNDCLASSEX
        mov     wc.style,CS_HREDRAW or CS_VREDRAW
        mov     wc.lpfnWndProc,rdx
        mov     wc.cbClsExtra,0
        mov     wc.cbWndExtra,0
        mov     wc.hInstance,rax
        invoke  LoadIcon,hInstance,OFFSET szIconName
        mov     wc.hIcon,rax
        mov     wc.hIconSm,rax
        invoke  LoadCursor,NULL,IDC_ARROW
        mov     wc.hCursor,rax
        lea     r10,szClassName
        mov     wc.hbrBackground,COLOR_WINDOW+1
        mov     wc.lpszMenuName,0
        mov     wc.lpszClassName,r10
        invoke  RegisterClassEx,ADDR wc
        invoke  LoadMenu,hInstance,OFFSET szMenuName
        mov     hMenu,rax
        invoke  LoadAccelerators,hInstance,OFFSET szAcce        ;¸ü¤J¥[³tÁäªí®æ
        mov     hAcce,rax
        invoke  CreateWindowEx,0,OFFSET szClassName,OFFSET szAppName,\
                WS_CAPTION or WS_SYSMENU,100,100,400,300,0,hMenu,hInstance,0
        mov     hwnd,rax
        invoke  ShowWindow,hwnd,SW_SHOWNORMAL
        invoke  UpdateWindow,hwnd
.while TRUE
        invoke  GetMessage,ADDR msg,0,0,0
.break .if rax==0
        invoke  TranslateAccelerator,hwnd,hAcce,ADDR msg        ;§â½Ķ¥[³tÁä°T®§
    .if rax==0
        invoke  TranslateMessage,ADDR msg
        invoke  DispatchMessage,ADDR msg
    .endif
.endw
        invoke  ExitProcess,0
main    ENDP
;*****************************************************************************************
END     main

ACCE.ASM ¤¤ªº¥[³tÁä¨Ì¾Ú»P¤§·f°tªº¿ï¶µ¦b­þ­Ó¥\¯àªí¡A¥i¤À¦¨¤TÃþ¡G

¡@¡@①¡B¦b³»¼h¥\¯àªí¤¤¡A¨Ò¦p¡uQ¡v¦r¤¸¡B¡uh¡v¦r¤¸¡C
¡@¡@②¡B¦b¤l¥\¯àªí¤º¡A¨Ò¦p¡uCtrl¡ÏB¡v¡B¡uAlt¡ÏR¡v¡B¡uAlt¡ÏShift¡ÏG¡v¡B¡uCtrl¡ÏShift¡ÏU¡v§ïÅܤå¦rÃC¦â¡C
¡@¡@③¡B¦b¨t²Î¥\¯àªí¤º¡A¨Ò¦p«ö¡uCtrl¡ÏV¡v¡C

«e¨âºØ±¡§Î¬O¤@¼Ëªº¡A¥²¶·³B²z WM_COMMAND °T®§¡F¦Ó²Ä¤TºØ¥²¶·³B²z WM_SYSCOMMAND °T®§¡C¦ý¤£½×¬O­þ¤@ºØ¡A³£¥Ñ¸ê·½´y­zÀɤ¤ªº ACCELERATORS ©w¸q¡A¨Ã©I¥s LoadAccelerators ¸ü¤J¡AµM«á¦b°T®§°j°é¤¤©I¥s TranslateAccelerator¡A¨Ì¾Ú¥[³tÁä©Ò·f°tªº¿ï¶µ¬O§_¦b¨t²Î¥\¯àªí¤º¡A±N¨äÂà´«¦¨ WM_COMMAND¡]¿ï¶µ¤£¦b¨t²Î¥\¯àªí¤º¡^ ©Î WM_SYSCOMMAND¡]¿ï¶µ¦b¨t²Î¥\¯àªí¤º¡^¡C

¥[³tÁä·f°tªº¿ï¶µ¤£¦b¨t²Î¥\¯àªí

·í¨Ï¥ÎªÌ«ö¤U¥[³tÁä¥B»P³o¥[³tÁä·f°tªº¿ï¶µ¤£¦b¨t²Î¥\¯àªí¤º¡A¨t²Î·|§â WM_COMMAND °T®§¶Çµ¹ ACCE ªºµøµ¡¨ç¦¡¡Aµøµ¡¨ç¦¡Àˬd¿ï¶µÃѧO½X°µ¬Û¹ïÀ³ªº¤u§@¡C¤£ª¾¦³¨S¦³¤H·|¦³ºÃ°Ý¡A«ç»ò«ö¤U¥[³tÁä¡Aµøµ¡¨ç¦¡«o¬O¤ñ¹ï¿ï¶µÃѧO½X³B²z°T®§¡H¨ä¹êµª®×«Ü²³æ¡A¦]¬° ACCE §â¥[³tÁäÃѧO½X³]¬°¬Û¹ïÀ³ªº¿ï¶µÃѧO½X¡A¤]´N¬O¨âªÌ¬Û¦P¡A³o¼Ë´N¤£¶·¼¶¼gÃB¥~ªºµ{¦¡½X¥h³B²z«ö¤U¥[³tÁä¨Æ¥ó©Ò²£¥Íªº°T®§¡C¬O¤£¬O«Ü¤è«K©O¡H

³oùسB²z¥[³tÁ䪺¤è¦¡¡]©Î¿ï¶µ¡^¥i¤À¬°¨âºØ¡G①Â÷¶}»PÀ°§U¿ï¶µ¡B②§ïÅÜÃC¦âªº¿ï¶µ¡C«áªÌ¤ñ¸û½ÆÂø¡A¨Ã¤£¬O¥u­n§ïÅÜÃC¦â´N¦n¤F¡AÁÙ¥²¶·©I¥s InvalidateRect¡A¤~¯à¬Ý¨£¤u§@°Ï¤ºªº¤å¦r§ïÅÜÃC¦â¡C°£¦¹¤§¥~¡AÁÙ­n©I¥s CheckMenuRadioItem¡A¤~¯à³]©w¦n²{¦b¿ï¾Ü¬O­þ­Ó¿ï¶µ¡C

¥H¤W³o¬qµ{¦¡¦b²Ä 90¡ã107 ¦æ¡C

¥[³tÁä·f°tªº¿ï¶µ¦b¨t²Î¥\¯àªí¤º

·í¨Ï¥ÎªÌ«ö¤U¥[³tÁä¡A¥B»P³o¥[³tÁä·f°tªº¿ï¶µ¦b¨t²Î¥\¯àªí¤º¡A¨t²Î·|§â WM_SYSCOMMAND °T®§¶Ç°eµ¹µøµ¡¨ç¦¡¡CACCE ¥u»Ý³B²z¥¦¦Û¤v©w¸q»P¥[³tÁä·f°tªº¿ï¶µ§Y¥i¡A³oºØ¿ï¶µªºÃѧO½X¥²¶·¤p©ó 0F000H¡C¦Ó¦b¨t²Î¥\¯àªí¤ºªº¨ä¥L¿ï¶µ¬O¨t²Î¤º«Øªº¡A¶·¥æ¥Ñ DefWindowProc ³B²z¡C³o¬qµ{¦¡¦b²Ä 116¡ã125 ¦æ¡C

¦b ACCE ¤¤ÁÙ®i¥Ü¤F¨Ï¥ÎªÌ«ö¥[³tÁä©Î«ö§U¾ÐÁ䤣¦Pªº³B²z¤è¦¡¡AÀË´ú lParam ªº²Ä 16 ¦ì¤¸¹sÁÙ¬O¤@¡A´N¯à¹F¨ì¥Øªº¡C¦]¬°²Ä¤C¦æ¡A³]©w¤F¡uOPTION WIN64:7¡v¡A¦]¦¹¤@¶i¤Jµøµ¡¨ç¦¡«á¡AR9 ¤§­È´N¤w¸g³]¬° lParam ¤F¡F©Ò¥H²Ä 119 ¦æªº TEST «ü¥O´N¬OÀË´ú²Ä 16 ¦ì¤¸¬O¹sÁÙ¬O¤@¡C¦pªG¬O¹s¡Aªí¥Ü«ö¤Uªº¬O§U¾ÐÁä¡F¦pªG¬O¤@¡Aªí¥Ü«ö¤Uªº¬O¥[³tÁä¡C

§â¦h¦æ¦r¦êÅã¥Ü¦b¯x§Î½d³ò¥¿¤¤¥¡

DrawTextCentered °Æµ{¦¡¬O¥Î¨Ó§â¤@­Ó¦h¦æ¦r¦êÅã¥Ü¦b¤@­Ó¯x§Î½d³òªº¥¿¤¤¥¡¡A¤£¶È¤ô¥­¸m¤¤¡A¤]¬O¹]Áè¸m¤¤¡C¥¦¨Ã¤£¬O Win64 API¡A¦Ó¬O¤p¤ì°¸¦Û¦æ¼¶¼gªº°Æµ{¦¡¡A¥¦ªº»yªk¬O¡G

invoke  DrawTextCentered,\
        hdc,\
        pText,\
        pRect

hdc ¬O¸Ë¸m¤º®e¡CpText ¬O¦r¦ê¦ì§}¡A³o­Ó¦r¦ê¥²¶·§t¦³´«¦æ²Å¸¹¡]´«¦æ²Å¸¹´N¬O 0DH¡B0AH ²Õ¦X¡^¡CpRect ¬O RECT µ²ºcÅé¦ì§}¡A³o­Óµ²ºcÅé«ü©w¤F¤@­Ó¯x§Î½d³ò¡A¥iºÙ¬°¥~³¡¯x§Î¡ApText ¦ì§}¤Wªº¦r¦ê±NÅã¥Ü¦b¥~³¡¯x§Îªº¥¿¤¤¶¡¡C¦pªG DrawTextCentered °õ¦æ¦¨¥\¡A¦^¶Ç­È¬Oø»s¤å¦rªº°ª«×¡A¦]¬°¬O¦h¦æ¤å¦r©Ò¥H¬OÁ`°ª«×¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬O 0¡C

¨º»ò DrawTextCentered ¬O«ç»ò§â¦h¦æ¦r¦êÅã¥Ü¦b¥~³¡¯x§Îªº¥¿¤¤¥¡©O¡H²Ä¤K³¹´¿´£¹L DrawText ¥i¥H¥Î¡uDT_SINGLELINE or DT_CENTER or DT_VCENTER¡v°Ñ¼Æ¨Ï³æ¦æ¤å¦r¤ô¥­¸m¤¤¥B¹]Áè¸m¤¤¡A¦pªG¦h¦æ¤å¦r´NµL¯à¬°¤O¤F¡C¤£¹LÁÙ¬O¥i¥H§Q¥Î¡uDT_CALCRECT¡v°Ñ¼Æ¡A¥h­pºâ«ê¦n¯à®e¯Ç¦h¦æ¦r¦ê©Ò»Ý³Ì¤p¯x§Îªº¼e«×»P°ª«×¡C

¹Lµ{¦p¤U¡G­º¥ý©w¸q°Ï°ìÅÜ¼Æ min_rect ¬°³Ì¤p¯x§Î¡A±N¨ä left¡Btop Äæ¦ì³]¬°¹s¨Ã¥H min_rect ªº¦ì§}¤Î DT_CALCRECT ¬°°Ñ¼Æ¡C©I¥s DrawText¡A¦¨¥\©I¥s«á¡Amin_rect ¤¤ªº right¡Bbottom ´N¬O³Ì¤p¯x§Îªº¼e«×¤Î°ª«×¡A·N§Y min_rect.right ¤Î min_rect.bottom ´N¬O³Ì¤p¯x§Îªº¼e«×¤Î°ª«×¡C¦]¨ä¦WºÙ¤Óªø¤F¡A¦b¤U¹Ï¤¤¤À§O¥H £s¡Bh ªí¥Ü¡C DrawTextCentered ªº³Ì«á¤@­Ó°Ñ¼Æ¬O¥~³¡¯x§Î¦ì§}¡A¦Ó³o¥~³¡¯x§Îªº¥|­ÓÄæ¦ì left¡Btop¡Bright¡Bbottom ¤À§O¬O¤W¹Ï¤¤ªº x1¡By1¡Bx2¡By2¡C¥~³¡¯x§Îªº¼e«×»P°ª«×¡A¤À§O¬O x2¡Ðx1¡By2¡Ðy1¡A¦U¥H W¡BH ªí¥Ü¡A¦p¤W¹Ï¡C¬JµM­n§â¦h¦æ¦r¦êÅã¥Ü©ó¿Ã¹õ¥¿¤¤¥¡¡A©Ò¥H­n½Õ¾ã³Ì¤p¯x§Îªº¦ì¸m¡A¨Ï³Ì¤p¯x§Î¥ªÃä¨ì¥~³¡¯x§Î¥ªÃ䪺¶ZÂ÷¡A»P³Ì¤p¯x§Î¥kÃä¨ì¥~³¡¯x§Î¥kÃ䪺¶ZÂ÷¬Ûµ¥¡A³£¬O¡F¤W¤U¨âÃä¤]¬O¦p¦¹¡A¨ä­È¬°¡A¨£¤W¹Ï¡C

¦¹³B¦³¥ó¨Æ­È±o¤@´£¡C¦pªG¥~³¡¯x§Î¤ñ³Ì¤p¯x§ÎÁÙ¤p¡Aªí¥ÜµLªk±N§¹¾ãªº¦r¦êÅã¥Ü¥X¨Ó¡A³o®É­Ô DrawTextCentered ¦³¨âºØ¿ï¾Ü¡A¤@¬O°±¤îø»s¦r¦ê¶Ç¦^¿ù»~ªº¦^¶Ç­È¡A¤G¬OºÉ¶qø»s§Y¨Ï¦³³¡¤À¦r¦êµLªkÅã¥Ü¡C¤p¤ì°¸§â DrawTextCentered ³]­p¦¨²Ä¤@ºØ¡A©Ò¥H¥²¶·­n§PÂ_ W ¬O§_¤j©ó©Îµ¥©ó£s¡AH ¬O§_¤j©ó©Îµ¥©ó h¡A¥u­n«e¨â¶µ¤ñ¸ûªºµ²ªG¦³¤@¶µ¬O§_©wªº¡A´N±o±N¹s¶Ç¦^µ¹¥Dµ{¦¡µM«á°h¥X¡C

¦pªGª½±µ¥H¨â­Ó CMP «ü¥O¤ñ¸û¡A·|¼W¥[µ{¦¡½X¤]­°§C®Ä²v¡C­è¤~´£¹L¡ADrawTextCentered ·|­pºâ³Ì¤p¯x§Î¥ª¥k¨âÃä¤Î¤W¤U¨âÃäªÅ¥Õªº¤j¤p¡A·|¦³¨â­Ó¨BÆJ­n­pºâ W¡Ð£s¡BH¡Ðh¡Cª`·N¤F¡IÁÙ°O±o²Ä¤@³¹¤¶²Ð SUB «ü¥O®É¡A´£¨ì¦pªG¥Øªº¹Bºâ¤¸¸û¨Ó·½¹Bºâ¤¸¤p¡A¬Û´î·|µo¥Í­É¦ì¦Ó³]©w¶i¦ìºX¼Ð¡]CF¡×1¡^¡F¦pªG¥Øªº¹Bºâ¤¸¸û¤j¡A´N¤£µo¥Í­É¦ì¡A¨º»ò´N·|²M°£¶i¦ìºX¼Ð¡]CF¡×0¡^¡CÁÙ¦³¦b²Ä¤T³¹¤]´£¤Î¹L¡AJB «ü¥O¬O«ü·í CF¡×1 ®Éµo¥Í¸õÅD¡C¥Ñ¥H¤W¨âÂI¡A³o¬qµ{¦¡¥i¥H¼g¦¨¤U­±ªº¼Ë¤l¡G¡]¤U­±µ{¦¡¥¼°õ¦æ«e¡AR10D ¬° W¡AR11D ¬° H¡^

        sub     r10d,min_rect.right     ;R10D¡×¦©°£¥]§t¦r¦ê¼e«×¤§«áªº¼e«×
        jb      error                   ;¦pªGR10D¤p©ó¯à®e¯Ç¦r¦ê³Ì¤p¯x§Îªº¼e«×¡A¸õÅD¦Üerror³B
        sub     r11d,min_rect.bottom    ;R11D¡×¦©°£¥]§t¦r¦ê°ª«×¤§«áªº°ª«×
        jb      error                   ;¦pªGR11D¤p©ó¯à®e¯Ç¦r¦ê³Ì¤p¯x§Îªº°ª«×¡A¸õÅD¦Üerror³B
        shr     r10d,1                  ;R10D¡×¦b¦r¦ê¥ª©Î¥k¨âÃ䪺ªÅ¥Õ¼e«×
        shr     r11d,1                  ;R11D¡×¦b¦r¦ê¤W©Î¤U¨âÃ䪺ªÅ¥Õ°ª«×

¤W­±²Ä¤@¦æ SUB «ü¥O°õ¦æ®É¡A¦pªG R10D ¤p©ó min_rect.right¡]¦¹­È¬°³Ì¤p¯x§Îªº¼e«×¡^¡A¨º»ò·|³]©w CF¡A¨Ï CF¡×1¡A±µµÛ¬O JB «ü¥O¡A´N·|µo¥Í¸õÅD¦Ü error: ³B¡F¤Ï¤§«h¤£¸õÅD¡C¶È»Ý¤@­Ó JB «ü¥O´N¯àÀˬd¥~³¡¯x§Î¬O§_¤ñ³Ì¤p¯x§ÎÁÙ¼e¡C²Ä¤T¡B¥|¦æ¤]¬O¦p¦¹¡C¸g¹L¨â­Ó SHR «ü¥O«á¡AR10D ¤§­È¬°¡AR11D ¤§­È¬°¡C

±µ¤U¨Ó´N¥i¥H³]©w³Ì¤p¯x§Îªº¥ª¤W¨¤»P¥k¤U¨¤®y¼Ð¡C³oùØ­n¸ÑÄÀ¥k¤U¨¤®y¼Ð¡A¥»¨Ó¥k¤U¨¤ªº X ®y¼ÐÀ³¸Ó¬O x1¡Ï¡Ï£s¡A¥i¥H¸g¹L¤U­±­pºâ¡G
¡@¡@¦]¬° W¡×x2¡Ðx1¡A©Ò¥H x1¡×x2¡ÐW
¡@¡@x1¡Ï¡Ï£s¡×x2¡ÐW¡Ï¡Ï£s¡×x2¡Ï( ¡Ð2W¡ÏW¡Ð£s¡Ï2£s)¡×x2¡Ð
¥i¥H±o¨ì x1¡Ï¡Ï£s¡×x2¡Ð¡A¦P²z y1¡Ï¡Ïh¡×y2¡Ð¡C¤W­±¬O¥Î¼Æ¾Çªº¤èªkÃÒ©ú³Ì¤p¯x§Î¥k¤U¨¤ªº®y¼Ð¡A¥i¥HÂà´«¦¨¥t¤@ºØ¼gªk¡A¨ä­È¤£ÅÜ¡C¨Æ¹ê¤W¡A¤]¥i¥H³o¼Ë·Q¡A¦b³Ì¤p¯x§Î¥ª¥k¨â°¼¥~­±ªºªÅ¶¡¬O¤@¼Ë¤jªº¡A³£¬O¡F©Ò¥H³Ì¤p¯x§Î¥k¤U¨¤ªº X ®y¼Ð¬O¥~³¡¯x§Î¥k¤U¨¤ X ®y¼Ð´î¥h¡A¦P²z³Ì¤p¯x§Î¥k¤U¨¤ªº Y ®y¼Ð¬O¥~³¡¯x§Î¥k¤U¨¤ Y ®y¼Ð´î¥h¡C

¦]¬°¦¹¨è R10D ¤§­È¬°¡AR11D ¤§­È¬°¡C°²³]´«¦¨·sªº¼gªk¡A´N·|µo²{­ì¥ý¿é¤Jªº¥~³¡¯x§Î®y¼Ð¸g¹L¥[´î R10D¡BR11D ´N¬O³Ì¤p¯x§Îªº®y¼Ð¡A³o¼Ë´N´î¤Ö«Ü¦hµ{¦¡½X¡G

        add     [rax].left,r10d     ;[rax].left­ì¥ý¬O¥~³¡¯x§Î¥ª¤W¨¤ªºX®y¼Ð
        add     [rax].top,r11d      ;[rax].top­ì¥ý¬O¥~³¡¯x§Î¥ª¤W¨¤ªºY®y¼Ð
        sub     [rax].right,r10d
        sub     [rax].bottom,r11d

¥Î³o¼Ëªº¤èªk¡AÁöµM DrawTextCentered ¤@¶}©l©w¸q¤F min_rect ¬°³Ì¤p¯x§Î¡A¦ý¦¹®É­n¦L¥X¦h¦æ¦r¦ê®É«o¥Î­ì¥ý¿é¤Jªº¥~³¡¯x§Î¡G

        mov     rax,pRect           ;EAX¡×¥~³¡¯x§Î¦ì§}
        ⁝
        invoke  DrawText,hdc,pText,-1,rax,DT_LEFT or DT_TOP

DrawTextCnetered ªº§¹¾ãµ{¦¡¦b²Ä 50¡ã85 ¦æ¡A¤p¤ì°¸¼¶¼g³o¬qµ{¦¡¡A¥H³Ì¤Öªºµ{¦¡½X§@¬°Àu¥ý¦Ò¶q¡A³o¤]¬O¥Î²Õ¦X»y¨¥³Ì¤jªº¦n³B¤§¤@¡A¤£¹L³o¼Ëªº±¡§Î¤w¶V¨Ó¶V¤Ö¤F¡C¤£ºÞ«ç¼Ë¡A³o¤@³¹´N¨ì³o¨àµ²§ô¡C


µù¤@¡GµêÀÀÁä

WM_KEYDOWN °T®§

¨Ï¥ÎªÌ«ö¤UÁä½L¤Wªº«öÁä®É¡AWindows ·|§â WM_KEYDOWN °T®§µo°eµ¹µøµ¡¨ç¦¡¡C¨ä¤¤ªº wParam ¬O¸Ó«öÁ䪺µêÀÀÁä½X¡A¦³ÃöµêÀÀÁä½X»P©³¤Uªº WM_KEYUP ¤@°_»¡©ú¡CWM_KEYDOWN °T®§ªº lParam ¬O¨ä¥L¦³Ãö¸Ó«öÁ䪺¸ê®Æ¡A»¡©ú¦p¤U¡G

  1. ²Ä 0¡ã15 ¦ì¤¸¡GºÙ¬°­«½Æ¦¸¼Æ¡C¨Ï¥ÎªÌ«ö¦í«öÁ䤣©ñ¤£¤Ó¤[¡A·|µo¥X¤@«h WM_KEYDOWN¡A­«½Æ¦¸¼Æ·|²Ö¿n¶W¹L¤@¡F¦pªG¨Ï¥ÎªÌ«ö¦í«öÁ䨬°÷¤[¡A¨º»ò·|µo¥X¦h«h¬Û¤¬¿W¥ßªº WM_KEYDOWN¡A­«½Æ¦¸¼Æ¤´¬°¤@¡C
  2. ²Ä 16¡ã23 ¦ì¤¸¡GÁä½L±½´y½X¡A¨£ DOS ²Õ¦X»y¨¥²Ä¤Q¤T³¹µù¤@¡C
  3. ²Ä 24 ¦ì¤¸¡G©µ¦ùÁä¡]extended key¡^¬O§_«ö¤U¡A¦pªG«ö¤U¦¹¦ì¤¸¬°¤@¡A§_«h¬°¹s¡C©µ¦ùÁ䦳¦n´X­Ó¡A¨£µy«á»¡©ú¡C
  4. ²Ä 25¡ã28 ¦ì¤¸¡G«O¯d¡A¥¼¨Ï¥Î¡C
  5. ²Ä 29 ¦ì¤¸¡GÁ`¬O¬°¹s¡C
  6. ²Ä 30 ¦ì¤¸¡G«e¦¸«öÁ䪬ºA¡C¦pªG¦¹¦ì¤¸¬O¤@¡Aªí¥Ü«öÁä¦b¤W¤@¦¸°T®§¤¤¬O«ö¤Uªº¡A³o·N¨ýµÛ«öÁä¦b¦¹¦¸«ö¤U¤§«e¤w¸g³B©ó«ö¤Uª¬ºA¡F¦pªG¦¹¦ì¤¸¬O¹s¡Aªí¥Ü«öÁä¦b¤W¦¸°T®§¤¤¬OÃP¶}ªº¡A³o·N¨ýµÛ³o¬O«öÁä±qÃP¶}µM«á«ö¤U¡C¦]¬°¨Ï¥ÎªÌ«ö¤U¬Y­ÓÁ䤣©ñ®É¡A¨t²Î·|­«½Æ¶Ç°e WM_KEYDOWN¡A²Ä 30 ¦ì¤¸¥i¥HÀ°§U½T©w·í«eªº WM_KEYDOWN ¬O¥Ñ©ó«ö¦í¤£©ñ¦Ó¦Û°Ê­«½Æ¥Í¦¨ªº°T®§¡AÁÙ¬O«öÁä±qÃP¶}¨ì«ö¤Uªº±¡§Î¡C
  7. ²Ä 31 ¦ì¤¸¡G¦¹¦ì¤¸ºÙ¹L«×ª¬ºA¡]transition state¡^¡A¹ï WM_KEYDOWN ¦Ó¨¥¡A¦¹¦ì¤¸Á`¬O¬°¹s¡C

¥Á°ê¤C¤Q¦~µoªíªº IBM PC ©Ò°t³ÆªºÁä½L¬O 83¡þ84 Áä¡A«á¨Óµo°âªº¹q¸£©Ò°t³ÆªºÁä½L¡A³q±`·|¦b¥kÃ䪺¼Æ¦rÁä»P­^¤å¦r¥ÀÁ䤧¶¡¡A¥[¤J¤è¦VÁä¤Î¡uInsert¡v¡B¡uDelete¡vµ¥¤Q­ÓÁä¡A³o¨Ç¦h¥X¨Óªº´N¬O©µ¦ùÁä¡]extended key¡^¡C°£¦¹¤§¥~¡AÁÙ¦³¤@¨Ç«öÁä¤]¬O©µ¦ùÁä¡C

³Ì«á¾ã²z¤@¤U¡A©µ¦ùÁ䦳¤U­±´XºØ¡G

  1. ¥kÃ䪺 Alt Áä¡B¥kÃ䪺 Ctrl Áä¡C
  2. ¤W¡B¤U¡B¥ª¡B¥k¡BHome¡BEnd¡BPageUp¡BPageDown¤K­Ó¤è¦VÁä¤Î Insert¡BDelete ¨â­ÓÁä¡C
  3. ¥kÃä¼Æ¦rÁä¤Wªº°£¸¹¡]/¡^¡BEnter¡BCapsLock Áä¡C
  4. ¨âÃ䪺 Windows Áä¡]¨£¤U¹Ï¡A¦b¥ªÃä Alt Á䥪Ãä¤Î¥kÃä Alt Áä¥kÃä¡^¡BApplications Áä¡]¦b¥kÃä Windows Áä¥kÃä¡^¡C

WM_KEYUP °T®§

¨Ï¥ÎªÌÃP¶}Áä½L¤Wªº«öÁä®É¡AWindows ·|§â WM_KEYUP °T®§µo°eµ¹µøµ¡¨ç¦¡¡C¨ä¤¤ªº wParam ¬O¸Ó«öÁ䪺µêÀÀÁä½X¡Aµy«á»¡©ú¡CWM_KEYUP °T®§ªº lParam ¬O¨ä¥L¦³Ãö¸Ó«öÁ䪺¸ê®Æ¡A»¡©ú¦p¤U¡G

  1. ²Ä 0¡ã15 ¦ì¤¸¡GºÙ¬°­«½Æ¦¸¼Æ¡A¥u¹ï WM_KEYDOWN ¦³¥Î¡A¹ï WM_KEYUP ¦Ó¨¥­«½Æ¦¸¼ÆÁ`¬O¬°¤@¡C
  2. ²Ä 16¡ã23 ¦ì¤¸¡GÁä½L±½´y½X¡A¨£ DOS ²Õ¦X»y¨¥²Ä¤Q¤T³¹µù¤@¡C
  3. ²Ä 24 ¦ì¤¸¡G©µ¦ùÁä¡]extended key¡^¬O§_«ö¤U¡A¦pªG«ö¤U¦¹¦ì¤¸¬°¤@¡A§_«h¬°¹s¡C
  4. ²Ä 25¡ã28 ¦ì¤¸¡G«O¯d¡A¥¼¨Ï¥Î¡C
  5. ²Ä 29 ¦ì¤¸¡GÁ`¬O¬°¹s¡C
  6. ²Ä 30 ¦ì¤¸¡G«e¦¸«öÁ䪬ºA¡C¹ï WM_KEYUP ¦Ó¨¥¡A¥u¥i¯à¬O«öÁä³B©ó«ö¤Uª¬ºA¡A©Ò¥H²Ä 30 ¦ì¤¸Á`¬O¤@¡C
  7. ²Ä 31 ¦ì¤¸¡G¦¹¦ì¤¸ºÙ¹L«×ª¬ºA¡]transition state¡^¡A¹ï WM_KEYUP ¦Ó¨¥¡A¦¹¦ì¤¸Á`¬O¬°¤@¡C

µêÀÀÁä½X

Windows §@·~¨t²Î¬°¤F¤À¿ë¨Ï¥ÎªÌ¨ì©³¦bÁä½L¤W«ö¤F¤°»òÁä¡A¦Ó§â¨C­Ó«öÁä³]©w¤FµêÀÀÁä½X¡C¨C­ÓµêÀÀÁä½X³£¬O¤@­Ó±`¼Æ¡A¥Î³o¨Ç±`¼Æ¥Î¨Ó¼ÐÃÑÁä½L¤Wªº«öÁä¡C·í¨Ï¥ÎªÌ«ö¤UÁä½L¤Wªº«öÁä®É¡AWindows ·|§â WM_KEYDOWN °T®§µo°eµ¹µøµ¡¨ç¦¡¡FÃP¶}«öÁä®É¡A«hµo°e WM_KEYUP¡C³o¨â«h°T®§¤¤ªº wParam °Ñ¼Æ´N¬O¸Ó«öÁ䪺µêÀÀÁä½X¡C¤U¹Ï¦bÁä½L¤W¦U«öÁ䪺µêÀÀÁä½X¡C¦U«öÁ䪺µêÀÀÁä½X¦b«öÁä°¼­±¡A¥H¤Q¤»¶i¦ì¬õ¦â¼Æ­Èªí¥Ü¡C

¤ñ¸û¯S§Oªº¬OÁä½L¥kÃ䪺¼Æ¦rÁä¡A¦³¨ÇÁ䦳¨âºØµêÀÀÁä½X¡C·í NumLock ¶}±Ò®É¡]NumLock ªº LED ¿O«GµÛ¡^¡A¥kÃ䪺¼Æ¦rÁäÅܦ¨¤è¦VÁä¡A¨äµêÀÀÁä½X¦p¤W¹Ï¡F·í NumLock «öÁäÃö³¬®É¡]NumLock ªº LED ¿Oº¶·À¡^¡A¥kÃ䪺¼Æ¦rÁäÅܦ¨¤è¦VÁä¡A¨äµêÀÀÁä½X¤]´NÅܦ¨©M¥¦¥ªÃ䪺¤è¦VÁä¤@¼Ë¤F¡C¾ã²z¦p¤Uªí¡]ªí¤¤¼Æ­È§¡¬°¤Q¤»¶i¦ì¡^¡G

NumLock.0123456789
¶}±Ò6E60616263646566676869
Ãö³¬2E2D232822250C27242621

Alt Á䦳¨â­Ó¡A¤À¥¬¦bªÅ¥ÕÁ䪺¥ª¥k¨â°¼¡A¨äµêÀÀÁä½X¬Û¦P¡A¶È±q WM_KEYDOWN¡BWM_KEYUP ªº wParam µLªk¤À¿ë¨Ï¥ÎªÌ¬O«ö¤U¥ªÃ䪺ÁÙ¬O¥kÃ䪺¡A¦ý¥i¥H°t¦X lParam ²Ä 24 ¦ì¤¸¬O§_©µ¦ùÁä§PÂ_¡CCtrl Áä¤]¬O¦P¼Ëªºª¬ªp¡A¦ý¬O Shift Áä´NµLªk³o¼Ë§PÂ_¤F¡A¥i¥H©I¥s GetAsyncKeyState API §PÂ_¥ªÃ䪺 Shift Áä«ö¤UÁÙ¬O¥kÃ䪺¡C