³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
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¡An»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¥un§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¡Cn¥Î²Õ¦X»y¨¥¼¶¼g Windows µ{¦¡¡A¤£¶ÈnÁA¸Ñ Windows §@·~¨t²ÎI«áªºì²z¡A·íµM¡A¤]¤@©wn¤F¸Ñ²Õ¦X»y¨¥«ü¥O¡C
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¥¦Ì´yz¡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¨Ò¦pn¥Hµ²ºcÅé´yz®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ªGn©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¨º»ò´Nn¥Î¡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ªGn¦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Åé
¤Q¤»¦ì¤¸©Î§ó°ª¶¥ªº CPU ¦s¨ú°O¾ÐÅé¤Wªº¸ê®Æ®É¡A¦pªG°O¾ÐÅé¦ì§}¯à³Q 2¡B4¡B8¡B16 ¾ã°£®É¯à¼W¥[¦s¨ú³t²v¡A¦]¦¹¤~¦³¹ï»ô¤è¦¡ªº¿ï¶µ¡CSTRUCT ¤§«áªº¹ï»ôÈ¥i¥H¬O 1¡B2¡B4¡B8¡B16 ¤ºØ¼ÆÈ¡A¤]¥i¥H¬Ù²¤¡A¦pªG¬Ù²¤ªº¸Ü¹w³]ȬO 1¡Cµ²ºcÅéÄæ¦ìªº¦ì§}¡A´î¥hµ²ºcÅé°_©l¦ì§}ºÙ¬°°¾²¾¶q¡F¨CÓÄæ¦ìªº°¾²¾¶q¬O¥Ñ¹ï»ôÈ»P¸ÓÄæ¦ì¤j¤p¡]¥H¦ì¤¸²Õpºâ¡^¦@¦P¨M©wªº¡A³W«h¦p¤U¡G
¨Ò¦p¦³Ó NUMBER µ²ºcÅé¦p¤U¡G
BOOK STRUCT 4 ;½g²¾¶q price DW ? ; 0 ptitle DQ ? ; 4 month DB 3 DUP (?) ; 0Ch year DW ? ; 10h pg DD ? ; 14h BOOK ENDS ⁝ x BOOK <2d0h,OFFSET y,"Feb",7e6h,2b8h> y DB "²Õ¦X»y¨¥(°ê»Úª©)",0
x µ²ºcÅ骺¦UÄæ¦ì¤§¶¡¡A¥i¯à¤£¬O³sÄò±Æ¦C¡A¥¦Ì¤§¶¡¥i¯à·|¶ñ¥R¼Æ¶q¤£µ¥ªº¹s¡A»¡©ú¦p¤U¡G
¤U¹Ï¬°¤Wz x µ²ºcÅé¦b°O¾ÐÅ餤±Æ¦Cªº±¡§Î¡Cx ªº¦ì§}¦b 7FF601155000¡Fy ªº¦ì§}¦b 7FF601155018¡C
¦b²{¹ê¥@¬É¤¤ªº¤@Óª«Å馳³\¦h¯S©Ê¡A«ÜÃø¦b¹q¸£¤¤¦p¹êÁÙì¡A«ez»¡ªºª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
¥ý¨Ó¬Ý¬Ý 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³]±¡§Î¡CY¬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§ÚÌ¥ý¨Ó¬Ý¤jPªº¹Lµ{¡G
¤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
¥ý»¡»¡¦ó¿×¼Ò²Õ¡]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¤@©wn¨Ï¥Î¤Ï±×½u¡]\¡^¡A¦Ó¤£¯à¥Î±×½u¡]/¡^¡C¨Ò¦pn¨ú±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
¬°¦ó«Ø¥ßµøµ¡¤£ª½±µ«Ø¥ß´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´å¼Ð¡BI´º¦âµ¥µ¥¸Ó¦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ªGn¦Û¤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 ¤§«en§â WNDCLASSEX ¤º¦UÄæ¦ì³£³]©w¦n¥¿½T¥B§ÚÌ·Qnªº¼ÆÈ¡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
¦WºÙ | ¼ÆÈ¡]¤Q¤»¶i¦ì¡^ | ·N¸q |
CS_VREDRAW | 1 | ¨Ï¥ÎªÌ²¾°Êµøµ¡©Î½Õ¾ãµøµ¡¼e«×®É«·sø»s¾ãÓ¤u§@°Ï¡C |
CS_HREDRAW | 2 | ¨Ï¥ÎªÌ²¾°Êµøµ¡©Î½Õ¾ãµøµ¡°ª«×®É«·sø»s¾ãÓ¤u§@°Ï¡C |
CS_DBLCLKS | 8 | µøµ¡¨ç¦¡¯à±µ¦¬¨ì¨Ï¥ÎªÌ¥H·Æ¹«ÂùÀ»µøµ¡ªº°T®§¡C |
mov wc.style,CS_HREDRAW or CS_VREDRAW³o¼Ë´N·|Åý²Ä 0¡B1 ¦ì¤¸³£¬O 1¡A·í¨Ï¥ÎªÌ½Õ¾ãµøµ¡¤j¤p¡A¤£½×¬O¼e«×©Î°ª«×³£·|«·sø»s¡C
¦WºÙ | ¼ÆÈ¡]¤Q¤»¶i¦ì¡^ | ·N¸q |
COLOR_BACKGROUND | 1 | ®à±ªºI´ºÃC¦â |
COLOR_ACTIVECAPTION | 2 | ¬¡¤Æµøµ¡ªº¼ÐÃDÄæI´º¦â¡]¬¡¤Æªºµøµ¡¼ÐÃDÄæ¸û«G¡A¬¡¤Æªºµøµ¡¤~¯à±µ¨üÁä½L¿é¤J¡^ |
COLOR_WINDOW | 5 | ¤u§@°ÏªºÃC¦â |
COLOR_CAPTIONTEXT | 9 | µøµ¡¼ÐÃDÄæ¤å¦rÃC¦â |
¦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
±`¼Æ | ¼ÆÈ ¡]¤Q¤»¶i¦ì¡^ | ·N¸q |
WS_EX_TOPMOST | 8 | Á`¬O¨Ïµøµ¡¦b³Ì¤W±¡C |
WS_EX_RIGH | 1000 | ¦V¥k¹ï»ô¡A¥u¦³Ãþ¦üªü©Ô§B¤å¥Ñ¥k¦V¥ª¾\Ūªº Windows ª©¥»¦³®Ä¡C |
WS_EX_CLIENTEDGE | 200 | Åý¤u§@°Ï¬Ý°_¨Ó¥W³´¤U¥h¡A¸û¦³¥ßÅé·P¡C |
WS_EX_WINDOWEDGE | 100 | ÅýÃä®Ø¬Ý°_¨Ó¥Y°_¡A¸û¦³¥ßÅé·P¡C |
WS_EX_OVERLAPPEDWINDOW | 300 | WS_EX_WINDOWEDGE or WS_EX_CLIENTEDGE |
±`¼Æ | ¼ÆÈ ¤Q¤»¶i¦ì | ·N¸q |
WS_OVERLAPPED | 0 | «Å|¦¡µøµ¡¡A¦³¼ÐÃDÄæ»PÃä®Ø¡C¼ÐÃDÄæ¤W¨S¦³¹Ï¥Ü¡BÃö³¬¡B³Ì¤j¤Æ¡B³Ì¤p¤Æ«ö¶s¡A¤]¤£¯à¥H·Æ¹«©ì©Ô§ïÅܵøµ¡¤j¤p¡C |
WS_CAPTION | C00000H | ¦³¼ÐÃDÄ檺µøµ¡¡C |
WS_SYSMENU | 80000H | ¼ÐÃDÄæ¤W¦³¹Ï¥Ü¡]«ö¹Ï¥Ü·|¥X²{¨t²Î¿ï³æ¡^¤ÎÃö³¬«ö¶s¡C |
WS_THICKFRAME | 40000H | ¨ã¦³¥i¥Î·Æ¹«©ì©Ô½Õ¾ãµøµ¡¤j¤pªºÃä®Ø¡A»P WS_SIZEBOX ¦P¸q¡C |
WS_MINIMIZEBOX | 20000H | ¨ã¦³ WS_SYSMENU ·®æ®É¡A¼ÐÃDÄæ¤W¤~¦³³Ì¤p¤Æ«ö¶s¡C |
WS_MAXIMIZEBOX | 10000H | ¨ã¦³ WS_SYSMENU ·®æ®É¡A¼ÐÃDÄæ¤W¤~¦³³Ì¤j¤Æ«ö¶s¡C |
WS_TILEDWINDOW | CF0000H | ¦P®É¨ã¦³ WS_OVERLAPPED¡BWS_CAPTION¡BWS_SYSMENU¡BWS_THICKFRAME¡BWS_MINIMIZEBOX¡BWS_MAXIMIZEBOX ·®æ¡A»P WS_OVERLAPPEDWINDOW ¦P¸q¡C¤@¯ëµøµ¡¤j¦h¨Ï¥Î³oºØ·®æ¡C |
WS_CHILD | 40000000H | «Ø¥ß¤lµøµ¡¡C¨ã¦¹·®æªºµøµ¡¨S¦³¿ï³æ¡A¤]¤£¯à©M WS_POPUP ¦P®É¨Ã¦s¡C |
WS_POPUP | 80000000H | «Ø¥ß¼u¥Xµøµ¡¡A³oºØµøµ¡³q±`¬OÁ{®Éªº¡A¤£·|Åã¥Ü¦b¿Ã¹õ³Ì¤U¤èªº¤u§@¦C¤W¡A¤]¤£·|¼vÅT¥Dµøµ¡ªº§G§½¡C |
ºØÃþ | ¾P·´ | ¦ì¸m | ³Ì¤p¤Æ |
¤÷¡þ¤lµøµ¡ | ¤lµøµ¡¥ý©ó¤÷µøµ¡¾P·´ | ¤lµøµ¡¥²¦b¤÷µøµ¡¤u§@°Ï¤º | ¤÷µøµ¡³Ì¤p¤Æ©ÎÁôÂîɡA¤lµøµ¡¤£¥i¨£ |
¾Ö¦³ªÌ¡þ³Q¾Ö¦³µøµ¡ | ³Q¾Ö¦³ªºµøµ¡¤ñ¾Ö¦³ªÌµøµ¡¥ý¾P·´ | ³Q¾Ö¦³ªºµøµ¡¥i¥H¦b¾Ö¦³ªÌµøµ¡¥~ | ¾Ö¦³ªÌµøµ¡¤f³Ì¤p¤Æ®É¡A³Q¾Ö¦³µøµ¡¤]³Ì¤p¤Æ |
¦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_HIDE | 0 | ÁôÂõøµ¡¡C |
SW_SHOWNORMAL | 1 | Åã¥Ü¨Ã¨Ï¸Óµøµ¡¬¡¤Æ°_¨Ó¡C¦pªGµøµ¡¦b³Ì¤j¤Æ©Î³Ì¤p¤Æ¡A¨t²Î·|Åý¨ä«ì´_쪬¡Cµ{¦¡º¦¸Åã¥Üµøµ¡®É¡AÀ³¨Ï¥Î SW_SHOWNORMAL¡C |
SW_SHOWMINIMIZED | 2 | ¬¡¤Æµøµ¡¨Ã¥H³Ì¤p¤ÆÅã¥Ü¡C |
SW_SHOWMAXIMIZED | 3 | ¬¡¤Æµøµ¡¨Ã¥H³Ì¤j¤ÆÅã¥Ü¡C |
SW_SHOWNA | 8 | Åã¥Üµøµ¡¡A¦ý¬¡¤Æª¬ºA¤£ÅÜ¡C |
¦pªG ShowWindow ¦¨¥\Åã¥Üµøµ¡¡A¦^¶ÇȬ°«D¹s¡F§_«h¬°¹s¡C
Åã¥Ü§¹µøµ¡¤§«á¡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
¦b Windows §@·~¨t²Î¤U¡A¯à²£¥Íµøµ¡ªºµ{¦¡»P¦b¡u©R¥O´£¥Ü¦r¤¸¡v¤¤°õ¦æªº±±¨î»Oµ{¦¡¦³«Ü¤jªº¤£¦P¡CÁ|Ó¨Ò¤l¡A°²¦pn¼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©Ò¥Hn³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
¸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
³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 ¥¨¶°¬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¦Ó¬Onª¾¹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¡AY¬°°²«h¸õ¨ì .endw ¤§«áªºµ{¦¡¡FY¬°¯u´N°õ¦æ .while »P .endw ¤§¶¡ªºµ{¦¡¡Aª½¨ì .endw ªº«e¤@¹D«ü¥O¡A¤S·|¸õ¦^¦Ü .while ¦A¦¸Àˬd§PÂ_¦¡¤@¬O§_¬°¯u¡AY¬°¯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 ±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¥¦Ìªº´yz¡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¤@Ó¹³¯À¡A¨äÄæ¦ì¥Ñ¨âÓ®y¼Ð²Õ¦¨¡A¦p¤U¡G
POINT STRUCT x DWORD ? ;X ®y¼Ð y DWORD ? ;Y ®y¼Ð POINT ENDS
·í¨Ï¥ÎªÌ«ö¤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ªGnÀò±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 §â°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
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
¨Æ¹ê¤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
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¸ê·½´yzÀɤ¤©w¸q¡]¨£²Ä³¹¡^¡CLoadIcon ¤]¥i¥HÀò±o Windows ¹w¥ý©w¸qªº¹Ï¥Ü¡A¦pªGn³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_APPLICATION | 7F00 | ¹w³]ªºÀ³¥Îµ{¦¡¹Ï¥Ü |
IDI_HAND | 7F01 | ¤â§Îª¬ªº¹Ï¥Ü |
IDI_ASTERISK | 7F04 | ¬P¸¹¹Ï¥Ü |
¦pªGªí¥Üµo¥Í¿ù»~¡ALoadIcon ªº¦^¶ÇȬ°¹s¡F¦pªG¦¨¥\¡A¦^¶ÇȬO¹Ï¥Ü¥N½X¡C
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¸ê·½´yzÀɤ¤©w¸q¡]¨£²Ä³¹¡^¡CLoadCursor ¤]¥i¥HÀò±o Windows ¹w¥ý©w¸qªº´å¼Ð¡A¦pªGn³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_ARROW | 7F00 | ¹w³]ªº½bÀY´å¼Ð |
IDC_WAIT | 7F02 | ªí¥Üµ¥«Ýªº´å¼Ð |
IDC_APPSTARTING | 7F8A | ¹w³]ªº½bÀY©Mµ¥«Ýªº´å¼Ð |
¦pªGªí¥Üµo¥Í¿ù»~¡ALoadCursor ªº¦^¶ÇȬ°¹s¡F¦pªG¦¨¥\¡A¦^¶ÇȬO´å¼Ð¥N½X¡C
¦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
¹³¯À¡]pixel¡A²¼g¬° px¡^»PÂI¡]point¡A²¼g¬° pt¡^¬O¨âÓ·§©À«Ü¬Û¹³¡A¦ý·N¸q«o¤£¦Pªº±M¦³¦Wµü¡C
¹³¯À¬O¿Ã¹õ¤W©Ò¯àÅã¥Üªº³Ì¤p³æ¦ì¡A»P¿Ã¹õ¤Ø¤o¤j¤p¡B¸ÑªR«×¦³Ãö«Y¡C¦P¤@ÓÅã¥Ü¾¹¡A¥i¥H¥Î¤£¦Pªº¸ÑªR«×Åã¥Ü¡A¨Ò¦p¤p¤ì°¸¨Ï¥Îªº 24 ¦T¿Ã¹õ¡]¦T§Y^¦T¡A¤@^¦T¬° 2.54 ¤½¤À¡^¡A¥i¥HÅã¥Ü 1920¡Ñ1080¡A¤]¥i¥HÅã¥Ü 1600¡Ñ900¡C¥i¥H±À½×±o¨ì¡A«e¤@ºØ¼Ò¦¡¤U¨CÓ¹³¯À¤ñ¸û¤p¡A³o¬O¦]¬°n¦b¤@¼Ëªº¤Ø¤o¤U¶ë¤J§ó¦hªº¹³¯À¡A·íµM¨CÓ¹³¯À¤ñ¸û¤p¡A¦Ó¥B¬O«áªÌªº¤»¤À¤§¤¿¡C
ÂI«h¬O¤@ºØ¼Ð·Çªºªø«×³æ¦ì¡A©w¸q¤W¤@ÂI¼e»P°ª³£µ¥©ó^¦T¡C¦]¦¹¥¦¸ò§ÚÌ©Ò¼ô±xªº¤½¤À¡B¤½¤Ø¤@¼Ë¡A¤@ÓÂIªº¤j¤p¬O©T©w¤£Åܪº¡CÂI±`¥Î©ó±Æª©¦L¨ê¤¤¡A¥Î©óªí¬O¤å¦rªº¤j¤p¡C
¾ã²z¹³¯À»PÂIªº®t§O¡G
¦pªGn§â¿Ã¹õ¤Wªº¹Ï®×¦L¦b¦Lªí¾÷¤W®É¡A´N»Ýn´«ºâ¡C¦ý³o²o¯A¨ì³\¦h¤è±¡A¤£¦b³o¨à»¡¡C§ó¦hªº¸ê®Æ¡A¥i¥H°Ñ¦Ò SPARKFUL ³¡¸¨®æ¤¤ªº¥L¯uªº¤£¬O§Ú¥S§Ì¡G¹³¯À¸òÂI¤j¤£¦P¡C