| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | #include "main.h"#include "./updateService.h"#include "./api.h"#include "../omBrowser/obj_ombrowser.h"#include "../omBrowser/ifc_omservice.h"#include "../omBrowser/browserPopup.h"#include "../omBrowser/browserHost.h"#ifndef LONGX86#ifdef _WIN64  #define LONGX86	LONG_PTR#else /*_WIN64*/  #define LONGX86	 LONG	#endif  /*_WIN64*/#endif // LONGX86#define SVCPOPUP_PROP		L"Winamp_UpdateSvcWndProp"typedef struct __SVCPOPUP{	UpdateService *service;	WNDPROC		originalProc;} SVCPOPUP;static LRESULT WINAPI ServicePopup_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);HRESULT ServiceSubclass_Attach(HWND hwnd, UpdateService *service){	SVCPOPUP *psp = (SVCPOPUP*)calloc(1, sizeof(SVCPOPUP));	if (NULL == psp) return E_OUTOFMEMORY;	psp->service = service;	if (NULL != service) service->AddRef();	psp->originalProc = (WNDPROC)(LONG_PTR)SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (LONGX86)(LONG_PTR)ServicePopup_WindowProc);	if (NULL == psp->originalProc || FALSE == SetPropW(hwnd, SVCPOPUP_PROP, psp))	{		if (NULL != psp->originalProc) 			SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (LONGX86)(LONG_PTR)psp->originalProc);				if (NULL != psp->service)			service->Release();		free(psp);		return E_FAIL;	}	return S_OK;}static void ServicePopup_Dettach(HWND hwnd, SVCPOPUP *psp){	RemovePropW(hwnd, SVCPOPUP_PROP);	if (NULL == psp) return;		if (NULL != psp->originalProc)		SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (LONGX86)(LONG_PTR)psp->originalProc);			if (NULL != psp->service)	{		psp->service->Finish();		psp->service->Release();	}	free(psp);}static void ServicePopup_OnBrowserNotify(HWND hwnd, UpdateService *service, NMHDR *pnmh){	switch(pnmh->code)	{		case NBHN_DOCUMENTREADY:			if (0 == (WS_VISIBLE & GetWindowLongPtrW(hwnd, GWL_STYLE)))				ShowWindowAsync(hwnd, SW_SHOWNORMAL);			break;	}}static LRESULT WINAPI ServicePopup_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){	SVCPOPUP *psp = (SVCPOPUP*)GetPropW(hwnd, SVCPOPUP_PROP);	if (NULL == psp || NULL == psp->originalProc)		return DefWindowProcW(hwnd, uMsg, wParam, lParam);	switch(uMsg)	{		case WM_NCDESTROY:		case WM_DESTROY:			{				WNDPROC proc = psp->originalProc;				ServicePopup_Dettach(hwnd, psp);				if (NULL != proc)					CallWindowProcW(proc, hwnd, uMsg, wParam, lParam);			}			return 0;		case WM_NOTIFY:			switch(wParam)			{				case 0x1000 /*IDC_BROWSER*/:					ServicePopup_OnBrowserNotify(hwnd, psp->service, (NMHDR*)lParam);					break;			}			break;	}	return CallWindowProcW(psp->originalProc, hwnd, uMsg, wParam, lParam);}
 |