²Ä¤C³¹¡@²³æªºµøµ¡¡]¤@¡^

³o¤@³¹¡A¤p¤ì°¸­n¤¶²Ð¦p¦ó¼¶¼g¤@­Ó²³æªºµøµ¡¡ASPLWND.ASM ( simple window ¤§·N )¡C¥¦¤£¹³²Ä¤@³¹ªºµ{¦¡¶È¯à±µ¦¬«ö¤U«ö¶sªº°T®§¡A¥BµLªk¦AÂX¥R¡F¤]¤£¹³²Ä¤T¡B¥|³¹¨º¼Ëªº±±¨î»Oµ{¦¡¤£²£¥Íµøµ¡¡C³o¤@³¹©Ò¤¶²Ðªºµ{¦¡·|²£¥Í¤@­Óµøµ¡¡AÁöµM»¡¬O¡u²³æªºµøµ¡¡v¡A¦ý«o¨ã¦³µøµ¡ªº°ò¥»¯S©Ê¡G¯à¥H·Æ¹«©ì©Ô¡B¯à¥H·Æ¹«©ñ¤jÁY¤pµøµ¡¡B¯à±µ¦¬¨Ï¥ÎªÌªº«öÁä¨ÃÅã¥Ü©óµøµ¡¤º¡K¡K¡C³o­Óµ{¦¡¤]¬O Windows §@·~¨t²Î¤Uªºµ{¦¡°ò¦¡AÁA¸Ñ¤F¤§«á¡A¯à¥H³o­Óµ{¦¡¬°°ò¦¡A²K¥[³\¦h¥\¯à¡C

°£¤F³o¨Ç¯S©Ê¥~¡A³o­Óµ{¦¡¬O­º¦¸¨Ï¥Î MASM64 SDK ©Ò´£¨Ñªº¥]§tÀɨӻs§@¡C¦b«e¨â³¹¡A¤w¸g¤¶²Ð¹L«e½ú­Ì©Ò¼¶¼gªº invoke ¥¨¶°¡A±N·|À³¥Î¦b³o­Óµ{¦¡¤W¡C¥t¥~¦b³o­Óµ{¦¡¤¤¡AÁÙ·|¨Ï¥Î .switch/.case/.endsw »P .while/.break .if/.endw ¥¨¶°¡AÁöµM¨Ã¤ÀªR³o¨â­Ó¥¨¶°¡A¦ý¬O­ì²zÀ³¸Ó¤@¼Ë¡A³Ì­«­nªº¬O¡A§Ú­Ì­nª¾¹D¦p¦ó¨Ï¥Î¡C

¨Æ¹ê¤W¤]¤£Ãø¡A±ý¨Ï¥Î MASM64 SDK ©Òªþªº¥¨¶°¡]¤ñ¦p invoke¡B.switch/.case/.endsw »P .while/.break .if/.endw¡^¼¶¼g Win64 µ{¦¡¡A¥u»Ý¦bµ{¦¡«e­±¥[¤W¤@¦æ¡uINCLUDE \masm32\include64\masm64rt.inc¡v§Y¥i¡C¦p¤U­±ªº SPLWNDASM¡C


­ì©lµ{¦¡

SPLWND.ASM ªº­ì©lµ{¦¡¦p¤U¡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
INCLUDE \masm32\include64\masm64rt.inc
;***************************************************************************************************
.DATA
hInstance       HINSTANCE       ?                       ;¼Ò²Õ¥N½X
hwnd            HWND            ?                       ;µøµ¡¥N½X
CommandLine     LPSTR           ?                       ;©R¥O¦C¦ì§}
wc              WNDCLASSEX      <>
msg             MSG             <>
rect            RECT            <>
ps              PAINTSTRUCT     <>
szClassName     DB              "SimpleWndClass",0      ;µøµ¡Ãþ§O¦WºÙ
szAppName       DB              "²³æªºµøµ¡",0
sYouPress       DB              "§A«ö¤U¤F Áä¡C"
;***************************************************************************************************
.CODE
;---------------------------------------------------------------------------------------------------
WndProc         PROC    hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.switch uMsg
  .case WM_PAINT
                invoke  BeginPaint,hWnd,ADDR ps
                invoke  GetClientRect,hWnd,ADDR rect
                invoke  DrawText,ps.hdc,ADDR sYouPress,SIZEOF sYouPress,ADDR rect,\
                        DT_SINGLELINE or DT_CENTER or DT_VCENTER
                invoke  EndPaint,hWnd,ADDR ps

  .case WM_CHAR
                mov     rax,wParam
                mov     [sYouPress+8],al
                invoke  InvalidateRect,hWnd,0,1

  .case WM_DESTROY
                invoke  PostQuitMessage,0
  .default
                invoke  DefWindowProc,hWnd,uMsg,wParam,lParam
                ret
.endsw

                xor     rax,rax
                ret
WndProc         ENDP
;---------------------------------------------------------------------------------------------------
main            PROC
                invoke  GetModuleHandle,0               ;¨ú±o¼Ò²Õ¥N½X
                mov     hInstance,rax
                mov     wc.cbSize,SIZEOF WNDCLASSEX
                mov     wc.style,CS_HREDRAW or CS_VREDRAW
                lea     rdx,WndProc
                mov     wc.lpfnWndProc,rdx
                mov     wc.cbClsExtra,0
                mov     wc.cbWndExtra,0
                mov     wc.hInstance,rax
                invoke  LoadIcon,NULL,IDI_APPLICATION   ;¨ú±o¹Ï¥Ü¥N½X
                mov     wc.hIcon,rax                    ;¦s¤J¹Ï¥Ü¥N½X
                mov     wc.hIconSm,rax                  ;¦s¤J¤p¹Ï¥Ü¥N½X
                invoke  LoadCursor,NULL,IDC_ARROW       ;¨ú±o´å¼Ð¥N½X
                mov     wc.hCursor,rax                  ;¦s¤J´å¼Ð¥N½X
                mov     wc.hbrBackground,COLOR_WINDOW+1
                mov     wc.lpszMenuName,0
                lea     rdx,szClassName
                mov     wc.lpszClassName,rdx
                invoke  RegisterClassEx,ADDR wc         ;µù¥Uµøµ¡Ãþ§O
                invoke  CreateWindowEx,0,ADDR szClassName,ADDR szAppName,WS_OVERLAPPEDWINDOW,\
                        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,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  TranslateMessage,ADDR msg
                invoke  DispatchMessage,ADDR msg
.endw
                invoke  ExitProcess,0                   ;µ{¦¡µ²§ô
main            ENDP
;***************************************************************************************************
END

§â¥¦¦s¤J¡uE:\HomePage\SOURCE\Win64\SPLWND\SPLWND.ASM¡v«á¡A¶}±Ò¡u©R¥O´£¥Ü¦r¤¸¡v¤¤¡A¿é¤J©³¤U¶À¦â¦rªº«ü¥O¡]°O±o¿é¤J§¹¨C±ø«ü¥O«á­n«ö Enter Áä¡^¡G ¦pªG³Ì«á¨S¦³¥X²{¿ù»~°T®§¡A¨º»ò´Nªí¥Ü¤@¤Á³£¥¿½T¡A¯à²£¥Í SPLWND.EXE ¥i°õ¦æÀɨӡC¦b¤W¹Ï´å¼Ð¡]¬õ¦â¡^³B¿é¤J¡uSPLWND¡v°õ¦æ¥¦¡A´N·|¬Ý¨£¥»³¹¤@¶}©lªºµøµ¡¤F¡C­È±oª`·Nªº¬O¡A­n»s§@°õ¦æ®É·|²£¥Íµøµ¡ªºµ{¦¡¡A¹ï³sµ²¾¹¡ALINK.EXE¡A©Ò¤U¹Fªº¿ï¶µ¬O¡u/subsystem:windows¡v¡A¤£¬O¡usubsystem:console¡v¡C°õ¦æ SPLWND.EXE ®Éµe­±¦p¤U¡G §A¥i¥H«ö¤UÁä½L¤Wªº¥ô·NÁä¡Aµøµ¡¤¤ªº¦r¦ê¤]·|ÀH¤§§ïÅܦ¨§A©Ò«ö¤UªºÁä¡C

SPLWND.ASM ¬Ý°_¨Ó¦³ 76 ¦æ¡A¦ü¥G«Ü½ÆÂø¡A¦ý¦©±¼«e­± 14 ¦æªº¸ê®Æ¡A¶È³Ñ 62 ¦æ¡C³o³Ñ¤Uªº 62 ¦æµ{¦¡½X¡A¤À§OÄÝ©ó¨â­Ó°Æµ{¦¡¡Gmain »P WndProc¡C¦Ó¨ä¤¤¦b main °Æµ{¦¡¸Ìªºµ{¦¡½X¡A±q²Ä 42¡ã74 ¦æ¦@ 33 ¦æµ{¦¡½X¡A´X¥G¬O¤j³¡¤Àµøµ¡µ{¦¡³£¦³¦Ó¥B¬O¥²¶·ªº¡A¥u¦³ WndProc °Æµ{¦¡·|¦]µ{¦¡¥\¯à¤£¦P¦ÓÅÜ°Ê¡C©Ò¥H§A¥u­n§V¤O¾Ç²ß¨Ã²z¸Ñ³o­Óµ{¦¡¡A¹ï©¹«á Windows µ{¦¡³]­p§ó¯à±o¤ßÀ³¤â¡A¬O«D±`­È±o¾Ç°_¨Óªº¡C

¦ý¦b»¡©ú³o­Ó SPLWND.ASM ¹B§@ªº­ì²z¤§«e¡A¥ý¨Ó»¡¤@»¡²Õ¦X»y¨¥ªº¤@­Ó°²«ü¥O¡ASTRUCT¡C­n¥Î²Õ¦X»y¨¥¼¶¼g Windows µ{¦¡¡A¤£¶È­nÁA¸Ñ Windows §@·~¨t²Î­I«áªº­ì²z¡A·íµM¡A¤]¤@©w­n¤F¸Ñ²Õ¦X»y¨¥«ü¥O¡C

STRUCT °²«ü¥O

STRUCT ¤]¥i¥H¼g¦¨ STRUC¡A¬O structure ªºÂ²¼g¡A¤¤¤å¥i½Ķ¦¨µ²ºcÅé©Îµ²ºc¡C¥¦ªº»yªk¦p¤U¡G

µ²ºcÅé¦WºÙ    STRUCT     [¹ï»ô¤è¦¡][,NONUNIQUE]
  Äæ¦ì¤@¦WºÙ  ¸ê®ÆÃþ«¬¤@  ?
  Äæ¦ì¤G¦WºÙ  ¸ê®ÆÃþ«¬¤G  ?
    ⁝
µ²ºcÅé¦WºÙ    ENDS

«e´X³¹¥Îªºªº¸ê®ÆÃþ«¬¡A¹³ DB¡BDW¡BDD¡BDQ µ¥¡A³£¥u¯àªí¥Ü¦r¦ê©Î¼Æ­È¡A¦ý¯u¹ê¥@¬Éªºª«Åé«D±`½ÆÂø¡AµLªk¶È¾a¥¦­Ì´y­z¡A©ó¬O¦³¤F STRUCT °²«ü¥O¨Ó«Å§i¸û½ÆÂøªº±¡ªp¡CSTRUCT ¯à§â¬Y¨Ç¬ÛÃöªº¸ê®Æ¶°¦X¦b¤@°_¡A­«·s©w¸q¤@ºØ·sªº¸ê®ÆÃþ«¬¡C³o¨Ç¬ÛÃöªº¸ê®Æ§¡©ñ¦b STRUCT »P ENDS ¤§¶¡¡A¨C¤@µ§¸ê®ÆºÙ¬°Äæ¦ì ( field¡A¦³¨Ç¤åÄm«h»¡¬O¦¨­û¡A­^¤å¬O member )¡A¨C­ÓÄæ¦ì¦³¦Û¤vªº¦WºÙ¤Î¸ê®ÆÃþ«¬¡A³o¨ÇÄæ¦ì¦b°O¾ÐÅ餤¬O³s¦b¤@°_ªº¡A§Î¦¨¤@­Ó°Ï¶ô¡C¨Ò¦p­n¥Hµ²ºcÅé´y­z®gÀ»¹CÀ¸ªºªZ¾¹¸ê®Æ¡A¥i¥H©w¸q¤U­±ªº weapon µ²ºcÅé¡G

weapon          STRUCT
  arms          DB      32 DUP (?)  ;ªZ¾¹¦WºÙ
  power         DW      ?           ;«Â¤O¡A¨Cµo¤l¼u¶Ë®`¤O¡A¶V¤j¶V¦n
  ammo_capacity DW      ?           ;¼u§X®e¶q¡A³Ì¦h¥i®e¯Ç¦h¤Öµo¤l¼u¡A¶V¤j¶V¦n
  reload        DW      ?           ;¸Ë¼u³t«×¡A±q©Þ¥X¼u§X¹D¤l¼u¤W½£©Òªá®É¶¡¡A¶V¤p¶V¦n
  rate_of_fire  DW      ?           ;³s®g¤O¡A¨C¤ÀÄÁ³Ì¦h¥i®gÀ»¦h¤Öµo¤l¼u¡A¶V¤j¶V¦n
  precision     DB      ?           ;ºë·Ç«×¡A¥H¦Ê¤À¤ñªí¥Ü¡A¶V¤j¶V¦n¡A³Ì¤j­È¬° 100
weapon          ENDS

¤W­±¥u¬O«Å§i¤@ºØ·sªº¸ê®ÆÃþ«¬¡AºÙ¬° weapon¡A¦pªG­n©w¸q¬YºØªZ¾¹¡A¨Ò¦p´ö´¶´Ë½Ä¾Wºj ( Thompson Submachine Gun )¡A³Ì±`¨£ªº«¬¸¹¬O M1928A1¡A°²³]¨Cµo¤l¼u«Â¤O 700¡A¼u¹ª¥i¸Ë 100 µo¤l¼u¡A­«·s¸Ë¶ñ¼u¹ª»Ýªá¶O 10 ¬í¡A¨C¤ÀÄÁ¥i®gÀ» 300 µo¤l¼u¡A©R¤¤²v 80%¡A¨º»ò´N¥i¥H¦b¸ê®Æ°Ï¬q¤º©w¸q ¡A¦p¤U­±ªº M1928A1¡G

.DATA
  ⁝
M1928A1 weapon  <"Thompson Submachine Gun",700,100,10,300,80> ;´ö´¶´Ë½Ä¾Wºjªº¸ê®Æ
M1903   weapon  <"Springfield Rifle",?,5,?,?,90>              ;M1903¬K¥Ð¨Bºjªº¸ê®Æ
W870    weapon  <"Remington Model 870",?>                     ;¹p©ú¹y870¬¦°Ê¦¡´²¼uºjªº¸ê®Æ
M1916   weapon  <>                                            ;¤ò·æC96¤âºjªº¸ê®Æ

¦pªGµ²ºcÅ餤¦³¬Y¨ÇÄæ¦ì¥¼ª¾¡A´N¥H¡u?¡v¥N´À¡A¦p¤W­±ªº M1903 µ²ºcÅéÅܼƤ¤¡A¦³³\¦hÄæ¦ì¥¼ª¾¡C¦pªGµ²ºcÅ餤¡A¥½´X¶µÄæ¦ì³£¥¼ª¾¡A¨º»ò¥i¥H¥Î¤@­Ó¡u?¡vªí¥Ü¦b³o¤§«áªºÄæ¦ì³£¬O¥¼ª¾¡A¦p¤W­±ªº W870¡C¦pªG¥þ³¡Äæ¦ì³£¥¼ª¾¡A¥ç§Y¨S¦³ªì©l­È¡A¨º»ò´N­n¥Î¡u<>¡vªí¥Ü¡A¦p¤W­±ªº M1916¡C

²ÕĶ³sµ²«á¦pªG°õ¦æ¥¦¡A¨º»ò M1928A1 µ²ºcÅéÅܼƷ|¦b°O¾ÐÅ餤§Î¦¨¤@¶ô°Ï°ì¡AÅܦ¨¤U­±ªº±¡§Î¡G

00007FF74DB53010  54 68 6F 6D 70 73 6F 6E 20 53 75 62 6D 61 63 68  Thompson Submach  
00007FF74DB53020  69 6E 65 20 47 75 6E 00 00 00 00 00 00 00 00 00  ine Gun.........  
00007FF74DB53030  BC 02 64 00 0A 00 2C 01 50                       ¼.d...,.P

¦bµ{¦¡¤¤¦pªG­n¦s¨úµ²ºcÅ餺ªº¬Y­ÓÄæ¦ì¡A¥i¥H¥Î¤U­±ªº¤è¦¡¦s¨ú¡G

        mov     ¼È¦s¾¹,µ²ºcÅéÅܼƦWºÙ.Äæ¦ì¦WºÙ
        mov     µ²ºcÅéÅܼƦWºÙ.Äæ¦ì¦WºÙ,¼È¦s¾¹©Î±`¼Æ

¨Ò¦p©³¤Uªº¨Ò¤l¡G

        mov     ax,M1928A1.power    ;¨ú¥X´ö´¶´Ë½Ä¾Wºjªº«Â¤O¡A¨Ã¦s©óAX¸Ì­±
        mov     W870.precision,70   ;¹p©ú¹y870¬¦°Ê¦¡´²¼uºjªº©R¤¤²v70%¦s¤JW870µ²ºcÅé

¦b²{¹ê¥@¬É¤¤ªº¤@­Óª«Å馳³\¦h¯S©Ê¡A«ÜÃø¦b¹q¸£¤¤¦p¹êÁÙ­ì¡A«e­z»¡ªºªZ¾¹©Ê½è¡A·íµM¤£¥u³o¨Ç¡C§Ú­Ì¥u¯àºÉ¤O¡A¦Ó STRUCT ´N¬O©¹³o­Ó¤è¦V«e¶i¡C¦³Ãöµ²ºcÅ骺»¡©ú¡A¥i¥H°Ñ¾\ DOS ²Õ¦X»y¨¥²Ä¤Q¤C³¹¡B²Ä¤Q¤K³¹¡C¸É¥R¤F²Õ¦X»y¨¥ªº STRUCT °²«ü¥O¤§«á¡A¦A¦^¹LÀY¨Ó¬Ý¬Ý¦³Ãö¼¶¼g Windows µ{¦¡ªº­ì²z¡C


¸Ñ»¡¡G·§©À

¥ý¨Ó¬Ý¬Ý SPLWND.ASM ­ì©lµ{¦¡¡A·|µo²{¥i¤À¦¨¤T³¡¤À¡G¤@­Ó¸ê®Æ°Ï¬q¤Î¨â­Ó°Æµ{¦¡¡Gmain¡BWndProc¡AµM«á´N¨S¦³¤F¡Cmain °Æµ{¦¡¡]µù¤@¡^¬O SPLWND µ{¦¡ªº¶i¤JÂI¡AµM«á¨Ì§Ç©I¥s´X­Ó Win64 API¡GGetModuleHandle¡BLoadIcon¡BLoadCursor¡BRegisterClassEx¡BCreateWindowEx¡BShowWindow¡BUpdateWindow¡A¥Ñ³o¨Ç API ªº¦WºÙ¬Ý¡A³o¬qµ{¦¡¦ü¥G¬O»P«Ø¥ßµøµ¡¦³Ãö¡F±µ¤U¨Ó¬O¤@­Ó .while/.endw °j°é¡A°j°é¤¤©I¥s¤T­Ó Win64 API¡GGetMessage¡BTranslateMessage¡BDispatchMessage¡AÆ[¨ä¦W¡A¥i¥H²q´ú¦¹°j°é»P°T®§¦³Ãö¡A¦¹°j°éºÙ¬°°T®§°j°é¡A§êºt¤F­«­nªº¨¤¦â¡F³Ì«á¤@­Ó«ü¥O¬O©I¥s ExitProcess¡Aµ²§ôµ{¦¡¡C

¦A¨Ó¬Ý¬Ý WndProc °Æµ{¦¡¡CWndProc ¤@¶}©l´N¬O .switch/.endsw¡AÅU¦W«ä¸q¡A¥i²q´ú³o¬O®Ú¾Ú uMsg ¤§­È¡A¨Ó§PÂ_­n°õ¦æ­þ¤@¬qµ{¦¡¡A¦@¦³¥|ºØ±¡§Î¡G①WM_PAINT¡Aø»s¡u§A«ö¤U¤FXXÁä¡v¦r¦ê¡C②WM_CHAR¡C③WM_DESTROY¡Aµo¥X°h¥Xªº°T®§¡C④¹w³]±¡§Î¡C­Y¬O«e¤TºØ±¡§Î¡A°õ¦æ§¹²¦´N¨ì WndProc ªº³Ì«á¤@¹D«ü¥O¡A±N 0 ¶Ç¦^µ¹¥Dµ{¦¡«áªð¦^¡F¦pªG¬O³Ì«á¤@ºØ±¡§Î¡A´N¥H DefWindowProc ªº¦^¶Ç­È¶Çµ¹¥Dµ{¦¡ªð¦^¡C¨Æ¹ê¤W¡AWndProc °Æµ{¦¡©Ò§êºtªº¨¤¦â¡A´N¬O©Ò¿×ªº¡uµøµ¡¨ç¦¡¡v¡A¥¦¬O¥Î¨Ó³B²z Windows ©Ò¶Ç¨Óªº°T®§¡A²Ä¤K³¹¦A²Ó»¡¡C

Æ[¹î³o¨â­Ó°Æµ{¦¡¤§¶¡¡A¶È¦³¦b main ¤¤¦³¨â¹D«ü¥O¡G

                lea     rdx,WndProc
                mov     wc.lpfnWndProc,rdx

§â WndProc ªº¦ì§}¦s¤Jµ²ºcÅé wc ¤¤ªº lpfnWndProc Äæ¦ì ( ²Ä 47¡B48 ¦æ )¡A°£¦¹¤§¥~¦ü¥G¨S¬Æ»òÃöÁp¡C¦¹¥~ main »P WndProc °Æµ{¦¡³£¨S¦³±Nµøµ¡©ñ¤j¡BÁY¤p¡B²¾°Êµ¥¾Þ§@¦³Ãöªºµ{¦¡½X¡A¦ý¬O SPLWND «o¯uªº¯à°õ¦æ³o¨Ç¾Þ§@¡C¨º»ò SPLWND ¤S¬O«ç»ò¹B§@ªº©O¡H¦Ó Windows §@·~¨t²Î¦b³o¨ä¤¤¤S§êºt¤°»ò¨¤¦â©O¡H³o¨â­Ó°ÝÃDªºµª®×³£¤@¼Ë¡A»P¨Æ¥óÅX°Ê¡B°T®§°j°é¡Bµøµ¡¨ç¦¡¦³Ãö¡C³o¨Ç¦b¥»³¹µy«áªº°T®§°j°é¡]Message Loop¡^¤Î²Ä¤K³¹·|»¡©ú¡A¦Ó²{¦b¨Ì·Óµ{¦¡¸ü¤J«á°õ¦æªº¶¶§Ç¡A¥ý»¡©ú main ¤¤«Ø¥ßµøµ¡ªº¹Lµ{¡C

SPLWND.ASM ªº¶i¤JÂI¬O main °Æµ{¦¡¡A¦Ó¾ã­Ó main °Æµ{¦¡©Ò°µªº¤u§@´N¬O«Ø¥ß¨ÃÅã¥Üµøµ¡¡AµM«á¶i¤J°T®§°j°é¡C³o¨Ç¤u§@³£»Ý­n¥õ¿à Windows API¡A§Ú­Ì¥ý¨Ó¬Ý¤j­Pªº¹Lµ{¡G

  1. ©I¥s GetModuleHandle¡A¨ú±oµ{¦¡ªº¼Ò²Õ¥N½X¡C
  2. ©I¥s RegisterClassEx¡Aµù¥Uµøµ¡Ãþ§O¡]°£«D¨Ï¥Î Windows ¹w¥ý©w¸qªºµøµ¡Ãþ§O¡A¨Ò¦p MessageBox ©Î¹ï¸Ü²°¡^¡C
  3. ©I¥s CreateWindowEx¡A«Ø¥ßµøµ¡¡C
  4. ©I¥s ShowWindow¡AÅã¥Üµøµ¡¡C
  5. ©I¥s UpdateWindow¡A­«·s¾ã²zµøµ¡ªº¤u§@°Ï¡C
  6. ¶i¤JµL­­´`Àôªº°T®§°j°é¡A©I¥s GetMessage¡A¥HÀò¨ú¨Ó¦Û¨t²Îªº°T®§¡C
  7. ¦pªGÀò±o°T®§¡A¥ý©I¥s TranslateMessage ¥Ñ«öÁä°T®§¥Í¦¨¦r¤¸°T®§¡A¦A©I¥s DispatchMessage §â°T®§µo°e¨ì¡uµøµ¡¨ç¦¡¡v¤¤³B²z¡C°T®§³B²z§¹¡A¥Ñ DispatchMessage ªð¦^¡A¦A¦¸·sªº´`Àô¡C
  8. ¦pªG¨Ï¥ÎªÌÃö³¬µøµ¡¡A´N©I¥s ExitProcess °h¥Xµ{¦¡

¤W­±¬O¾ã­Óµøµ¡±q«Ø¥ß¨ì¾P·´ªº¹Lµ{¡A¨ä¤¤ 1¡ã5 ¬O²o¯A¨ìµøµ¡¥~Æ[¡A6¡ã7 ¬O²o¯A¨ì°T®§°j°é¡A8 ¬O°h¥Xµøµ¡¡C°£¤F main °Æµ{¦¡¤§¥~¡AÁÙ¦³¤@­Ó WndProc ªº°Æµ{¦¡¡A³o­Ó°Æµ{¦¡¸ò°T®§¦³Ãö¡C¥»³¹¤Î¤U¤@³¹­n¤@¤@¸ÑªR³o¨Ç¡C

¸Ñ»¡¡G«Ø¥ß¨ÃÅã¥Üµøµ¡

¨ú±o¼Ò²Õ¥N½X

¥ý»¡»¡¦ó¿×¼Ò²Õ¡]module¡A¦³¨Ç®Ñ½Ķ¦¨¼Ò¶ô¡^¡HÀx¦s¦bºÏºÐ¡B¥úºÐ©ÎÀH¨­ºÐ¤Wªºµ{¦¡¡]¤]´N¬O¥i°õ¦æÀɩΰʺA³sµ²µ{¦¡®w¡A°ÆÀɦW¤À§O¬O .EXE ©M .DLL¡^¬O¤@ºØÀɮסA·í¥¦¸ü¤J¨ì°O¾ÐÅ餤°õ¦æ®É¡A¤~ºÙ¬°¼Ò²Õ¡A¨S¦³°õ¦æªº¤£¥s¼Ò²Õ¡C©Ò¥H¡A¥i¥H§â¼Ò²Õ·Q¦¨¬O¦b°O¾ÐÅ餤°õ¦æªºµ{¦¡¡C¬°¤F°Ï§O¦b°O¾ÐÅ餤ªº¤£¦P¼Ò²Õ¡AWindows §@·~¨t²Î´N¥H¤£¦Pªº¾ã¼Æ¨Óªí¥Ü³o¨Ç¼Ò²Õ¡A³o¨Ç¾ã¼Æ´NºÙ¬°¼Ò²Õ¥N½X¡C

¦b Win16 ªº®É¥N¡]¤]´N¬O Windows 3.x ªº®É¥N¡^¡A¨Ï¥ÎªÌ¬O¥i¥H¥Î·Æ¹«ÂùÀ»¡]³sÄò«ö·Æ¹«¥ªÁä¨â¦¸¡^¦P¤@­Óµ{¦¡ªº¹Ï¥Ü¨â¦¸¡A¬Æ¦Ü§ó¦h¦¸¡A³o¼Ëªº¸Ü´N¥Nªí³o­Óµ{¦¡°õ¦æ¤F«Ü¦h¦¸¡C¨º®É­Ô¹q¸£©Ò¦w¸Ëªº°O¾ÐÅé¤j·§¥u¦³¼Æ MB¡A¬°¤F¸`¬Ù°O¾ÐÅé¡A©Ò¥H³o¨Ç¼Ò²Õ¦b°O¾ÐÅ餺¨Ã«D§¹¥þ¿W¥ß¡C¥¦­Ìªºµ{¦¡½X¶È¦³¤@¥÷¡A¦]¦¹¥u¦³¤@­Ó¼Ò²Õ¥N½X¡F¦ý¬O¸ê®Æ«o¦³«Ü¦h¥÷¡A¬°¤F°Ï¤À³o¨Ç¤£¦Pªº°Æ¥»¡A¨C­Ó°Æ¥»ºÙ¬°°õ¦æ¹êÅé¡]instance¡^¡A¤]¥Î¤£¦Pªº¾ã¼Æ¥Nªí¡AºÙ¬°°õ¦æ¹êÅé¥N½X¡C

¨ì¤F Win32 ®É¥N¡]´N¬O Windows 95/98/Me ªº®É¥N¡^¡A¹q¸£¦w¸Ëªº°O¾ÐÅé¸û¦h¡A¤]¬O¥H¨¾¸U¤@¦³­Óµ{¦¡·í±¼®É¤£·|¼vÅT¥t¤@­Óµ{¦¡¡A¨C­Óµ{¦¡ªº¸ê®Æ»Pµ{¦¡½X³£¥]§t¦bÄÝ©ó¦Û¤v¿W¥ßªº 4GB °O¾ÐÅ餺¡A»P¨ä¥Lµ{¦¡¤¬¤£¤zÂZ¡C§Y¨Ï¥H·Æ¹«ÂùÀ»¦P­Óµ{¦¡ªº¹Ï¥Ü¨â¦¸¡A¨C­Óµ{¦¡¤´µM³£¦³¿W¥ßªº 4GB °O¾ÐÅé¡A¦U¦Û¦³¿W¥ßªºµ{¦¡½X¤Î¸ê®Æ¡A¤¬¤£¤zÂZ¡A³o¼Ë´N¨S¦³¤@­Ó¼Ò²Õ«o¦³¦h­Ó°õ¦æ¹êÅ骺²{¶H¡C¦]¦¹¦b Win32 ¤Î¨ä¥H«áªº®É¥N¡A¨S¦³¥²­n°Ï¤À¼Ò²Õ»P°õ¦æ¹êÅé¤F¡A³o¨âªÌ¬O¬Û¦Pªº·N«ä¡C

¦^¹LÀY¨Ó¬Ý SPLWND.ASM µ{¦¡¡A¥¦ªº¶i¤JÂI¬O²Ä 42 ¦æªº main °Æµ{¦¡¡A²Ä¤@¹D«ü¥O¬O©I¥s GetModuleHandle ¨ú±o¼Ò²Õ¥N½X¡AµM«á±N¨ú±oªº¼Ò²Õ¥N½X¦s¤J hInstance ÅܼƸ̡C¦]¬°²{¤µªº Windows §@·~¨t²Î¡A¼Ò²Õ©M°õ¦æ¹êÅé¬O¤@¼Ëªº·N«ä¡A¦]¦¹¨ú¦W¬° hInstance ©Î hModule ³£µL©Ò¿×¡C

¨ú±o¼Ò²Õ¥N½X¬O¬°¤F¤U¤@¨Bµù¥Uµøµ¡Ãþ§O¥Îªº¡A©I¥s GetModuleHandle ´N¯à¨ú±o¼Ò²Õ¥N½X¡G

invoke  GetModuleHandle,\
        lpModuleName    ; address of module name to return handle for

GetModuleHandle ¥u¦³¤@­Ó°Ñ¼Æ¡AlpModuleName¡A¬O¼Ò²Õ¦WºÙªº¦r¦ê¦ì§}¡A¥²¶·¥H¡u0¡vµ²§À¡A³o¼Ë§@·~¨t²Î¤~ª¾¹D¦r¦ê¨ì­þ¸Ìµ²§ô¡C¦pªG lpModuleName ¬°¹s¡Aªí¥Ü­n¨ú±oªº¬O¥»¨­ªº¼Ò²Õ¥N½X¡F¦pªG¤£¬°¹s¡AlpModuleName ©Ò«üªº¦r¦ê¤ºªºµ{¦¡¦WºÙ¡A¥i¥H¬Ù²¤°ÆÀɦW¡A¹w³]ªº°ÆÀɦW¬O¡u.DLL¡v¡F¦¹¦r¦ê¤]¥i¥H¬Ù²¤¸ô®|¡A¨t²Î·|¦Û¦æ¦b·í«e©I¥sªº¼Ò²Õ¦WºÙ¤¤¶i¦æ¤ñ¸û¡A¤ñ¸û®É¤£°Ï¤À¤j¤p¼g¡F¦pªG¥]§t¸ô®|®É¡A¤@©w­n¨Ï¥Î¤Ï±×½u¡]\¡^¡A¦Ó¤£¯à¥Î±×½u¡]/¡^¡C¨Ò¦p­n¨ú±o kernel32.dll ªº¼Ò²Õ¥N½X¡A¥i¥H¹³¤U­±³o¼Ë¡G

szKernel32      DB      "c:\windows\system32\kernel32.dll",0
                ⁝
                invoke  GetModuleHandle,ADDR szKernel32

¦pªG GetModuleHandle ªº¦^¶Ç­È¬°¹s¡Aªí¥Ü©I¥s¥¢±Ñ¡F¤£¬°¹s¡Aªí¥Ü¶Ç¦^¼Ò²Õ¥N½X¡]©Î°õ¦æ¹êÅé¥N½X¡^¡C

µù¥Uµøµ¡Ãþ§O

¬°¦ó«Ø¥ßµøµ¡¤£ª½±µ«Ø¥ß´N¦n¤F¡AÁÙ­nµù¥U¤@­Óµøµ¡Ãþ§O¡]window class¡^©O¡H³oÀ³¸Ó¬O³\¦hªì¾ÇªÌªººÃ°Ý¡Cµøµ¡Ãþ§O¥i¥H¬Ý¦¨¬Oµøµ¡ªºÂŹϡA¥¦³W½d¤Fµøµ¡ªº¦U³¡¤À¡A¹³¹Ï¥Ü¡B´å¼Ð¡B­I´º¦âµ¥µ¥¸Ó¦p¦óÅã¥Ü¡A¤]³W½d¤F­þ­Óµøµ¡¨ç¦¡­t³d³B²z³o­Óµøµ¡ªº°T®§¡A³o¨Ç³£¬O¤@­Óµøµ¡¸Ó¦³ªº³¡¤À¡C

³o´N¦n¤ñ»s³y¨T¨®¡A¥ýµe¦nÂŹϡAÂŹϤ¤·|«ü©ú¨Ï¥Î­þ¤@ºØ¤ÞÀº¡B¥Î­þ¤@ºØÅܳt½cµ¥µ¥¡F¨Ì³o­ÓÂŹϥ´³y¦n¨T¨®¥»Å餧«á¡A¥i¥H¨Ì»Ý­nÅܧó¨T¨®ÃC¦â¡B®y´È¡B­µÅTµ¥µ¥¡A»s³y¥X¤@³¡¤@³¡ªº¨T¨®¨Ó¡Cµøµ¡Ãþ§O´N¹³ÂŹϡA«ü©w¤Fµøµ¡¤º­«­nªº³¡¤À¡Fµ¥¯u¥¿«Ø¥ßµøµ¡®É¡AÁÙ¬O¥i¥H¨Ì»Ý­n«ü©wµøµ¡ªº¦ì¸m¡B¤j¤p¡B­·®æµ¥©Ê½è¡C

³o¼Ëªº¤è¦¡¡A¥i¥H¥Î¤@­Óµøµ¡Ãþ§O¡A²£¥Í³\¦hµøµ¡¡A¯à°÷¸`¬Ù¹q¸£°O¾ÐÅé¡C¨Æ¹ê¤W¡AWindows §@·~¨t²Î¤w¸g¹w¥ý©w¸q¦n³\¦hµøµ¡Ãþ§O¡A¹³¬O«ö¶s¡B½s¿è®Ø¡K¡K¡]¤£­nÃhºÃ¡A«ö¶s©M½s¿è®Ø¤]³£¬Oµøµ¡¡^¡C¥H«ö¶s¬°¨Ò¡A³\¦hµ{¦¡³£¦³«ö¶s¡A«o³£¬O¥Ñ¦P¤@­Óµøµ¡Ãþ§O²£¥Íªº¡A©Ò¥H¥¦­Ìªº¥~Æ[¡B³B²z°T®§ªº¤è¦¡³£¤j¦P¤p²§¡C¤]³\¦b¤µ¤é¡]¥Á°ê112¦~¡^¹q¸£³£¦³¼Æ GB ªº°O¾ÐÅé®É¡A·Pı¤£¥X¨Ó¡A¦ý¦b Windows ½Ï¥Íªº®É¥N¡A¹q¸£ªº°O¾ÐÅé¥u¦³´X­Ó MB¡A©Ò¥H¤£±o¤£¸`¬ÙµÛ¨Ï¥Î¡C

°ò©ó¥H¤W­ì¦]¡A¦pªG­n¦Û¤v«Ø¥ßµøµ¡¡A´N¥²¶·¥ýµù¥U¤@­Óµøµ¡Ãþ§O¡C¤èªk«Ü²³æ¡A©I¥s RegisterClassEx §Y¥i¡CRegisterClassEx ¥Îªk¦p¤U¡G

invoke  RegisterClassEx,\
        lpwcx           ; address of structure with class data

RegisterClassEx ¥u¦³¤@­Ó°Ñ¼Æ¡AWNDCLASSEX µ²ºcÅ骺¦ì§}¡A¦b©I¥s RegisterClassEx ¤§«e­n§â WNDCLASSEX ¤º¦UÄæ¦ì³£³]©w¦n¥¿½T¥B§Ú­Ì·Q­nªº¼Æ­È¡C¨äÄæ¦ì¦p¤U¡G

WNDCLASSEX      STRUCT
  cbSize        DWORD       ?   ;WNDCLASSEX ªºªø«×¡A¥H¦ì¤¸²Õ³æ¦ì
  style         DWORD       ?   ;«ü©wÃþ§O­·®æ
  lpfnWndProc   PVOID       ?   ;µøµ¡¨ç¦¡ªº¦ì§}
  cbClsExtra    DWORD       ?   ;«O¯d¦Û¦æ©w¸qªºÃB¥~µøµ¡Ãþ§O¤j¤p¡A³æ¦ì¬O¦ì¤¸²Õ
  cbWndExtra    DWORD       ?   ;«O¯d¦Û¦æ©w¸qªºÃB¥~µøµ¡¹êÅé¤j¤p¡A³æ¦ì¬O¦ì¤¸²Õ
  hInstance     HINSTANCE   ?   ;°õ¦æ¹êÅé¥N½X
  hIcon         HICON       ?   ;¹Ï¥Ü¥N½X
  hCursor       HCURSOR     ?   ;´å¼Ð¥N½X
  hbrBackground HBRUSH      ?   ;µe¨ê¥N½X©ÎÃC¦â
  lpszMenuName  LPSTR       ?   ;¿ï³æ¦WºÙªº¦ì§}
  lpszClassName LPSTR       ?   ;Ãþ§O¦WºÙªº¦ì§}
  hIconSm       HICON       ?   ;¤p¹Ï¥Ü¥N½X
WNDCLASSEX      ENDS

©³¤U¬O³o¨ÇÄæ¦ìªº»¡©ú¡G

¦pªG RegisterClassEx µù¥Uµøµ¡Ãþ§O¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡F¦pªG¦¨¥\µù¥Uµøµ¡Ãþ§O¡A¦^¶Ç­È¬°¿W¤@µL¤Gªº¾ã¼Æ¡A¥i¨ÑÃѧO¦¹Ãþ§O¡C

¦b SPLWND.ASM ¤¤ªº²Ä 45¡ã61 ¦æªºµ{¦¡©Ò§@ªº¤u§@¡A´N¬O§â wc ªº¦UÄæ¦ì¶ñ¦n¡AµM«á©I¥s RegisterClassEx¡C¦]¬°§Ú­Ì¬Oªì¾ÇªÌ¡A¬°¤F³æ¯Â¡A«Ü¦hÄæ¦ì³£¨Ï¥Î Windows ¹w¥ý©w¸qªº¼Æ­È¡A¬Æ¦Ü¬Ù²¤¡C¨Ò¦p cbClsExtra¡BcbWndExtra¡BhIcon¡BhCursor¡BhbrBackground¡BlpszMenuName »P hIconSm¡C¨ä¤¤ hIcon¡BhCursor¡BlpszMenuName »P hIconSm ¥i¥H¥]§t¦b¥i°õ¦æÀɪº¸ê·½¤º¡A³o¤ñ¸û½ÆÂø¡A°Ñ¦Ò¨£²Ä³¹¡C

«Ø¥ßµøµ¡

µù¥U¦n§Ú­Ì¦Û¤v©w¸qªºµøµ¡Ãþ§O¤§«á¡A´N¯à°÷¥Î³o­Óµøµ¡Ãþ§O«Ø¥ßµøµ¡¤F¡C¸Û¦p«e­±´£¹Lªº¡Aµøµ¡Ãþ§O¬O©w¸q¦PÃþµøµ¡ªº¦@³q©Ê½è¡A¨C­Óµøµ¡¥i¥H¦³¤£¦Pªº¦ì¸m¡B¤j¤p¡B­·®æµ¥µ¥¡A³o¨Ç¬O«Ø¥ßµøµ¡¶¥¬q¤~«ü©wªº¡C«Ø¥ßµøµ¡¤@¯ë¬O©I¥s CreateWindowEx API¡A¦p¤U¡G

invoke  CreateWindowEx,\
        dwExStyle,\     ; extended window style
        lpClassName,\   ; pointer to registered class name
        lpWindowName,\  ; pointer to window name
        dwStyle,\       ; window style
        x,\             ; horizontal position of window
        y,\             ; vertical position of window
        nWidth,\        ; window width
        nHeight,\       ; window height
        hWndParent,\    ; handle to parent or owner window
        hMenu,\         ; handle to menu, or child-window identifier
        hInstance,\     ; handle to application instance
        lpParam         ; pointer to window-creation data

CreateWindowEx ¦@¦³ 12 ­Ó°Ñ¼Æ¡A¬Ý°_¨Ó«Ü¦h¡A¦ý¤£Ãø²z¸Ñ¡C©³¤U¤p¤ì°¸¸ÑÄÀ³o¨Ç°Ñ¼Æ¡G

¦pªG CreateWindowEx ¦¨¥\«Ø¥ßµøµ¡¡A¦^¶Ç­È¬O©Ò«Ø¥ßªºµøµ¡¥N½X¡F¦pªG¥¢±Ñ¡A¦^¶Ç­È¬O¹s¡A¥i¥H©I¥s GetLastError ±o¨ì¿ù»~½X¡C

³o¸Ì¤p¤ì°¸Á|­Ó¨Ò¤l¡A»¡©ú CreateWindowEx¡C°²³]¹³¤U­±ªº°Ñ¼Æ©I¥s CreateWindowEx¡G

invoke  CreateWindowEx,0,ADDR szClassName,ADDR szAppName,WS_OVERLAPPEDWINDOW,\
        120,60,300,200,0,0,hInstance,0

°õ¦æ«áªºµ²ªG¦p¤U¹Ï¡A¤U¹Ï¶ÈÅã¥Ü®à­±ªº¥ª¤W¨¤³¡¤À¡A¨S§â¾ã­Ó®à­±Åã¥Ü¥X¨Ó¡CWindows §@·~¨t²Î¤º©w®à­±ªº¥ª¤W¨¤®y¼Ð¬°¡]0,0¡^¡A¶V©¹¥kÃä x ¶V¤j¡A¶V©¹¤UÃä y ¶V¤j¡A³o»P¼Æ¾Ç¤Wªºª½¨¤®y¼Ð¨t¤£¬Û¦P¡C ¦]¬°§Ú­Ì¤w¸g«ü©w°Ñ¼Æ x¡By ¤À§O¬O 120¡B60¡A¦]¦¹§Ú­Ì©Ò«Ø¥ßªºµøµ¡¥ª¤W¨¤¡A´N¦b®y¼Ð¡]120,60¡^³B¡A¦Ó¥Bµøµ¡¥]§t³o­Ó¹³¯À¡C¦P®É°Ñ¼Æ nWidth¡BnHeight ¤]¤À§O«ü©w¬° 300¡B200¡A©Ò¥Hµøµ¡ªº¼e«×»P°ª«×¤À§O¬O 300¡B200 ­Ó¹³¯À¡A¦]¦¹µøµ¡¥k¤U¨¤ªº®y¼Ð¬O¡]419,259¡^¡C¥i¯à¦³¤H·|°Ý¡A¬°¦ó¤£¬O¡]420,260¡^©O¡H°²³]¤@ºØ·¥ºÝªº±¡§Î¡Aµøµ¡¼e«×»P°ª«×³£¬O¨â­Ó¹³¯À¡A¨º»òµøµ¡¥k¤U¨¤®y¼Ð´NÀ³¸Ó¬O¡]121,61¡^¦Ó¤£¬O¡]122,62¡^¡C

Åã¥Üµøµ¡

ÁöµMµøµ¡¤w¸g«Ø¥ß¦n¤F¡A¦ý©|¥¼Åã¥Ü¦b¿Ã¹õ¤W¡C¦]¦¹±µ¤U¨Óªº¨BÆJ´N¬OÅã¥Üµøµ¡¡A³o¥ó¤u§@¥i¥H©I¥s ShowWindow API¡G

invoke  ShowWindow,\
        hWnd,\          ; handle of window
        nCmdShow        ; show state of window

²Ä¤@­Ó°Ñ¼Æ¡AhWnd¡Aµøµ¡¥N½X¡A¥Î¨Óªí¥Ü­nÅã¥Ü­þ¤@­Óµøµ¡¡CnCmdShow ªí¥Ü­n¦p¦óÅã¥Ü¡A±`¥Îªº¦p¤Uªí¡G

±`¼Æ¼Æ­È
¡]¤Q¤»¶i¦ì¡^
·N¸q
SW_HIDE0ÁôÂõøµ¡¡C
SW_SHOWNORMAL1Åã¥Ü¨Ã¨Ï¸Óµøµ¡¬¡¤Æ°_¨Ó¡C¦pªGµøµ¡¦b³Ì¤j¤Æ©Î³Ì¤p¤Æ¡A¨t²Î·|Åý¨ä«ì´_­ìª¬¡Cµ{¦¡­º¦¸Åã¥Üµøµ¡®É¡AÀ³¨Ï¥Î SW_SHOWNORMAL¡C
SW_SHOWMINIMIZED2¬¡¤Æµøµ¡¨Ã¥H³Ì¤p¤ÆÅã¥Ü¡C
SW_SHOWMAXIMIZED3¬¡¤Æµøµ¡¨Ã¥H³Ì¤j¤ÆÅã¥Ü¡C
SW_SHOWNA8Åã¥Üµøµ¡¡A¦ý¬¡¤Æª¬ºA¤£ÅÜ¡C

¦pªG ShowWindow ¦¨¥\Åã¥Üµøµ¡¡A¦^¶Ç­È¬°«D¹s¡F§_«h¬°¹s¡C

­«·s¾ã²zµøµ¡ªº¤u§@°Ï

Åã¥Ü§¹µøµ¡¤§«á¡AÁÙ­n§âµøµ¡¤u§@°Ïªº¤º®eÅã¥Ü¥X¨Ó¡A¥i¥H¥Î UpdateWindow §¹¦¨³o¶µ¤u§@¡CUpdateWindow ¨Ï¥Î¤èªk¦p¤U¡G

invoke  UpdateWindow,\
        hWnd            ; handle of window

hWnd ¬Oµøµ¡¥N½X¡AUpdateWindow ·|µo°e WM_PAINT °T®§¨ì¸Óµøµ¡¥N½Xªºµøµ¡¤¤¡A³o¼Ë´N¯àÅý¤u§@°Ïªº¤º®e§ó·s¡C¬°¦ó¯à§ó·s¤u§@°Ï¤º®e©O¡H«Ü§Ö´N·|´£¨ì¤F¡C

¦pªG UpdateWindow ¦¨¥\§ó·sµøµ¡¡A¦^¶Ç­È¬°«D¹s¡F§_«h¬°¹s¡C

¸Ñ»¡¡G°T®§°j°é¡]Message Loop¡^

¨Æ¥óÅX°Ê¡]Event-driven¡^

¦b Windows §@·~¨t²Î¤U¡A¯à²£¥Íµøµ¡ªºµ{¦¡»P¦b¡u©R¥O´£¥Ü¦r¤¸¡v¤¤°õ¦æªº±±¨î»Oµ{¦¡¦³«Ü¤jªº¤£¦P¡CÁ|­Ó¨Ò¤l¡A°²¦p­n¼g­Óµ{¦¡¯à¨D¨â¬Û²§¥¿¾ã¼Æ¤§³Ì¤j¤½¦]¼Æªºµ{¦¡¡A¨ä¾Þ§@¤è¦¡´N¤£¦P¡C¦pªG¬O¼¶¼g±±¨î»Oµ{¦¡ªº¸Ü¡A·|­n¨D¨Ï¥ÎªÌ¥ý¿é¤J²Ä¤@­Ó¾ã¼Æ¡A§¹¦¨«á¦A¿é¤J²Ä¤G­Ó¾ã¼Æ¡AµM«áµ{¦¡­pºâ¨Ã¦L¥Xµ²ªG¡F¦b¿é¤J²Ä¤G­Ó¾ã¼Æ®É¬OµLªk¦^ÀY¥h­×§ï²Ä¤@­Ó¾ã¼Æ¡A¦b¿é¤J¹Lµ{¤]µLªkµ²§ôµ{¦¡¡C¦pªG¬O¯à²£¥Íµøµ¡ªºµ{¦¡¡A¦bµøµ¡¤º·|¦³¨â­Ó½s¿è®Ø¨Ñ¨Ï¥ÎªÌ¿é¤J¡A¨Ï¥ÎªÌ¥i¥HÀH«K¿ï¾Ü¥ý¿é¤J­þ¤@­Ó¡A¬Æ¦Ü¥i¥H¥ý¿é¤J¨ä¤¤¤@¾ã¼Æªº¤@³¡¥÷¡AµM«á§ï¿é¤J¥t¤@­Ó¾ã¼Æ¡A¦A¦^¹LÀY¨Ó§â­ì¥ýªº¼Æ§¹¦¨¡A¤]¥i¥HÀH®Éµ²§ôµ{¦¡¬Æ¦Ü¦b¥ô¦ó¹Lµ{½Õ¾ãµøµ¡¤j¤p¡C

¯à²£¥Íµøµ¡ªºµ{¦¡¡A¬°¤F§¹¦¨³o¨Ç¤u§@¡A¨äµ²ºc¥²©w©M±±¨î»Oµ{¦¡«Ü¤£¤@¼Ë¡C«eªÌ·|®Ú¾Ú¨Ï¥ÎªÌªº¥ô¦ó°Ê§@¡A°µ¥X¬ÛÀ³ªº¤u§@¡C¨Ï¥ÎªÌªº°Ê§@¡A¹³¬O¥H·Æ¹«©ì©Ôµøµ¡Ãä®Ø¡B¹ï«ö¶s«ö¤U·Æ¹«¥ªÁä¡B¥ÎÁä½L¿é¤Jµ¥µ¥³£¥iµø¬°¡u¨Æ¥ó¡v¡A¦Óµ{¦¡®Ú¾Ú³o¨Ç¨Æ¥ó°µ¥X¬Û¹ïÀ³ªº¤u§@¡AºÙ¬°¡u¨Æ¥óÅX°Ê¡]event-driven¡^¡v¡C§Ú­Ì¼¶¼g¯à²£¥Íµøµ¡ªºµ{¦¡¡A¨ä¹ê´N¬O¦b°µ¡u¨Æ¥óÅX°Êµ{¦¡³]­p¡]event-driven programming¡^¡v¡C©³¤U§Ú­Ì¬Ý¬Ý Windows ¦p¦ó°µ¨ì¨Æ¥óÅX°Ê¡A³o©M°T®§®§®§¬ÛÃö¡C

·í¨Ï¥ÎªÌ¾Þ§@Áä½L¡B·Æ¹«¡K¡Kµ¥©PÃä³]³Æ®É¡A²£¥Íªº°T¸¹¬° Windows §@·~¨t²Î©Ò±µ¦¬¡]¨£¤U¹Ï½b¸¹1¡^¡CWindows §@·~¨t²Î¤ºªºÅX°Êµ{¦¡¡A¹³Áä½LªºÅX°Êµ{¦¡¡B·Æ¹«ªºÅX°Êµ{¦¡¡A±Mªù§â¨Ï¥ÎªÌµo¥Íªº¨Æ¥óÂà´«¦¨°T®§¡AÀx¦s¦b¨t²Î¤ºªº¤@¶ô°Ï°ì¡AºÙ¬°¨t²Î°T®§¦î¦C¡]system message queue¡^¤¤¡]¨£¤U¹Ï½b¸¹2¡^¡C¨C¤@±ø°T®§³£¥]§t¤F°T®§ºØÃþ¡B°T®§µo¥Í®É´å¼Ð¦ì¸m¡B°T®§µo¥Íªº®É¶¡µ¥¸ê®Æ¡CWindows §@·~¨t²ÎÁÙ·|¬°¨C­Óµ{¦¡«Ø¥ß­Ó§Oªº°Ï°ì¡A¥Î¨ÓÀx¦s¸Óµ{¦¡ªº°T®§¡AºÙ¬°µ{¦¡°T®§¦î¦C¡]application message queue¡^¡CWindows ®Ú¾Ú°T®§µo¥Í®É´å¼Ð¦ì¸m§PÂ_³o±ø°T®§¥Ü¦b­þ¤@­Óµøµ¡½d³ò¤ºµo¥Íªº¡A´N§â¥¦²¾¨ì«Ø¥ß¸Óµøµ¡ªºµ{¦¡©ÒÄݪºµ{¦¡°T®§¦î¦C¤¤¡A¨£¤U¹Ï½b¸¹3¡AWindows §âÄÝ©ó§Ú­Ì¼¶¼gªº SPLWND ªº°T®§¡A©ñ¨ì SPLWND ªº°T®§¦î¦C¤¤¡G ³o®É¡A°T®§·|¤@ª½Àx¦s¦bµ{¦¡°T®§¦î¦C¤¤¡Aª½¨ì¸Óµ{¦¡©I¥s GetMessage ®É¡A¤~·|±N°T®§¦î¦C¤¤ªº¤@±ø°T®§¨ú¥X¨Ó¡CGetMessage ¬O¥]§t¦b USER32.DLL ¸Ìªº¨ç¦¡¡A¦]¦¹©I¥s GetMessage ¨ú¥X°T®§¡A¨ä¹ê¬Û·í©ó¥s USER32.DLL ¨ì°T®§¦î¦C¤¤¨ú¥X°T®§¨Ó¡A¨£¤W¹Ïªº½b¸¹4¡B5¡B6¡AµM«á³Q SLPWND ±µ¦¬¨ì¡A¨£½b¸¹7¡CSPLWND ·|©I¥s TranslateMessage ¹w¥ý³B²z¦³Ãö¦r¤¸ªº°T®§¡]¦pªG¤£³B²z¦³Ãö¦r¤¸ªº°T®§¡A¥i¥H¤£©I¥s TranslateMessage¡^¡A±µµÛ SPLWND ·|§â°T®§¥æµ¹±Mªù³B²z°T®§ªº°Æµ{¦¡¡A¤]´N¬O WndProc¡A¥h§¹¦¨¨Ï¥ÎªÌªº°Ê§@¡]¨Ò¦p¥H·Æ¹«©ì©Ôµøµ¡Ãä®Ø¡B¹ï«ö¶s«ö¤U·Æ¹«¥ªÁäµ¥µ¥¡^¡A³o¼Ëªº°Æµ{¦¡ºÙ¬°µøµ¡¨ç¦¡¡CSPLWND ªºµøµ¡¨ç¦¡´N¬O WndProc °Æµ{¦¡¡C

¦ý¬O SPLWND ¨Ã¤£¬Oª½±µ©I¥s WndProc¡A¦Ó¬O³z¹L DispatchMessage API §¹¦¨¡CDispatchMessage ¤]¬O¥]§t¦b USER32.DLL ¸Ìªº¤@­Ó¨ç¦¡¡A·í SPLWND ©I¥s DispatchMessage ®É¡]½b¸¹8¡^¡ADispatchMessage ®Ú¾Ú°Ñ¼Æ¤¤ªºµøµ¡¥N½X¡A¥h©I¥s¸Óµøµ¡ªºµøµ¡¨ç¦¡¡]½b¸¹9¡^¡A³o®É±±¨îÅv¤S¦^¨ì SPLWND ¸Ì­±¡A¦ý³o¦¸¬O¦b WndProc ¤â¸Ì¡C¨º Windows «çª¾¹D WndProc ¦b­þ¨à©O¡H­ì¨Ó§Ú­Ì¦b«Ø¥ßµøµ¡«e·|¥Î RegisterClassEx µù¥Uµøµ¡Ãþ§O¡A¨º®É«K«ü©w WNDCLASSEX ¤¤ªº lpfnWndProc Äæ¦ì¬O WndProc ªº¦ì§}¡A´Nªí©ú¤Fµøµ¡¨ç¦¡¡C

¨ì³o¨à¡A¤@©w¦³³\¦h¤H·|°Ý¡ASPLWND ¬°¦ó¤£¦Û¦æ©I¥s WndProc ©O¡H³o¼Ë¤£¬O§ó²³æ¶Ü¡H¦ó¥²Â¶¤@¤j°é©O¡H­ì¦]¦³´X­Ó¡G①¤@­Óµ{¦¡¥i¯à·|²£¥Í¦n´X­Óµøµ¡¡A¦pªGµ{¦¡­n¦Û¦æ©I¥sµøµ¡¨ç¦¡¡A¨º´N±o¦Û¤vºûÅ@¦³Ãöµøµ¡¥N½Xµ¥©Ê½è¡A³o¼Ë¬O¶V«[¥N©´¥h³B²z§@·~¨t²Î¸Ó°µªº¨Æ¡A¦Ó­n³B²zªº¤u§@¤Ï¦ÓÅܱo§ó¦h§ó³Â·Ð¤F¡C②Windows §@·~¨t²Î¨Ã¨S¦³§â©Ò¦³ªº°T®§³£©ñ¶i°T®§¦î¦C¸Ì¡A¦³¨Ç°T®§¬Oª½±µ©I¥sµøµ¡¨ç¦¡³B²zªº¡C③§Oªºµ{¦¡¤]¥i¯à±N°T®§¶Çµ¹§Aªºµ{¦¡¡A¦ý¸Óµ{¦¡¨Ã¤£ª¾¹D§Aµ{¦¡ªºµøµ¡¨ç¦¡¦ì§}¡A©Ò¥H­n³z¹L Windows §@·~¨t²Î¡C

µ¥µøµ¡¨ç¦¡³B²z§¹¸Ó°T®§¡A°õ¦æµøµ¡¨ç¦¡³Ì«á¤@¹D«ü¥O RET «ü¥Oªð¦^ USER32.DLL¡A½b¸¹10¡C¦]¬°¬O DispatchMessage ©I¥sµøµ¡¨ç¦¡ªº¡A©Ò¥H³o®É­Ô±±¨îÅv·|¦b DispatchMessage ¤â¤¤¡AµM«á DispatchMessage ¤Sªð¦^­ì¨Óªºµ{¦¡ SPLWND ¤¤¡A½b¸¹11¡C³o¼Ë´N§¹¦¨¤F¤@±ø°T®§ªº³B²z¡A±µ¤U¨Óµ{¦¡¸õ¨ì GetMessage ¨ú±o¤U¤@±ø°T®§¡A¦A¶i¦æ³B²z¤U¤@¦¸ªº´`Àô¡C

°T®§°j°é¡]Message Loop¡^

¸g¥Ñ¤W­±ªº¸Ñ»¡¥i¥H±À´ú¡A¤@­Ó¨ã¦³µøµ¡ªºµ{¦¡¥²©w·|¦³¤@­Óµ{¦¡¤ù¬q¡A¤£Â_ªº©I¥s GetMessage ¥H¨ú±o°T®§¡AµM«á¦A³z¹L DispatchMessage §â³o°T®§¶Ç»¼µ¹µøµ¡¨ç¦¡¥h³B²z¡C³o­Ó¹Lµ{·|¤£Â_¦a­«½Æ¡Aª½¨ì¨Ï¥ÎªÌÃö³¬µøµ¡©Îµ²§ôµ{¦¡¬°¤î¡C³o­Óµ{¦¡¤ù¬qºÙ¬°°T®§°j°é¡A°T®§°j°é¦³¦n´XºØ¼gªk¡A¤p¤ì°¸¦b¦¹¤¶²Ð¤@ºØ±`¨£ªº¼gªk¡G

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

¤W­±ªº°T®§°j°é¬yµ{¦¡³o¼Ëªº¡G

  1. ¥Ñ GetMessage ±qµ{¦¡°T®§¦î¦C¨ú±o°T®§¡A¦s©ñ©ó msg µ²ºcÅ餺¡C¦pªGµ{¦¡°T®§¦î¦C¤¤¨S¦³°T®§¡AGetMessage ·|§â±±¨îÅv¥æ¦^µ¹ Windows ¤@¬q®É¶¡¡A¦A¨ú¦^±±¨îÅvªð¦^¡C³o¬O Win32 ¹F¦¨¥ý¦û¦¡¦h¤u¡]preemptive multitasking¡^ªº¤èªk¤§¤@¡C
  2. ¦pªG¦^¶Ç­È RAX ¬°¹s¡A¦¹®É·|¾P·´°T®§°j°é¡Aµ{¦¡µ²§ô¡C¦ó®É RAX ·|¬°¹s©O¡H·í GetMessage ¦¬¨ì WM_QUIT ®Éªº¦^¶Ç­È´N¬O¹s¡A©Ò¥H·í¦¬¨ì WM_QUIT ®É¡A´N·|¾P·´°T®§°j°é¡C
  3. ¦pªG¦^¶Ç­È RAX ¤£¬°¹s¡A©I¥s TranslateMessage ±N«öÁä°T®§·s¥Í¦¨«ö¤UÁ䪺¦r¤¸°T®§¡C
  4. µM«á©I¥s DispatchMessage¡A¦b DispatchMessage ¤º³¡¡A¥¦·|§â°T®§¶Çµ¹µøµ¡¨ç¦¡³B²z¡Aµ¥³B²z§¹¦¨«áªð¦^¡A¤~±N±±¨îÅv¥æ¦^¨ì°T®§°j°é¡C
  5. ¦A¸õ¦^¦Ü°T®§°j°éªº¶}©l³B¡A¶i¦æ¤U¤@¦¸´`Àô¡C

³o¸Ì²o¯A¨ì .while/.break .if/.endw ¥¨¶°¤Î GetMessage¡BTranslateMessage¡BDispatchMessage ¤T­Ó API¡AÁöµM³o¤T­Ó API ¦b«e­±ªº»¡©ú¤w¸g´£¹L¡A¦ý³o¸Ì±N³s¦P .while/.break .if/.endw ¥¨¶°¤@°_¤¶²Ð¡C

.while/.break .if/.endw ¥¨¶°

.while/.break .if/.endw ¥¨¶°¬O¥ý¶i©Ò»s§@ªº¥¨¶°¡A¦b vasily.inc ¥]§tÀɤ¤¡A¥²¶·¨Ì¾Ú¦b vasily.inc ¤¤«Å§i®É©Ò¥Îªº²Å¸¹¡A¦]¦¹³£¥²¶·¥Î¤p¼g¡A¦pªG¹ï¦¹¦³¿³½ì¥i¨ì¦¹¥]§tÀɤ¤¬d¬Ý¡C¦ý²{¦b§Ú­Ì¤£¥hÁA¸Ñ¦p¦ó»s§@³o­Ó¥¨¶°¡A¦Ó¬O­nª¾¹D¦p¦ó¨Ï¥Î¥¦¡C¦¹¥~ .while ¬O¥ý¶i©Ò»s§@ªº¥¨¶°¡A¸ò²Ä¤­³¹©Ò´£¨ì¬O¥Ñ ML64.EXE ´£¨Ñªº WHILE/ENDM ­«½Æ°Ï¶ô¤£¦P¡A§O·d²V¤F¡C.while/.break .if/.endw ªº»yªk¬O¡G

.while §PÂ_¦¡¤@
        µ{¦¡¤ù¬q
.break .if §PÂ_¦¡¤G
        µ{¦¡¤ù¬q
.endw

·í¹J¨ì .while ®É¡A·|¥ýÀËÅç§PÂ_¦¡¤@¬O§_¬°¯u¡A­Y¬°°²«h¸õ¨ì .endw ¤§«áªºµ{¦¡¡F­Y¬°¯u´N°õ¦æ .while »P .endw ¤§¶¡ªºµ{¦¡¡Aª½¨ì .endw ªº«e¤@¹D«ü¥O¡A¤S·|¸õ¦^¦Ü .while ¦A¦¸Àˬd§PÂ_¦¡¤@¬O§_¬°¯u¡A­Y¬°¯u«h¦A¦¸°õ¦æ .while »P .endw ¤§¶¡ªºµ{¦¡¡A¦p¦¹¤@ª½­«½Æ¡Aª½¨ì§PÂ_¦¡¤@¬°°²¤~¸õ¥X .while °j°é¡C¦b¾ã­Ó¹Lµ{¤¤¡A°²¦p§PÂ_¦¡¤G¬°¯u®É¡A¤]·|¸õ¥X .while °j°é¡C

³o¸Ìªº§PÂ_¦¡¨Ã«D¬O ML64.EXE ©Ò´£¨Ñªº±ø¥ó²ÕĶªº§PÂ_¦¡¡A¦Ó¬O·f°t MASM64 SDK ªº .while/.break .if/.endw ©Î .if/.elseif/.else/.endif ¨Ï¥Î¡A¤£­n·d²V¡A¥¦¦³¨âºØ¼gªk¡G

⑴¡G²Ä¤@ºØ¼gªkªº»yªk¬O¡G

¹Bºâ¤¸¤@ ÅÞ¿è¹Bºâ¤l ¹Bºâ¤¸¤G

²Ä¤@ºØ¼gªk¤¤ªº¹Bºâ¤¸¤@»P¹Bºâ¤¸¤G¥i¥H¬O¼È¦s¾¹¡BÅܼƩα`¼Æ­È¡A¦ý¤£¯à¦P®É¬°ÅܼơC¹Bºâ¤¸©MÅÞ¿è¹Bºâ¤l¤§¶¡ªºªÅ¥Õ¥i¥H¬Ù²¤¡C±`¥ÎªºÅÞ¿è¹Bºâ¤l¦p¤Uªí¡G

ÅÞ¿è¹Bºâ¤l·N¸qÅÞ¿è¹Bºâ¤l·N¸q
==µ¥©ó{}¤£µ¥©ó
}¤j©ó}=¤j©ó©Îµ¥©ó
{¤p©ó{=¤p©ó©Îµ¥©ó
||©Î&&¥B

©³¤Uªº¨Ò¤l¬O»¡¦pªG RAX ¤£µ¥©ó¤@¡A°õ¦æ .while ¨ì .endw ¸Ì­±ªºµ{¦¡¡F¦pªG RAX ¬°¤@¡A´N¸õ¦Ü .endw ¤§«áªºµ{¦¡¡C¦Ó¤@¶}©l RAX ¬° ¤T¡A¨C°õ¦æ¤@¦¸°j°é RCX ´N·|´î 300¡C¸Ó°j°é°õ¦æ¨â¦¸«á¡ARAX ´NÅܦ¨¤@¤F¡A©Ò¥H¦¹µ{¦¡·|Åý RCX ´î 600¡C

        mov     rax,3
.while  rax{}1
        sub     rcx,300
        dec     rax
.endw

¡u||¡v©M¡u&&¡vÅÞ¿è¹Bºâ¤l¤]¥i¥H¦b¨â­Ó§PÂ_¦¡¤§¶¡°µ¬°ÅÞ¿è¹Bºâ¡C¨Ò¦p¡A©³¤Uªº¨Ò¤l¬O·í RAX¡BRDX §¡¤j©ó¹s®É¡A¤~°õ¦æ .while »P .endw ¤§¶¡ªºµ{¦¡¡A§_«h´N°õ¦æ .endw ¤§«áªºµ{¦¡¡C¦¹µ{¦¡·|¿ï¥X RAX¡BRDX ¼Æ­È¸û¤pªº¨º­Ó¼È¦s¾¹¡A±N¨ä­¼¥H¤Q¤§«á¡ARCX ¦A´î¥h­¼¥H¤Q¤§«áªº¼Æ¡A¥i¥H¼g¦¨ RCX¡Ð10¡ÑMIN(RAX,RDX)¡C

.while  rax}0 && rdx}0
        sub     rcx,10
        dec     rax
        dec     rdx
.endwf

⑵¡G²Ä¤GºØ§PÂ_¦¡¼gªkªº»yªk¬°¡G

¹Bºâ¤¸

´N¥u¦³¤@­Ó¹Bºâ¤¸¡A¥¦¥i¥H¬O¼È¦s¾¹¡BÅܼƩα`¼Æ­È¡C·í³o­Ó¹Bºâ¤¸¬°«D¹s®É¡A§PÂ_¦¡¬°¯u¡F¹Bºâ¤¸¬°¹s®É¡A§PÂ_¦¡¬°°°¡C¨Ò¦p©³¤Uªº¨Ò¤l¡G

        mov     rax,3
.while  rax
        sub     rcx,300
        dec     rax
.endw

¤W­±ªºµ{¦¡¬O«ü¦pªG RAX ¤£¬°¹s¡A°õ¦æ .while ¨ì .endw ¸Ì­±ªºµ{¦¡¡F¦pªG RAX ¬°¹s¡A´N¸õ¦Ü .endw ¤§«áªºµ{¦¡¡C¦Ó¤@¶}©l RAX ¬° 3¡A¨C°õ¦æ¤@¦¸°j°é RCX ´N·|´î 300¡A©Ò¥H¦¹µ{¦¡·|Åý RCX ´î 900¡C

GetMessage API

GetMessage ±q°T®§¦î¦C¸Ì¨ú¥X°T®§¡A¶ñ¼g¦n MSG µ²ºcÅ餺¦UÄæ¦ìªº¸ê®Æ«áªð¦^¡C

invoke  GetMessage,\
        lpMsg,\         ; address of structure with message
        hWnd,\          ; handle of window
        wMsgFilterMin,\ ; first message
        wMsgFilterMax   ; last message

¦pªG GetMessage ¨ú±oªº°T®§¬O WM_QUIT¡A¦^¶Ç­È¬° 0¡A§_«h¦^¶Ç­È¬°«D¹s¡F¦pªG©I¥s¥¢±Ñ¡A¦^¶Ç­È¬° -1¡A¦pªG hWnd °Ñ¼Æ³]¸m¿ù»~¡A¦^¶Ç­È´N·|ÅÜ -1¡C¦pªG°T®§¦î¦CùبS¦³°T®§¡AGetMessage ·|±N±±¨îÅv¥æ¦^µ¹ Windows ¤@¬q®É¶¡¡A¦A¨ú¦^±±¨îÅv¡A³o¼Ë¯à¦X²zªº¨Ï¥Î CPU ¸ê·½¡A¥H¹F¨ì¥ý¦û¦¡¦h¤uªº¥Øªº¡C

GetMessage ªº²Ä¤@­Ó°Ñ¼Æ¬O MSG µ²ºcÅ骺¦ì§}¡A·í GetMessage ¨ú±o°T®§¸ê®Æ·|¶ñ¤J³o­Óµ²ºcÅ餺¡A©³¤U¬O MSG ªºÄæ¦ì»¡©ú¡G

MSG             STRUCT      STRUCT_ALIGN
  hwnd          HWND        ?   ;«ü©wÀò±o­þ¤@­Óµøµ¡ªº°T®§
  message       QWORD       ?   ;°T®§ÃѧO½X¡A´N¬O­þ¤@ºØ°T®§¡A³£¥H¡uWM_¡v°_ÀY¡A¬O windows message ªºÁY¼g
  wParam        WPARAM      ?   ;°T®§ªºÃB¥~¸ê®Æ¡A»P°T®§ÃѧO½X¡]message identifier¡^¦³Ãö
  lParam        LPARAM      ?   ;°T®§ªºÃB¥~¸ê®Æ¡A»P°T®§ÃѧO½X¡]message identifier¡^¦³Ãö
  time          DWORD       ?   ;°T®§µo§Gªº®É¶¡¡A«ü Windows ­«·s±Ò°Ê¨ì°T®§µo§G¸g¹L¦h¤Ö²@¬í
  pt            POINT       <>  ;°T®§µo§G®É¡A·Æ¹«´å¼Ð¬Û¹ï©ó¿Ã¹õ¥ª¤W¨¤ªº¦ì¸m
MSG             ENDS

wParam¡BlParam ªº¸ê®ÆÃþ«¬¤À§O¬O WPARAM¡BLPARAM¡A¨ä¹ê³£¬O QWORD¡A¥i¥H¦b WIN64.INC ¤¤§ä¨ì«Å§i¥¦­Ìªº´y­z¡F¥¦­Ì¬O°T®§ªºÃB¥~¸ê®Æ¡A»P¤£¦Pªº°T®§¡AÃB¥~¸ê®Æ¤]¤£¦P¡A´N°O¿ý¦b WPARAM¡BLPARAM ¸Ì¡C

¨Ò¦p WM_DESTROY °T®§¬Oµøµ¡¥¿¦bÃö³¬®É¡Aµo°e¨ì¸Óµøµ¡¨ç¦¡ªº°T®§¡AwParam »P lParam ³£¤£»Ý­n¡A¬Ò¬° 0¡F¦Ó WM_CHAR °T®§«h¬O¨Ï¥ÎªÌ«ö¤UÁä½L¤W¦³¦r¥Àªº¤¤¡AwParam ´N¬O«ö¤UªºÁä©Ò±oªº ASCII ¦r¤¸¡AlParam ¬O¥Î¨Óªí¥ÜÁä½L¤Wªº Shift¡BAlt µ¥Á䦳¨S¦³«ö¦í©Î¬O±½´y½Xµ¥¸ê®Æ¡C

pt ¬O¥t¤@­Ó POINT µ²ºcÅé¡A¥Nªí¬Y¤@­Ó¹³¯À¡]¤]´N¬O¤@­ÓÂI¡^¡A¨äÄæ¦ì¥Ñ¨â­Ó®y¼Ð²Õ¦¨¡A¦p¤U¡G

POINT           STRUCT
  x             DWORD       ?   ;X ®y¼Ð
  y             DWORD       ?   ;Y ®y¼Ð
POINT           ENDS

TranslateMessage API

·í¨Ï¥ÎªÌ«ö¤UÁä½L¤Wªº¥ô¤@Áä¦A©ñ¶}®É¡A¤À§O²£¥Í WM_KEYDOWN »P WM_KEYUP °T®§¡A³o¨â«h°T®§ªº wParam¡BlParam ¦³µêÀÀÁä½X¡B­«½Æ¦¸¼Æ»P¬O§_«ö¦íÁä½L¤Wªº Alt¡BShift¡BCtrl µ¥Áä³o¨Ç¸ê®Æ¡C¤j¤p¼g¦r¥À¬O¥Î¦P¤@­Ó«öÁä«ö¥X¨Óªº¡A®t§O¦b©ó¦³¨S¦³¦P®É«ö¦í Shift Áä¡A©Î¬O¡uCaps Lock¡vÁä¬O§_¤w¶}±Ò¡C©Ò¥H¦pªG­nÀò±o¨Ï¥ÎªÌ«ö¤U­þ¤@­Ó¦r¥À¡AÁöµM¥i¥H¥Îµ{¦¡§âµêÀÀÁä½X·f°t Alt¡BShift¡BCtrl µ¥«öÁä¹Bºâ±o¨ì¡C¦ý¬O³o«Ü³Â·Ð¡A©¯¦n TranslateMessage ¥i¥HÀ°§Ú­Ì§¹¦¨³o¥ó¨Æ¡CTranslateMessage ªº¥Îªk¬O¡G

invoke  TranslateMessage,\
        lpMsg           ; address of structure with message

TranslateMessage ¥u¦³¤@­Ó°Ñ¼Æ¡AlpMsg¡A¬O MSG µ²ºcÅ骺¦ì§}¡A¨ä¤ºªº¦UÄæ¦ì³£À³¸Ó¤w¶ñ¦n¥¿½T¸ê®Æ¤F¡A¦Ó³Ì¦n´N¬O©I¥s GetMessage «á¶Ç¦^¨Óªº¡C

TranslateMessage ¨Ã¤£·|§ïÅÜ WM_KEYDOWN »P WM_KEYUP ªº¸ê®Æ¡A¦Ó¬O¥t¥~§â WM_KEYDOWN »P WM_KEYUP ªº¸ê®Æ¾ã¦X«áµo¥X WM_CHAR °T®§µ¹¦Û¤v©Ò¦bªºµøµ¡¨ç¦¡¡A¦b WM_CHAR ¤¤´N¥i¥H±o¨ì«öÁä¥Nªíªº¦r¤¸¡C

¦pªG TranslateMessage ¦¨¥\±N WM_CHAR µo°e¦Üµ{¦¡°T®§¦î¦C¡A¦^¶Ç­È¬°«D¹s¡F¤Ï¤§¡A¦^¶Ç­È¬°¹s¡C

DispatchMessage API

DispatchMessage §â°T®§µo°eµ¹µøµ¡¨ç¦¡¡A¦Ó³o°T®§³q±`¬O¥Ñ GetMessage ±qµ{¦¡°T®§¦î¦C¤¤Àò±oªº¡CDispatchMessage ªº»yªk¬O¡G

invoke  DispatchMessage,\
        lpmsg           ; pointer to structure with message

DispatchMessage ¥u¦³¤@­Ó°Ñ¼Æ¡A¬O MSG µ²ºcÅé¦ì§}¡A³o MSG µ²ºcÅ餺ªº¦UÄæ¦ì¤]³£¤w¶ñ¦n¥¿½T¸ê®Æ¡A³q±`¬O©I¥s GetMessage ¥H±o¨ì MSG ¥¿½T¸ê®Æ¡C

¤@¯ë¦Ó¨¥¡AÀ³¥Îµ{¦¡¦b°T®§¦^°é¤º¡A§â©I¥s GetMessage ©Ò±oªº MSG ·í°µ DispatchMessage ªº°Ñ¼Æ©I¥s DispatchMessage¡C¦b DispatchMessage ¤º³¡·|±N MSG °T®§µo°eµ¹µøµ¡¨ç¦¡¡Aµ¥µøµ¡¨ç¦¡§¹¦¨°T®§³B²z«á¡A±±¨îÅv¦^¨ì DispatchMessage¡AµM«áªð¦^°T®§°j°é¡CDispatchMessage ªº¦^¶Ç­È¡A¬Oµøµ¡¨ç¦¡ªº¦^¶Ç­È¡A¦ý¤@¯ë¨S¤°»ò¥Î³B¥i¥H©¿²¤¡C

¸Ñ»¡ SPLWND.ASM ©|¥¼§¹¦¨¡A¦ý¬O³o¤@³¹¤w¸g¤Óªø¤F¡Aµ¥¤U¤@³¹¦AÄ~Äò¥¼§¹ªº³¡¤À¡C


µù¤@¡G

SPLWND °õ¦æ®É¡AWindows §@·~¨t²Î§â±±¨îÅv¥æµ¹ main¡Aµ¥ SPLWND µ{¦¡µ²§ô«á¤S§â±±¨îÅvÁÙµ¹ Windows §@·~¨t²Î¡C¯¸¦b Windows §@·~¨t²Îªº¨¤«×¨Ó¬Ý¡AWindows §@·~¨t²Î¬O¥Dµ{¦¡¡A¦Ó§Ú­Ì¼¶¼gªº main «o¬O°Æµ{¦¡¡C¦Ó¯¸¦b main ªº¨¤«×¨Ó¬Ý¡Amain ©I¥s¤F³\¦h Windows API¡Amain ¬O¥Dµ{¦¡¡A¨º¨Ç³Q©I¥sªº Windows API ¬O°Æµ{¦¡¡C¦]¦¹¥Dµ{¦¡»P°Æµ{¦¡ªºÃö«Y¬O¬Û¹ïªº¡C


µù¤G¡G

¨Æ¹ê¤W¡AWindows µ{¦¡°£¤F¥]§tµ{¦¡½X°Ï¬q¡B¸ê®Æ°Ï¬q¤§¥~¡AÁÙ¦³¡u¸ê·½¡v¡]resource¡^¡A¸ê·½¤¤¤j³¡¤À¬O©M¨Ï¥ÎªÌ¤¶­±¡]user interface¡^¦³Ãö¡A¥]§t¤F¿ï³æ¡]menu¡^¡B¹Ï¥Ü¡]icon¡^¡B´å¼Ð¡]cursor¡^¡B¦ì¤¸¹Ï¡]bitmap¡^¡B¦r«¬¡]font¡^¡B¹ï¸Ü²°¡]dialog box¡^¡Bª©¥»¸ê°T¡]version¡^µ¥µ¥¡C¦b»s§@µ{¦¡®É¡A·|¥Î³sµ²¾¹¡]LINK.EXE¡^±N¸ê·½»Pµ{¦¡½X°Ï¬q¡B¸ê®Æ°Ï¬q³sµ²¦b¤@°_¡A¥H«á¦A»¡©ú¡C¦¹³B¶È»¡©ú±q¸ê·½¤¤¨ú±o¹Ï¥Ü»P´å¼Ðªº¤è¦¡¡C

LoadIcon API

­n·Q¨ú±o¸ê·½¤¤ªº¹Ï¥Ü¡A¥i¥H©I¥s LoadIcon¡A¥¦¦³¨â­Ó°Ñ¼Æ¡G

invoke  LoadIcon,\
        hInstance,\     ; handle of application instance
        lpIconName      ; icon-name string or icon resource identifier

²Ä¤@­Ó°Ñ¼Æ¡AhInstance¡A¬O¥]§t¹Ï¥Üªº¼Ò²Õ¥N½X¡ClpIconName ¬O¦r¦ê¦ì§}¡A¦¹¦r¦ê¬O¥H 0 µ²§Àªº¹Ï¥Ü¦WºÙ¡A¦b¸ê·½´y­zÀɤ¤©w¸q¡]¨£²Ä³¹¡^¡CLoadIcon ¤]¥i¥HÀò±o Windows ¹w¥ý©w¸qªº¹Ï¥Ü¡A¦pªG­n³o¼Ë°µ¡AhInstance ¥²¶·³]¬° 0¡AlpIconName ¥i¥H¬O¤U­±±`¼Æªº¨ä¤¤¤@­Ó¡]¤Uªí¥¼§¹¥þ¦C¥X¹w¥ý©w¸qªº¹Ï¥Ü¡A¥i¥H¬d¾\ MSDN ±o¨ì§ó¦h¸ê®Æ¡^¡G

±`¼Æ¼Æ­È¡]¤Q¤»¶i¦ì¡^·N¸q
IDI_APPLICATION7F00¹w³]ªºÀ³¥Îµ{¦¡¹Ï¥Ü
IDI_HAND7F01¤â§Îª¬ªº¹Ï¥Ü
IDI_ASTERISK7F04¬P¸¹¹Ï¥Ü

¦pªGªí¥Üµo¥Í¿ù»~¡ALoadIcon ªº¦^¶Ç­È¬°¹s¡F¦pªG¦¨¥\¡A¦^¶Ç­È¬O¹Ï¥Ü¥N½X¡C

LoadCursor API

­n·Q¨ú±o¸ê·½¤¤ªº´å¼Ð¡A¥i¥H©I¥s LoadCursor¡A¥¦¦³¨â­Ó°Ñ¼Æ¡G

invoke  LoadCursor,\
        hInstance,\     ; handle of application instance
        lpCursorName    ; name string or cursor resource identifier

hInstance¡A¬O¥]§t´å¼Ðªº¼Ò²Õ¥N½X¡ClpCursorName ¬O¦r¦ê¦ì§}¡A¦¹¦r¦ê¬O¥H 0 µ²§Àªº´å¼Ð¦WºÙ¡A¦b¸ê·½´y­zÀɤ¤©w¸q¡]¨£²Ä³¹¡^¡CLoadCursor ¤]¥i¥HÀò±o Windows ¹w¥ý©w¸qªº´å¼Ð¡A¦pªG­n³o¼Ë°µ¡AhInstance ¥²¶·³]¬° 0¡AlpCursorName ¥i¥H¬O¤U­±±`¼Æªº¨ä¤¤¤@­Ó¡]¤Uªí¥¼§¹¥þ¦C¥X¹w¥ý©w¸qªº´å¼Ð¡A¥i¥H¬d¾\ MSDN ±o¨ì§ó¦h¸ê®Æ¡^¡G

±`¼Æ¼Æ­È¡]¤Q¤»¶i¦ì¡^·N¸q
IDC_ARROW7F00¹w³]ªº½bÀY´å¼Ð
IDC_WAIT7F02ªí¥Üµ¥«Ýªº´å¼Ð
IDC_APPSTARTING7F8A¹w³]ªº½bÀY©Mµ¥«Ýªº´å¼Ð

¦pªGªí¥Üµo¥Í¿ù»~¡ALoadCursor ªº¦^¶Ç­È¬°¹s¡F¦pªG¦¨¥\¡A¦^¶Ç­È¬O´å¼Ð¥N½X¡C

µù¤T¡G

¦b¨ì The MASM Forum ½×¾Â¤W¡A¤U¸ü¦^¨Óªº install64.zip ¦³¿ù»~¡C¦b win64.inc ¤¤ªº MSG µ²ºcÅé¡A¨ä message Äæ¦ìªº¸ê®ÆÃþ«¬À³¸Ó§ï¦¨¡uQWORD¡v¡C¸Ô±¡¨£ MASM32 ½×¾Â¤¤ªº MASM 64 SDK ¤l½×¾Â¡A§ä hutch-- ªº¶K¤å¡G¡uImportant change for win64.inc¡v¡C¦¹³B¤p¤ì°¸¤w§ó¥¿¤F¡C