Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
HWND from DEFINE POPUP?
Message
Information générale
Forum:
Visual FoxPro
Catégorie:
Gestionnaire de menu & Menus
Versions des environnements
Visual FoxPro:
VFP 9 SP1
OS:
Windows XP SP2
Network:
Windows NT
Database:
MS SQL Server
Divers
Thread ID:
01228880
Message ID:
01229960
Vues:
15
With pleasure :).

Run this code (VFP9 is required); it inserts a custom object in _SCREEN and returns immediately.

Then open VFP main menu. You will notice active menu popup's HWINDOW and HDC displayed on the screen upon each WM_DRAWITEM message received by application.hWnd -- this particular window hosts VFP main menu.
CLEAR
CLEAR ALL

WITH _screen
	.AddObject("menulistener", "TMenuListener")
	.menulistener.SetHook
ENDWITH

DEFINE CLASS TMenuListener As Custom
#DEFINE GWL_WNDPROC -4
#DEFINE GWL_EXSTYLE -20
#DEFINE WM_DRAWITEM 0x002B
	hOrigProc=0
	hWindow=0

PROCEDURE Init
	THIS.declare

PROCEDURE Destroy
	THIS.ReleaseHook

PROCEDURE SetHook
	THIS.ReleaseHook
	THIS.hWindow = application.hWnd
	THIS.hOrigProc = GetWindowLong(THIS.hWindow, GWL_WNDPROC)
	= BINDEVENT(THIS.hWindow, WM_DRAWITEM, THIS, "OnWindowProc")

PROCEDURE ReleaseHook
	= UNBINDEVENTS(THIS.hWindow)
	THIS.hOrigProc=0

PROCEDURE OnWindowProc(hWindow, nMsgID, wParam, lParam)
	LOCAL nReturn

	IF nMsgID=WM_DRAWITEM
		THIS.OnMenuDraw(m.lParam)
	ENDIF

	nReturn = CallWindowProc(THIS.hOrigProc, THIS.hWindow,;
		m.nMsgID, m.wParam, m.lParam)
RETURN m.nReturn

PROCEDURE OnMenuDraw(hDrawItemStruct)
	LOCAL cBuffer, nItemAction, hDC, hPopupWindow

	cBuffer = REPLICATE(CHR(0),48)
	= MemToStr(@cBuffer, hDrawItemStruct, LEN(cBuffer))

	hDC = buf2dword(SUBSTR(cBuffer,25,4))
	hPopupWindow = WindowFromDC(m.hDC)
	
	ACTIVATE SCREEN
	? hDC, hPopupWindow

PROCEDURE declare
	DECLARE INTEGER WindowFromDC IN user32 INTEGER hDC

	DECLARE INTEGER GetWindowLong IN user32;
		INTEGER hWindow, INTEGER nIndex

	DECLARE INTEGER CallWindowProc IN user32;
		INTEGER lpPrevWndFunc, INTEGER hWindow, LONG Msg,;
		INTEGER wParam, INTEGER lParam

	DECLARE RtlMoveMemory IN kernel32 As MemToStr;
		STRING @Dest, INTEGER Src, INTEGER nLength

ENDDEFINE

FUNCTION buf2dword(lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
	BitLShift(Asc(SUBSTR(lcBuffer, 2,1)),  8) +;
	BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
	BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform