|
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¸ü.
|
¤W¤@½g¥DÃD :: ¤U¤@½g¥DÃD |
µoªí¤H |
¤º®e |
¦¶¨|¿³
µù¥U®É¶¡: 2003-08-25 ¤å³¹: 661 ¨Ó¦Û: ¥x¤¤¥«¤j¨½°Ï
²Ä 1 ¼Ó
|
µ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¡Cq¤á³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¬On¯à°÷ÀË´ú¨ì¨Ï¥ÎªÌ¦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¦³¨Ì¾ap®É¾¹¨Ó¤£Â_ªºÀˬ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·Qn³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¡Cn¥Î³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Óµ{¦¡¤§«en¥ý¦b§A·Qn´ú¸Õªºµøµ¡ªº¼ÐÃ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ÓÃþ§On¥Î¨ìªº 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¨º¨Ç·Qnµ¹ 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¥sn¨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),
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 |
|
¦^³»ºÝ |
|
|
|
|
±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§@
|