VFP ·R¥ÎªÌªÀ°Ï ­º­¶ VFP ·R¥ÎªÌªÀ°Ï
¥»°Q½×°Ï¬° Visual Foxpro ·R¥ÎªÌ¸gÅç¥æ¬yªº¦a¤è, ½Ð¦h¦h§Q¥Î"·j´M"ªº¥\¯à, ¥ý¬d¬Ý¬Ý¦³µL«e¨Ò¥i´`, ¦pªGÁÙ¦³¤£À´ªº¦Aµo°Ý. ³¡¥÷¥DÃD¦³ªþ¥[ÀÉ®×, ¶·¥ýµù¥U¦¨¬°ªÀ°Ï©~¥Á¤~¥i¥H¤U¸ü.
 
 ±`¨£°ÝÃD±`¨£°ÝÃD   ·j´M·j´M   ·|­û¦Cªí·|­û¦Cªí   ·|­û¸s²Õ·|­û¸s²Õ   ·|­ûµù¥U·|­ûµù¥U 
 ­Ó¤H¸ê®Æ­Ó¤H¸ê®Æ   µn¤JÀˬd±zªº¨p¤H°T®§µn¤JÀˬd±zªº¨p¤H°T®§   µn¤Jµn¤J

[Âà©«]Foxtalk¤ë¥Z--VFP9-»´ÃP³sµ²Windows¨Æ¥ó

 
µoªí·s¥DÃD   ¦^ÂÐ¥DÃD    VFP ·R¥ÎªÌªÀ°Ï ­º­¶ -> VFP °Q½×°Ï
¤W¤@½g¥DÃD :: ¤U¤@½g¥DÃD  
µoªí¤H ¤º®e
¦¶¨|¿³



µù¥U®É¶¡: 2003-08-25
¤å³¹: 661
¨Ó¦Û: ¥x¤¤¥«¤j¨½°Ï

²Ä 1 ¼Ó

µoªíµoªí©ó: ¬P´Á¤T ¤@¤ë 19, 2005 12:34 am    ¤å³¹¥DÃD: [Âà©«]Foxtalk¤ë¥Z--VFP9-»´ÃP³sµ²Windows¨Æ¥ó ¤Þ¨¥¦^ÂÐ

[VFP9­«ÂI]¡K¡K»´ÃP³sµ²Windows¨Æ¥ó¡K¡K

¤U­±¬O FOXTALK ¢¯¢´¦~¢°¤ë¥Z¤¤ªº§K¶O¤å³¹¡A§ó¦h¤º®e¨£¡G http://foxer.xicp.net¡C­q¤á³qª¾¡GFOXTALK¤¤¤åª© ¢¯¢´¦~¢°¤ë¥Z¤wµo§G¡A½Ð¦Û¨ú¡C¡C¡C
¡G

»´ÃP³sµ² Windows ¨Æ¥ó
§@ªÌ¡GDoug Hennig
ĶªÌ¡Gfbilo

VFP ©Ò¯Ê¤Öªº¦b¨ä¥¦¶}µoÀô¹Ò¤¤ªº¤@­Ó¥\¯à¬O®·®» Windows ¨Æ¥óªº¯à¤O¡CVFP 9 ÂX®i¤F BindEvent()¨ç¼Æªº¥\¯à¡A²{¦b¡A·í Windows ¶Ç»¼¬Y¨Ç¯S©wªº°T®§µ¹ VFP µøµ¡ªº®É­Ô¡ABindEvent()¥i¥H©I¥s§Ú­Ì¦Û¤vªºµ{¦¡½X¡C³o­Ó¥\¯à¦³µÛ«Ü¼sªxªº¥Î³~¡ADoug Hennig ¦b³oùج°§Ú­ÌÁ¿­z¤F¤@³¡¤À¡C

Windows ³q¹L¶Ç»¼°T®§¨Ó§â¨Æ¥ó¶Ç°eµ¹À³¥Îµ{¦¡¡C¾¨ºÞ VFP ¤w¸g³q¹L VFP ª«¥ó¤¤ªº¨Æ¥ó¬°§Ú­Ì´£¨Ñ¤F³o¨Ç°T®§ªº¤@³¡¤À¡X¡X¤ñ¦p MouseDown ©M Click¡X¡X¦ýÁÙ¬O¦³³\¦h°T®§¹ï VFP µ{¦¡¤H­û¨Ó»¡¬O¤£¥i¥Îªº¡C
¤@­Ó±`¨£ªº»Ý¨D¬O­n¯à°÷ÀË´ú¨ì¨Ï¥ÎªÌ¦bÀ³¥Îµ{¦¡¤§¶¡¤Á´«ªº¨Æ¥ó¡C¨Ò¦p¡A§Ú«Ø¥ß¤F¤@­ÓÀ³¥Îµ{¦¡¡A¸ÓÀ³¥Î±¾¹_¦b¤@­ÓµÛ¦WªºÁpô¤HºÞ²z¨t²Î GoldMine ¤¤¡A¥H¬°¥Ø«eÁpô¤HÅã¥Ü§ó¦hªº°T®§¡C¦pªG¨Ï¥ÎªÌ¤Á´«¨ì GoldMine¡AµM«á¿ï¾Ü¤F¥t¤@­ÓÁpô¤H¡A¨º»ò¡A·í¥L¦A¦¸¤Á´«¦^§ÚªºÀ³¥Îµ{¦¡ªº®É­Ô¡A§ÚªºÀ³¥Îµ{¦¡´NÀ³¸Ó¶i¦æ§ó·s¡A¥HÅã¥Ü·sÁpô¤Hªº°T®§¡C¤£©¯ªº¬O¡A¦b¥H«eª©¥»ªº VFP ¤¤¬O¤£¥i¯à°µ¨ì³o¤@ÂIªº¡F§Ú¥u¦³¨Ì¾a­p®É¾¹¨Ó¤£Â_ªºÀˬd¥Ø«eÅã¥Ü¦b GoldMine ¤¤ªº¬O­þ­ÓÁpô¤H¡C

VFP 9 ÂX®i¤F¦b VFP 8 ¤¤¼W¥[ªº BindEvent() ¨ç¼Æªº¥\¯à¥H¤ä´© Windows °T®§¡C¹ê²{³o­Ó¥\¯àªº»yªk¬O¡G
bindevent(hWnd, nMessage, oEventHandler, cDelegate)

¦b³oùØ¡AhWnd ¬O±µ¦¬¨Æ¥óªºµøµ¡ªº Windows ±±¨î½X¡AnMessage ¬O Windows °T®§½s¸¹¡A¦Ó oEventHandler ©M cDelegate ¬O·íµøµ¡±µ¦¬¨ì°T®§ªº®É­Ô³QIJµoªº¹ï¶H©M¤èªk¡C»P VFP ¨Æ¥ó¤£¦Pªº¬O¡A¥u¦³¤@­Ó¨Æ¥ó³B²z¾¹¡]oEventHandler¡^¥i¥H³Q³sµ²µ¹¤@­Ó¯S©wªº hWnd ©M nMessage ²Õ¦X¡C«ü©w²Ä¤G­Ó¨Æ¥ó³B²z¾¹ª«¥ó©ÎªÌ¥N²z¤èªk·|¾É­P²Ä¤@­Ó³sµ²³Q´À´«¬°²Ä¤G­Ó¡CVFP ¤£·|¹ï hWnd ©Î nMessage ªº­Èªº¦³®Ä©Ê¶i¦æÀˬd¡F¦pªG¨ä¤¤¤@­ÓµL®Ä¡A´N¤°»ò³£¤£·|µo¥Í¡A¦]¬°«ü©wªºµøµ¡±NµLªk±µ¦¬¨ì«ü©wªº°T®§¡C
¹ï©ó hWnd¡A§A¥i¥H«ü©w _Screen.hWnd ©ÎªÌ _VFP.hWnd ¨Ó¸òÂܨº¨Çµo°eµ¹À³¥Îµ{¦¡ªº°T®§¡A©ÎªÌ«ü©w¤@­Óªí³æªº hWnd ¨Ó¸òÂܵo°eµ¹¸Óªí³æªº°T®§¡CVFP ±±¨î¶µ¨S¦³ Windows ±±¨î½X¡A¦ý¬O ActiveX ±±¨î¶µ¦³¡A©Ò¥H§A¤]¥i¥H³sµ²¨ì¥¦­Ì¨­¤W¡C
Windows ¤¤¦³µÛ¼Æ¦Ê­Ó Windows °T®§¡C³oÃþ§Oªº°T®§¦³¡GWM_POWERBROADCAST(0x0218)¡A¸Ó°T®§¦b¹q¦À¹q¶q¹L§C¡B©ÎªÌ¤Á´«¨ì±¾°_¼Ò¦¡³o¼Ëªº¹q¨Ó·½¨Æ¥óµo¥Í®É³Qµo¥X¡BWM_THEMECHANGED(0x031A)¡A¥¦ªí¥Ü Windows XP ®à­±¥DÃD¤w¸g³Q§ó´«¡FÁÙ¦³ WM_ACTIVATE(0x0006)¡A¥¦¦b¤Á´«¨ì¤@­ÓÀ³¥Îµ{¦¡¡B©ÎªÌ±qÀ³¥Îµ{¦¡¤Á´«¥X¨Óªº®É­Ô³QIJµo¡]Windows °T®§³q±`¥Î¤@­Ó¥HWM_¶}ÀYªº¦W¦r¨Ó¤Þ¥Î¡^¡C

¦bºô§}¡Ghttp://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowui.asp ³B¦³µÛ´X¥G©Ò¦³ªº Windows °T®§ªº¤å¦rÀÉ¡C¦Ó§@¬° Platform SDK ¤@³¡¤Àªº WinUser.H Àɮפ¤¦³µÛ¨º¨Ç WM_ ¶}ÀYªº±`¼Æªº­È¡A§A¥i¥H±q www.microsoft.com/msdownload/platformsdk/sdkupdate/ ³B¤U¸ü³o­Ó Platform SDK¡C
¨Æ¥ó³B²z¾¹ªº¤èªk¥²¶·±µ¦¬4­Ó°Ñ¼Æ¡GhWnd¡A¬O±µ¦¬°T®§ªºµøµ¡ªº±±¨î½X¡FnMessage¡A¬O Windows °T®§ªº½s¸¹¡FÁÙ¦³¨â­Ó Integer °Ñ¼Æ¡A¥¦­Ìªº­ÈÀHµÛ Windows °T®§ªº¤£¦P¦Ó¤£¦P¡]¨C­Ó°T®§ªº¤å¦rÀɸÑÄÀ¤F³o¨Ç°Ñ¼Æªº­È¡^¡C¤èªk¥²¶·¶Ç¦^¤@­Ó Integer¡A¨ä¤¤¥]§tµÛ¤@­Óµ²ªGªº­È¡C¤@ºØ¥i¯àªº¶Ç¦^­È¬O BROADCAST_QUERY_DENY(0x424D5144¡A¥Nªí¦r¦ê¡uBMQD¡v)¡A·N«ä¬O¨Æ¥óªºµo¥Í³Qªý¤î¤F¡C
¦pªG§A·QÅý°T®§³q¹L¨ººØ¤j¦h¼Æ¨Æ¥ó³B²z¾¹À³°µªº±`³W¤è¦¡¨Ó³Q³B²z¡A§A´N¥²¶·¦b§Aªº¨Æ¥ó³B²z¾¹¤èªk¤¤©I¥s VFP ªº Windows °T®§³B²z¾¹¡F³o¬OºØ´N¹³¬O¦b VFP ¤èªkµ{¦¡½X¤¤¨Ï¥Î DODEFAULT() ³o¼Ëªº¿ìªk¡C§Aªº¨Æ¥ó³B²z¾¹¤èªk«Ü¹³¬O¶Ç¦^ VFP ªº Windows °T®§³B²z¾¹ªº¶Ç¦^­È¡C³oùجO¤@­Ó¨Æ¥ó³B²z¾¹§¹¦¨³oºØ¥ô°Èªº¤@­Ó½d¨Ò¡]§Oªº¥¦¤°»ò³£¤£·F¡^¡G

lparameters hWnd, ;
Msg, ;
wParam, ;
lParam
local lnOldProc, ;
lnResult
#define GWL_WNDPROC -4

declare integer GetWindowLong in Win32API ;
integer hWnd, integer nIndex

declare integer CallWindowProc in Win32API ;
integer lpPrevWndFunc, integer hWnd, integer Msg, ;
integer wParam, integer lParam

lnOldProc = GetWindowLong(_screen.hWnd, GWL_WNDPROC)
lnResult = CallWindowProc(lnOldProc, hWnd, Msg, ;
wParam, lParam)
return lnResult

·íµM¡A¨Æ¥ó³B²z¾¹¤£»Ý­n¨C¦¸³£Án©ú Windows API ¨ç¼Æ©ÎªÌ©I¥s GetWindowLog¡F§A¥i¥H§â³o¨Çµ{¦¡½X©ñ¦bÃþ§Oªº Init ¨Æ¥ó¤¤¡A§â GetWindowLong ªº¶Ç¦^­ÈÀx¦s¦b¤@­Ó¦Û©w¸qÄݩʤ¤¡AµM«á¦b¨Æ¥ó³B²z¾¹­n©I¥s CallWindowProc ªº®É­Ô¨Ï¥Î³o­ÓÄÝ©Ê¡C«á­±ªº½d¨Ò·|¥Î³oºØ¤èªk¨Ó°µ¡C

¬°¤F§P©w³sµ²ªº¬O­þºØ°T®§¡A¥i¥H¨Ï¥Î AEVENTS(ArrayName,1)¡C¥¦·|¦b«ü©wªº°}¦C¤¤¬°¨C­Ó³sµ²¤À°t¤@¦C©M¥|¦æ¡A¨Ã¥Î³Q¶Ç»¼µ¹ BINDEVENT()ªº°Ñ¼Æªº­È¹ï¤¸¯À­Ì¶i¦æ¶ñ¥R¡C
§A¥i¥H¨Ï¥Î UNBINDEVENT(hWnd[,nMessage])¨Ó¨ú®ø¨Æ¥ó³sµ²¡C©¿²¤²Ä¤G­Ó°Ñ¼Æªº¸Ü¡A´N·|¨ú®ø¹ï«ü©wµøµ¡ªº©Ò¦³°T®§ªº³sµ²¡C¥uµ¹³o­Ó¨ç¼Æ¶Ç»¼¤@­Ó0·|¨ú®ø¹ï©Ò¦³µøµ¡ªº©Ò¦³°T®§ªº³sµ²¡C¦b¨Æ¥ó³B²z¾¹ª«¥ó³QÄÀ©ñ¥H«á¡A¦A¦¸µo¥Í°T®§®É¨Æ¥ó¤]·|¦Û°Ê¨ú®ø³sµ²¡C
¤@­Ó·sª©¥»ªº VFP «ç»ò·|¨S¦³¤@¨Ç·sªº SYS() ¨ç¼Æ©O¡H¦b VFP 9.0 ¤¤·s¼W¤F¤T­Ó»P Windows ¨Æ¥ó¬ÛÃöªº SYS()¨ç¼Æ¡G
ƒÜ SYS(2325, wHandle)¬°¤@­Ó¥Ñ¶Ç»¼¶i¨ÓªºwHandle¡]VFP¹ï hWnd ªº¤@­Ó¤º³¡«Ê¸Ë¡^«ü©wªºµøµ¡¶Ç¦^¥¦ªº¨Ï¥ÎªÌºÝµøµ¡ªº wHandle¡]¤@­Ó¨Ï¥ÎªÌºÝµøµ¡¬O¤@­Ó¦b¤@­Óµøµ¡¤º³¡ªºµøµ¡¡F¨Ò¦p¡A_Screen ¬O _VFP ªº¤@­Ó¨Ï¥ÎªÌºÝµøµ¡¡^¡C
ƒÜ SYS(2326,hWnd)¶Ç¦^¥Î hWnd «ü©wªºµøµ¡ªº wHandle¡C
ƒÜ SYS(2327,wHandle)¬°¥Î wHandle «ü©wªºµøµ¡¶Ç¦^¨ä hWnd¡C³o¨Ç¨ç¼Æªº¤å¦rÀÉ«ü¥X¡A¥¦­Ì¬O¦b¨Ï¥Î¤F VFP API ¨ç¦¡®wµ²ºc¤u¨ã¥]ªº±¡ªp¤U¥Î©óBINDEVENT()¨ç¼Æªº¡C¤£¹L¡A±q¤U­±ªº½d¨Ò¤¤¥i¥H¬Ý¨ì¡A§A¤]¥i¥H¨Ï¥Î¥¦­Ì¨ÓÀò±o¤@­Ó VFP IDE µøµ¡ªº¨Ï¥ÎªÌºÝµøµ¡ªº hWnd¡C

³sµ²¨ì VFP IDE µøµ¡¨Æ¥ó

¥]§t¦b³o­Ó¤ë¤U¸üÀɮפ¤ªº TestWinEventsForIDE.PRG ¥Ü½d¤F«ç»ò±N¨Æ¥ó³sµ²¨ì VFP ªº IDE µøµ¡¡C±N§A·Q­n³sµ²¨Æ¥óªº IDE µøµ¡ªº Caption ³]©w¬° lcCaption¡]¤U­±ªºµ{¦¡½X±N¨Ï¥Î©R¥Oµøµ¡¨Ó¥Ü½d¡^¡AµM«á°õ¦æ³o­Óµ{¦¡¡C±Ò°Ê©M¨ú®ø±Ò°Ê¸Óµøµ¡¡A²¾°Ê¡BÁY©ñµøµ¡µ¥µ¥¡F§A±N¬Ý¨ì¹ï Screen °µ¥X¤ÏÀ³ªº Windows ¨Æ¥ó¡C¸ÕÅ秹¤Fªº®É­Ô¡A¦b©R¥Oµøµ¡ùØ¿é¤J RESUME ¨Ã«ö¤UÂk¦ì¨Ó¶i¦æ²M²z¡C­n¥Î³o¬qµ{¦¡½X¹ï¤@­Ó IDE µøµ¡¤¤ªº¨Ï¥ÎªÌºÝµøµ¡¶i¦æ´ú¸Õªº¸Ü¡A»Ý­n±Nµ{¦¡½X¤¤³QµùÄÀ±¼ªº³¡¤À¸Ñ°£µùÄÀ¡C
§A¤]¥i¥H³q¹Lµ¹³o¬qµ{¦¡½X¼W¥[ BINDEVENT() ±Ô­z¨Ó³sµ²¨ä¥¦ªº¨Æ¥ó¡F¬°§Æ±æ³sµ²ªº¨Æ¥ó¨Ï¥Î¦bWinEvents.H¤¤ªº±`¼Æªº­È¡Cª`·N¡ATestWinEventsForIDE.PRG¥u¤u§@©ó«D¥i°±¾aIDEµøµ¡¡A©Ò¥H¡A¦b§A°õ¦æ³o­Óµ{¦¡¤§«e­n¥ý¦b§A·Q­n´ú¸Õªºµøµ¡ªº¼ÐÃDÄæ¤W«ö¤@¤U·Æ¹«¥kÁä¡B½T«O¥i°±¾a¿ï¶µ¤w³QÃö³¬¡C
³oùجO³o­Ó PRG ªºµ{¦¡½X¡G

#include WinEvents.H

lcCaption = 'Command'
loEventHandler = createobject('IDEWindowsEvents')
lnhWnd = ;
loEventHandler.FindIDEWindow(lcCaption)

* ¸Ñ°£µùÄÀ¤U­±ªºµ{¦¡½X¥H±µ¦¬¨Ï¥ÎªÌºÝµøµ¡ªº¨Æ¥ó
*lnhWnd = ;

loEventHandler.FindIDEClientWindow(lcCaption)
if lnhWnd > 0
bindevent(lnhWnd, WM_SETFOCUS, loEventHandler, ;
'EventHandler')
bindevent(lnhWnd, WM_KILLFOCUS, loEventHandler, ;
'EventHandler')
bindevent(lnhWnd, WM_MOVE, loEventHandler, ;
'EventHandler')
bindevent(lnhWnd, WM_SIZE, loEventHandler, ;
'EventHandler')
bindevent(lnhWnd, WM_MOUSEACTIVATE, loEventHandler, ;
'EventHandler')
bindevent(lnhWnd, WM_KEYDOWN, loEventHandler, ;
'EventHandler')
bindevent(lnhWnd, WM_KEYUP, loEventHandler, ;
'EventHandler')
bindevent(lnhWnd, WM_CHAR, loEventHandler, ;
'EventHandler')
bindevent(lnhWnd, WM_DEADCHAR, loEventHandler, ;
'EventHandler')
bindevent(lnhWnd, WM_KEYLAST, loEventHandler, ;
'EventHandler')
clear
suspend
unbindevents(0)
clear
else
messagebox('The ' + lcCaption + ;
' window was not found.')
endif lnhWnd > 0

define class IDEWindowsEvents as Custom
cCaption = ''
nOldProc = 0
function Init
declare integer GetWindowLong in Win32API ;
integer hWnd, integer nIndex
declare integer CallWindowProc in Win32API ;
integer lpPrevWndFunc, ;
integer hWnd, integer Msg, ;
integer wParam, integer lParam
declare integer FindWindowEx in Win32API;
integer, integer, string, string
declare integer GetWindowText in Win32API ;
integer, string @, integer
This.nOldProc = GetWindowLong(_screen.hWnd, ;
GWL_WNDPROC)
endfunc

function FindIDEWindow(tcCaption)
local lnhWnd, ;
lnhChild, ;
lcCaption
This.cCaption = tcCaption
lnhWnd = _screen.hWnd
lnhChild = 0

do while .T.
lnhChild = FindWindowEx(lnhWnd, lnhChild, 0, 0)
if lnhChild = 0
exit
endif lnhChild = 0

lcCaption = space(80)
GetWindowText(lnhChild, @lcCaption, len(lcCaption))
lcCaption = upper(left(lcCaption, ;
at(chr(0), lcCaption) - 1))
if lcCaption = upper(tcCaption)
exit
endif lcCaption = upper(tcCaption)
enddo while .T.
return lnhChild
endfunc

function FindIDEClientWindow(tcCaption)
local lnhWnd, ;
lnwHandle, ;
lnwChild
lnhWnd = This.FindIDEWindow(tcCaption)

if lnhWnd > 0
lnwHandle = sys(2326, lnhWnd)
lnwChild = sys(2325, lnwHandle)
lnhWnd = sys(2327, lnwChild)
endif lnhWnd > 0
return lnhWnd
endfunc

function EventHandler(hWnd, Msg, wParam, lParam)
? 'The ' + This.cCaption + ;
' window received event #' + transform(Msg)
return CallWindowProc(This.nOldProc, hWnd, Msg, ;
wParam, lParam)
endfunc
enddefine

³o¬qµ{¦¡½X±q«Ø¥ß IDEWindowsEvents Ãþ§Oªº¹ê¨Ò¶}©l¡C¥¦©I¥s FindIDEWindow ¤èªkµ{§Ç¨ÓÀò±o¹ï¤@­Ó¨ä Caption Àx¦s¦b lcCaption ÅܼƤ¤ªºµøµ¡ªº±±¨î½X¡CµM«á¥¦¨Ï¥Î BindEvent()¨Ó±N©Ò»Ýµøµ¡ªº¯S©w¨Æ¥ó³sµ²¨ì³o­ÓÃþ§Oªº EventHandler ¤èªkµ{§Ç¡C³o¨Ç¨Æ¥ó¥]¬A±Ò°Ê¡B¨ú®ø±Ò°Ê¡BÁY©ñ¡B²¾°Êµøµ¡¡B¥H¤Î¦bµøµ¡¤¤ªºÁäÀ»¡C
IDEWindowsEvents ªº Init ¨Æ¥óÁn©ú¤F³o­ÓÃþ§O­n¥Î¨ìªº Windows API ¨ç¼Æ¡C¥¦ÁÙ©w¸q¤F¥Î©ó©I¥s VFP ªº WIndows °T®§³B²z¾¹ªº­È¡A¨Ã±N³o­Ó­ÈÀx¦s¦b nOldProc Äݩʤ¤¡FEventHandler ¤èªkµ{§Ç¨Ï¥Î³o­Ó­È¨Ó½T«O±`³Wªº¨Æ¥ó³B²z·|¥¿±`µo¥Í¡CFindIDEWindow ¤èªkµ{§Ç¨Ï¥Î¤@¹ï Windows API ¨ç¼Æ¨Ó§ä¨ì«ü©wªº VFP IDE µøµ¡¡C¥¦¬O³q¹L¹M¾ú _VFP ªº¨C­Ó¤lµøµ¡¡B¨Ã±N¦U­Ó¤lµøµ¡ªº Caption ©M³Q§@¬°°Ñ¼Æ¶Ç»¼¶i¨Óªº Caption ¶i¦æ¹ï¤ñ¨Ó§¹¦¨³o­Ó¥ô°Èªº¡CFindIDEClientWindow°µªº¬OÃþ¦üªº¨Æ±¡¡A¤£¹L¨Ï¥Î¤F·sªº SYS() ¨ç¼Æ¨ÓÀò±o¹ï«ü©wµøµ¡ªº¨Ï¥ÎªÌºÝµøµ¡ªº±±¨î½X¡C
·í§A°õ¦æ TestWinEventsForIDE.PRG ªº®É­Ô¡A§A·|µo²{¨Ã«D¨C­Ó IDE ©ÎªÌ¨Ï¥ÎªÌºÝµøµ¡³£·|µo¥Í¨C­Ó¨Æ¥ó¡C¨Ò¦p¡A¦bÄݩʵøµ¡¤¤§A¤£·|¬Ý¨ì keypress ¨Æ¥óªºµo¥Í¡C³o«Ü¥i¯à¬O¥Ñ©ó VFP ¹ê²{µøµ¡ªº¤è¦¡»P§Oªº Windows À³¥Îµ{¦¡¤£¦P©Ò¾É­Pªº¡C
ª`·N¡G³q±`§A¤£·|¦b¤@­Ó¨å«¬ªºÀ³¥Îµ{¦¡¤¤¨Ï¥ÎÃþ¦ü©ó³oùتºµ{¦¡½X¡F¥¦¥u¬O¦V¨º¨Ç·Q­nµ¹ VFP ªº IDE ¼W¥[¦Û¤v©Ò»Ý¦æ¬°ªºµ{¦¡¤H­û´£¨Ñªº¡C¤U¤@­Ó½d¨Ò¤¤¥Î¨ìªº§Þ³N§A¥i¯à·|¥Î¦b¤@­Ó³Ì²×¨Ï¥ÎªÌªºÀ³¥Îµ{¦¡¤¤¡C

³sµ²¨ìÀ³¥Îµ{¦¡µøµ¡©MºÏºÐ¨Æ¥ó

WindowsMessagesDemo.SCX ¡]¨£¹Ï1¡^¥Ü½d¤F±¾¹_¨ì±Ò°Ê©M¨ú®ø±Ò°Ê¥H¤Î¯S©wªº¤@¨Ç Windows Shell ¨Æ¥ó¡X¡X¨Ò¦p´¡¤J©Î¨ú¥X¤@±i CD ©ÎªÌ USB ³]³Æ¡C¤U­±¥Ü½d¤F¤@­Ó Windows ¨Æ¥óªº¦³½ìªº¥Î³~¡G³o¨Çµ{¦¡½X±N¤@­Ó Windows Shell ¨Æ¥óªº¤l¶°·í§@¬O¤@­Ó¦Û©w¸q Windows ¨Æ¥ó¡A¨Ã±N_VFP µù¥U¬°±µ¦¬³o­Ó¦Û©w¸qWindows¨Æ¥ó¡C

¹Ï1¡BWindowsMessagesDemo.SCX ¥Ü½d¤F§AªºÀ³¥Îµ{¦¡¥i¯à·|»Ý­nªº´X­Ó Windows ¨Æ¥ó¡C
³o­Óªí³æªº Init ¨Æ¥ó·|³B²z¥²­nªº³]©w°ÝÃD¡C¸ò TestWinEventsForIDE.PRG ¤@¼Ë¡A¥¦Án©ú¤F´X­Ó Windows API ¨ç¼Æ¡A¨Ã±N¥Î©ó VFP ªº Windows ¨Æ¥ó³B²z¾¹ªº­ÈÀx¦s¦b nOldProc Äݩʤ¤¡C¨Ï¥Î¦Û©w¸qªº°T®§ WM_USER_SHNOTIFY ¨Ó©I¥sSHChangeNotifyRegister ¥HÅý Windows §â _VFP µù¥U¬°±µ¦¬ºÏºÐ¨Æ¥ó¡B´CÅ骺´¡¤J©M²¾°£¨Æ¥ó¡B¥H¤Î³]³Æªº¼W¥[©M´î¤Ö¨Æ¥ó¡]¦b¤U­±ªºµ{¦¡½X¤¤¡A¤j¼gªº¼Ð»x²Å¸¹¬O©w¸q¦b WinEvents.H ©ÎªÌ ShellFileEvents.H ¤¤ªº±`¼Æ¡^¡C
µM«á³o¬qµ{¦¡½X¬°ªí³æ±N±Ò°Ê¨Æ¥ó©M³]³Æ§ó°Ê¨Æ¥ó¥H¤Î¥¦­è­è¬° _VFP ©w¸qªº¦Û©w¸q°T®§³sµ²¨ìªí³æªº HandleEvents ¤èªkµ{§Ç¡Cª`·N¡G¹ï SHChangeNotifyRegister ªº©I¥s­n¨D Windows XP ©Î§ó°ªªºª©¥»¡C¦pªG§A¦b¨Ï¥Î¤@­Ó§ó¦­ª©¥»ªº¾Þ§@¨t²Î¡A½Ð±N¬° This.nSHNotify ½á­Èªº±Ô­zµùÄÀ±¼¡C
local lcSEntry

* Án©ú­n¥Î¨ìªº Windows API ¨ç¼Æ
declare integer GetWindowLong in Win32API ;
integer hWnd, integer nIndex
declare integer CallWindowProc in Win32API ;
integer lpPrevWndFunc, integer hWnd, integer Msg, ;
integer wParam, integer lParam
declare integer SHGetPathFromIDList in shell32 ;
integer nItemList, string @szPath
declare integer SHChangeNotifyRegister in shell32 ;
integer hWnd, integer fSources, integer fEvents, ;
integer wMsg, integer cEntries, string @SEntry
declare integer SHChangeNotifyDeregister in shell32 ;
integer

* ¬° VFP µøµ¡¨Æ¥ó³B²z¾¹¨ú±o¤@­Ó±±¨î½X
This.nOldProc = GetWindowLong(_screen.hWnd, ;
GWL_WNDPROC)

* µù¥U _VFP ¨Ó§â¯S©wªº shell ¨Æ¥ó·í§@¤@­Ó¦Û©w¸q Windows ¨Æ¥ó±µ¦¬
lcSEntry = replicate(chr(0), Cool
This.nShNotify = SHChangeNotifyRegister(_vfp.hWnd, ;
SHCNE_DISKEVENTS, SHCNE_MEDIAINSERTED + ;
SHCNE_MEDIAREMOVED + SHCNE_DRIVEADD + ;
SHCNE_DRIVEREMOVED, WM_USER_SHNOTIFY, 1, @lcSEntry)

* ³sµ²¨ì§Ú­Ì·P¿³½ìªºWindows¨Æ¥ó
bindevent(This.hWnd, WM_ACTIVATE, This, 'HandleEvents')
bindevent(_vfp.hWnd, WM_DEVICECHANGE, This, 'HandleEvents')
bindevent(_vfp.hWnd, WM_USER_SHNOTIFY, This, 'HandleEvents')

* ÁôÂà VFP ¥Dµøµ¡¥H«K§ó²M·¡ªº¬Ý¨ì±µ¤U¨Ó·|µo¥Í¤°»ò
_screen.Visible = .F.

HandleEvents ¤èªkµ{§Ç³B²z¤wµù¥U¤Fªº¨Æ¥ó¡C¥¦¨Ï¥Î¤@­Ó CASE ±Ô­z¨Ó§P©wµo¥Í¤F­þ­Ó¨Æ¥ó¡A¨Ã¬Û¹ïÀ³ªº§ó·s¦bªí³æ¤Wªºª¬ºA¼ÐÅÒªº Caption¡C¯S©wªº¨Æ¥óÃþ«¬¦³µÛ¥Ñ wParam °Ñ¼Æ¼ÐÃѪº¡u¤l¨Æ¥ó¡v¡F³o¬O¥Î¨Ó·Ç½Tªº§P©wµo¥Í¤F¤°»ò¨Æ¥ó¥Îªº¡C¨Ò¦p¡A·í¤@­Ó WM_ACTIVATE ¨Æ¥óµo¥Íªº®É­Ô¡AwParam «ü¥Xµøµ¡¥Ø«e¬O±Ò°Ê¤FªºÁÙ¬O¨S¦³±Ò°Ê¡B¥H¤Î±Ò°Êªºµo¥Í¬O§_¬O¥Ñ¥ô°È¤Á´«¡]¨Ò¦p¨Ï¥ÎªÌ«ö¤U¤F Alt+Tab¡^©ÎªÌ¦bµøµ¡¤W«ö¤@¤U¦Ó¾É­Pªº¡C
³B²z¦Û©w¸qªº Shell ¨Æ¥ó­n¤ñ¨ä¥¦¨Æ¥ó½ÆÂø¤@¨Ç¡C¦b³o­Ó®×¨Ò¤¤¡AlParam ¥Î¨ÓÃѧO¥X¨Æ¥ó¡A¦Ó wParam «h¥]§tµÛ¤@­Ó°O¾ÐÅé¦ì§}¡A¸Ó¦ì§}«ü¦Vªº¬O¥Î©óªí¥Ü³Q´¡¤J©ÎªÌ²¾°£ªºÅX°Ê¾¹ªº¸ô®|¡CµM«á¡ASYS(2600)³Q¥Î¨Ó±q¦ì§}¤¤«þ¨©¥X¦ì§}©Ò«ü¦Vªº°O¾ÐÅ餤ªº­È¡A¦Û©w¸qªº BinToInt ¤èªkµ{§Ç¡]µ{¦¡½X³oùبS¦³©ñ¥X¨Ó¡^§â³o­Ó­ÈÂà´«¦¨¤@­Ó¾ã¼Æ«¬ºA¡A¦Ó Windows API ¨ç¼Æ SHGetPathFromIDList «h±q³o­Ó¾ã¼Æ«¬ºA¤¤´£¨ú¥X¯u¥¿ªº¸ô®|¡C³Ì«á¡A³o­Ó¤èªkµ{§Ç©I¥s HandleWindowsMessage ¤èªkµ{§Ç¡A«áªÌ²³æªº©I¥s CallWindowsProc ¨ÓÀò±o±`³Wªº¨Æ¥ó³B²z¦æ¬°¡C³oùجO HandleEvents ªºµ{¦¡½X¡G

lparameters hWnd, ;
Msg, ;
wParam, ;
lParam
local lcCaption, ;
lnParm, ;
lcPath

do case
* ³B²z¤@­Ó activate ©ÎªÌ deactivate ¨Æ¥ó
case Msg = WM_ACTIVATE
do case
* ³B²z¤@­Ó deactivate ¨Æ¥ó
case wParam = WA_INACTIVE
This.lblStatus.Caption = 'Window deactivated'
* ³B²z¤@­Ó activate ¨Æ¥ó (¥ô°È¤Á´«©ÎªÌ¦b¼ÐÃDÄæ¤W«ö¤@¤U¡^
case wParam = WA_ACTIVE
This.lblStatus.Caption = ;
'µøµ¡±Ò°Ê (¥ô°È¤Á´«)'
* ³B²z¤@­Ó activate ¨Æ¥ó (¦bµøµ¡ªº¨Ï¥ÎªÌºÝ°Ï°ì«ö¤@¤U).
case wParam = WA_CLICKACTIVE
This.lblStatus.Caption = ;
'µøµ¡±Ò°Ê («ö¤@¤U)'
endcase

* ³B²z¤@­Ó³]³Æ§ó°Ê¨Æ¥ó
case Msg = WM_DEVICECHANGE
do case
case wParam = DBT_DEVNODES_CHANGED
This.lblStatus.Caption = 'DevNodes ¤wÅÜ°Ê'
case wParam = DBT_DEVICEARRIVAL
This.lblStatus.Caption = '³]³Æ¼W¥['
case wParam = DBT_DEVICEREMOVECOMPLETE
This.lblStatus.Caption = '³]³Æ²¾°£ ' + ;
'§¹¦¨'
endcase
* ³B²z¤@­Ó¦Û©w¸q shell ³qª¾¨Æ¥ó
case Msg = WM_USER_SHNOTIFY
do case
case lParam = SHCNE_DRIVEADD
lcCaption = 'ÅX°Ê¾¹¤w¼W¥['
case lParam = SHCNE_DRIVEREMOVED
lcCaption = 'ÅX°Ê¾¹³Q²¾°£'
case lParam = SHCNE_MEDIAINSERTED
lcCaption = '´CÅé¤w´¡¤J'
case lParam = SHCNE_MEDIAREMOVED
lcCaption = '´CÅé¤w²¾°£'
endcase

lnParm = This.BinToInt(sys(2600, wParam, 4))
lcPath = space(270)
SHGetPathFromIDList(lnParm, @lcPath)
lcPath = left(lcPath, at(chr(0), lcPath) - 1)
This.lblStatus.Caption = lcCaption + ': ' + lcPath
endcase
return This.HandleWindowsMessage(hWnd, Msg, wParam, ;
lParam)

°õ¦æ³o­Óªí³æ¡AµM«á¹³¤¶²Ð¤¤«ü¥Xªº¨º¼Ë¦b¨ä¥¦µøµ¡©ÎªÌ®à­±¤W«ö¤@¤U¦A¦^¨ìªí³æ¤W¥HÅã¥Ü±Ò°Ê©M¤Ï±Ò°Ê¨Æ¥ó¡C´¡¤J©ÎªÌ²¾°£¤@­Ó¬YºØÃþ«¬ªº¥i²¾°ÊÅX°Ê¾¹¡A¤ñ¦p¤@­Ó USB ÅX°Ê¾¹©ÎªÌ¤@­Ó¼Æ¦ì¬Û¾÷¡A¥HÁA¸Ñ¨Æ¥óªºµo¥Í±¡ªp¡C
¦b¸Óªí³æ¤¤ªº³oÃþµ{¦¡½X¦³´X­Ó¹ê¥Îªº¥Î³~¡C¨Ò¦p¡A§Ú¦b¥»¤å«e­±´£¨ìªº GoldMin ´¡¥ó²{¦b¥i¥H¦b±µ¦¬¨ì¤@­Ó Activate ¨Æ¥óªº®É­Ô§ó·s¦Û¤v¤F¡C·í§Ú§â§Úªº±a¦³¤@­Ó USB ©µªø½uªº¼Æ¦ì¬Û¾÷³s±µ¨ì§Úªº¹q¸£¤Wªº®É­Ô¡A¼Æ¦ì¬Û¾÷¦Û±aªº³nÅé´N·|¼u¥Xµøµ¡´£¥Ü§Ú¥h¤U¸ü·Ó¤ù¡C¤@­Ó VFP ©Ð¦a²£©ÎªÌÂå¾Ç¹Ï¹³À³¥Îµ{¦¡¥i¥H¹ï«Ø¿v©ÎªÌ¶Ë¤fªº·Ó¤ù°µ¨ìÃþ¦üªº¨Æ±¡¡C

¨ä¥¦¥Î³~

³sµ² Windows ¨Æ¥óÁÙ¦³¤j¶q¨ä¥¦ªº¥Î³~¡C¨Ò¦p¡A§A¥i¥H¦b¯S©wªº±ø¥ó¤U¡]¤ñ¦p¤@­Ó­«­nªº¶iµ{©|¥¼§¹¦¨¡^ªý¤î Windows Ãö¾÷¡C¦b¨º¼Ëªº±¡ªp¤U¡A§A³Ì¦n³sµ²¨ì WM_POWERBROADCAST °T®§¡A¨Ã¥B¦b¤£À³Ãö¾÷ªº®É­Ô¶Ç¦^ BROADCAST_QUERY_DENY¡C
§Ú¥Î Microsoft Money ¨ÓºÞ²z§Úªº®a®x°]°È¡A·í§Ú±q»È¦æ¤U¸ü¤F¤@­Ó±b³æªº®É­Ô¡AMoney¥ß¨è´N·|ª¾¹D¨Ã¥BÅã¥Ü¬Û¹ïÀ³ªº¹ï¸Ü¤è¶ô¡A§Ú«Ü³ßÅw³oºØ¥\¯à¡C³oÃþ§Oªº¦æ¬°²{¦b¦b VFP À³¥Îµ{¦¡¤¤¤]¯à°÷°µ¨ì¤F¡F²{¦b¡A§AªºÀ³¥Îµ{¦¡¤£¦A»Ý­n¤£°±ªº¥hÀˬd¤@­Ó¸ô®|¥H·d²M¬O§_¼W¥[¡]©ÎªÌ´î¤Ö¡B­«©R¦W¡^¤F¤@­ÓÀɮסA³oºØ¨Æ±¡¤@µo¥Í¡A§AªºÀ³¥Îµ{¦¡´N·|³Q³qª¾¡A±q¦Ó°µ¥X¬Û¹ïÀ³ªº¤ÏÀ³¡C
µ²½×
¤ä´© Windows ¨Æ¥ó³sµ²¬OVFP¤@­Ó¥O¤HÃø¥H¸m«Hªº¼W±j¡A¥¦Åý§A¥i¥H±¾¹_¨ìµo¥Í¦b Windows ¤¤ªº¥ô¦ó¨Æ±¡¡C¬JµM VFP ªÀ¸s¤w¸g¶}©l¬ã¨s¥¦ªº¯à¤O¤F¡A¨º»ò§Ú´Á«ÝµÛ¬Ý¨ì¥¦ªº§ó»Åªº¥Îªk¡C

¤U¸üÀɮסG501HENNIG.ZIP

_________________
§Æ±æ¦³§ó¦h¤H¨Ó°Ñ»P
VFP wiki - »Ý­n¤j®a¤@°_§¹¦¨ªºVFP¹q¤l®Ñ»PFAQ
¦^³»ºÝ
À˵ø·|­û­Ó¤H¸ê®Æ µo°e¨p¤H°T®§ µo°e¹q¤l¶l¥ó MSN Messenger
±q¤§«eªº¤å³¹¶}©lÅã¥Ü:   
µoªí·s¥DÃD   ¦^ÂÐ¥DÃD    VFP ·R¥ÎªÌªÀ°Ï ­º­¶ -> VFP °Q½×°Ï ©Ò¦³ªº®É¶¡§¡¬° ¥x¥_®É¶¡ (GMT + 8 ¤p®É)
²Ä1­¶(¦@1­¶)

 
«e©¹:  
±z µLªk ¦b³o­Óª©­±µoªí¤å³¹
±z µLªk ¦b³o­Óª©­±¦^ÂФ峹
±z µLªk ¦b³o­Óª©­±½s¿è¤å³¹
±z µLªk ¦b³o­Óª©­±§R°£¤å³¹
±z µLªk ¦b³o­Óª©­±¶i¦æ§ë²¼
±z µLªk ¦b³o­Óª©­±ªþ¥[ÀÉ®×
±z µLªk ¦b³o­Óª©­±¤U¸üÀÉ®×


Powered by phpBB © 2001, 2005 phpBB Group
¥¿Å餤¤å»y¨t¥Ñ phpbb-tw ºûÅ@»s§@