JD2022-TU1/main/extern/Camcam/LIBS/Input/Browser.cpp

394 lines
9.1 KiB
C++

//#define _WIN32_WINNT 0x500
#include <windows.h>
#include <winuser.h>
#include "SCENE.h"
#include "MEDIA.h"
#ifdef ONLINE_MODE
#include "account.h"
extern CCamCamAccount Account;
#endif
//#pragma optimize("",off)
#define UPDATE_ONFOCUS 50
#define UPDATE_NOFOCUS 50
class BROWSER_Grabber:public INPUT_IO
{
public:
RECT WR;
u32 IsFocused;
u32 LastUpDate;
WORLD *pWorld;
u32 RealDX,RealDY;
HWND TrackedWindow;
int INIT (class WORLD*){return 0;};
int FRAME (void);
int END (void)
{
return 0;
};
IOTYPE GetType() {return IOtype_BROWSER;};
void SendMouseInfo(s32 X,s32 Y,s32 Button);
};
typedef struct MyMessage_
{
UINT Msg;
LPARAM lParam;
WPARAM wParam;
s32 PX,PY;
} MyMessage;
typedef BOOL (_stdcall *tPrintWindow)( HWND, HDC,UINT);
tPrintWindow pPrintWindow =0;
static u32 Depth = 0;
BOOL CALLBACK myChildProc2(HWND hwnd, LPARAM lParam)
{
MyMessage *pmm;
if (Depth < 20)
{
Depth++;
EnumChildWindows(hwnd,myChildProc2,lParam);
Depth--;
}
pmm = (MyMessage *)lParam;
if (pmm->Msg)
{
extern BOOL GetWindowClientRect(HWND wnd, RECT *clientRect);
RECT ClienRect;
POINT CArea;
CArea.x = pmm->PX;
CArea.y = pmm->PY;
GetWindowClientRect(hwnd,&ClienRect);
if ((CArea.x > ClienRect.left) && (CArea.y > ClienRect.top) &&
(CArea.x < ClienRect.right) && (CArea.y < ClienRect.bottom))
{
if (pmm->lParam == -1)
{
ScreenToClient(hwnd,(POINT *)&CArea);
PostMessage(hwnd, pmm->Msg, pmm->wParam, MAKELONG(CArea.x, CArea.y));
pmm->Msg = 0;
return false;
}
}
if (pmm->lParam == 0)
SendMessage(hwnd, pmm->Msg, pmm->wParam, pmm->lParam);
}
return true;
}
BOOL CALLBACK myChildProc3(HWND hwnd, LPARAM lParam)
{
SetScrollPos( hwnd, SB_VERT, 0, true);
return true;
}
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
if (Depth < 3)
{
Depth++;
EnumChildWindows(hwnd,EnumChildProc,lParam);
Depth--;
}
if (lParam == 0)
{
//InvalidateRect( hwnd, NULL, TRUE) ;
//UpdateWindow( hwnd) ;
} else
{
/* InvalidateRect( hwnd, NULL, TRUE) ;
UpdateWindow( hwnd) ;//*/
SendMessage(hwnd, WM_PRINT, (WPARAM)lParam ,
PRF_CHILDREN +
PRF_CLIENT +
PRF_NONCLIENT+
PRF_ERASEBKGND +
//PRF_OWNED +
//PRF_CHECKVISIBLE +
0);//*/
}
return true;
}
int Update(BROWSER_Grabber *Ret,WORLD *pScene)
{
RECT WR2;
u32 Update = 0;
DWORD time = timeGetTime();
if (pPrintWindow == 0)
{
HINSTANCE handle = ::GetModuleHandle("user32.dll");
if ( handle == 0 )
handle = ::LoadLibrary("User32.dll");
if (handle)
pPrintWindow = (tPrintWindow)::GetProcAddress(handle,"PrintWindow");
}
//Account._WebBrowser->navigate("www.globulos.com");
if (Ret->TrackedWindow == NULL) return 0;
RECT MastRect;
GetWindowRect(Ret->TrackedWindow,&MastRect);
WR2 = MastRect;
WR2.right = WR2.right - WR2.left;
WR2.bottom = WR2.bottom - WR2.top;
if (pScene->OwnerHwnd == GetFocus())
Ret->IsFocused = 1;
else
Ret->IsFocused = 0;
if (Ret->IsFocused && (time - Ret->LastUpDate) > UPDATE_ONFOCUS)
Update = 1;
if (!Ret->IsFocused && (time - Ret->LastUpDate) > UPDATE_NOFOCUS)
Update = 1;
if (memcmp(&WR2,&Ret->WR,sizeof(RECT)) || Update)
{
Ret->LastUpDate = time;
Ret->WR = WR2;
Ret->Image.PITCH = Ret->Image.SX = Ret->RealDX;
Ret->Image.SY = Ret->RealDY;
if ((Ret->WR.right != Ret->Image.SX) ||
(Ret->WR.bottom != Ret->Image.SY))
{
if (Ret->Image.BASE) CC_free(Ret->Image.BASE);
Ret->Image.PITCH = Ret->Image.SX = Ret->WR.right;
Ret->Image.SY = Ret->WR.bottom;
Ret->RealDX = Ret->Image.SX;
Ret->RealDY = Ret->Image.SY;
Ret->Image.BASE = (s32*)CC_malloc(Ret->RealDX * Ret->RealDY * 4);
if (Ret->ulAssociatedTextureIndex != -1) pScene->DI->DestroyTexture(Ret->ulAssociatedTextureIndex);
Ret->ulAssociatedTextureIndex = -1;
} else
{
// Just a Move is detected
}
HDC hDC = GetDC(Ret->TrackedWindow);
HDC hDCMem = CreateCompatibleDC(hDC);
HBITMAP hBmp = CreateCompatibleBitmap(hDC, GetDeviceCaps(hDC, HORZRES), GetDeviceCaps(hDC, VERTRES));
ReleaseDC(Ret->TrackedWindow, hDC);
HGDIOBJ hOld = SelectObject(hDCMem, hBmp);
bool res = false;
if (pPrintWindow)
{
res = pPrintWindow(Ret->TrackedWindow, hDCMem, 0);
}
if (!res)
{
EnumChildWindows(Ret->TrackedWindow,EnumChildProc,(WPARAM)hDCMem);
SendMessage(Ret->TrackedWindow, WM_PRINT, (WPARAM)hDCMem ,
PRF_CHILDREN +
PRF_CLIENT +
//PRF_NONCLIENT+
//PRF_ERASEBKGND +
//PRF_OWNED +
//PRF_CHECKVISIBLE +
0);//*/
}
BITMAPINFOHEADER bi;
memset(&bi, 0,sizeof(BITMAPINFOHEADER));
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Ret->Image.SX;
bi.biHeight = Ret->Image.SY;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
GetDIBits ( hDCMem, hBmp, 0,Ret->Image.SY, Ret->Image.BASE,(BITMAPINFO*)&bi, DIB_RGB_COLORS);
SelectObject(hDCMem, hOld );
if (hDCMem) DeleteObject(hDCMem);
if (hBmp) DeleteObject(hBmp);
/* Sub Window Resize */
u32 Xb,Yb,Xs,Ys;
s32 *SRC,*SRCLast,*DST;
RECT CltRect;
POINT CArea;
GetClientRect(Ret->TrackedWindow, &CltRect);
CArea.x = 0;
CArea.y = 0;
ClientToScreen(Ret->TrackedWindow,(POINT *)&CArea);
Xs = CltRect.right - CltRect.left;
u32 Counter = Ys = CltRect.bottom - CltRect.top;
Xb = CArea.x - MastRect.left;
Yb = Ret->Image.SY - Ys - (CArea.y - MastRect.top) ;
if ((u32)((u32)Yb + (u32)Ys) >= (u32)Ret->Image.SY)
{
Yb = 0;
Counter = Ys = Ret->Image.SY;
}
if ((u32)Xb + (u32)Xs >= (u32)Ret->Image.SX)
{
Xb = 0;
Xs = Ret->Image.SX;
}
SRC = ((s32*)Ret->Image.BASE) + Xb + Yb * Ret->Image.PITCH;
DST = ((s32*)Ret->Image.BASE);
while (Counter--)
{
SRCLast = SRC + Xs;
while (SRC<SRCLast)
{
*(DST++) = *(SRC++);
}
SRC += Ret->Image.PITCH - Xs;
}
Ret->Image.PITCH = Ret->Image.SX = Xs;
Ret->Image.SY = Ys;//*/
if (Ret->ulAssociatedTextureIndex == -1)
Ret->ulAssociatedTextureIndex = pScene->DI->CreateTexture(&Ret->Image,Ret->ulColorMode);
return 1;
}
return 0;
}
int BROWSER_Grabber::FRAME (void)
{
return Update(this,pWorld);
}
//SendInput
u32 BROWSER_MouseSend(INPUT_IO *pBRO,s32 MX,s32 MY,s32 MouseButton)
{
if (pBRO && (pBRO->GetType() == IOtype_BROWSER))
{
BROWSER_Grabber *pBrowser;
pBrowser = (BROWSER_Grabber*)pBRO;
if (pBrowser->TrackedWindow)
{
MyMessage mmm;
static u32 LastMB = 0;
POINT P;
HWND AcW = pBrowser->TrackedWindow;//Account._WebBrowser->GetActiveXWindow();
/* AcW = Account._WebBrowser->GetOwnWindow();
AcW = Account._WebBrowser->GetOwnWindow();*/
P.x = MX;
P.y = MY;
ClientToScreen(AcW,&P);
//AcW = WindowFromPoint(P);
// AcW = ChildWindowFromPoint(AcW,P);
char String[255];
GetWindowText(AcW, String, sizeof(String));
// SetCapture(pBrowser->pWorld->OwnerHwnd);
if ((MouseButton != 1) && (MouseButton != 0))
{
mmm.Msg = WM_VSCROLL;
mmm.wParam = MouseButton>0?SB_LINEUP:SB_LINEDOWN;
mmm.lParam = 0;
mmm.PX = P.x;
mmm.PY = P.y;
myChildProc2(AcW,(LPARAM)&mmm);
//EnumChildWindows(AcW,myChildProc2,(LPARAM)&mmm);
} else
if (MouseButton /*&& (!LastMB)*/)
{
// SendMessage(AcW, WM_ACTIVATE, WA_ACTIVE , 0);
mmm.Msg = WM_LBUTTONDOWN;
mmm.wParam = MK_LBUTTON;
mmm.lParam = -1;
mmm.PX = P.x;
mmm.PY = P.y;
myChildProc2(AcW,(LPARAM)&mmm);
/* } else
if (!MouseButton && LastMB)
{//*/
//EnumChildWindows(AcW,myChildProc2,(LPARAM)&mmm);
mmm.Msg = WM_LBUTTONUP;
mmm.wParam = MK_LBUTTON;
mmm.lParam = -1;
mmm.PX = P.x;
mmm.PY = P.y;
myChildProc2(AcW,(LPARAM)&mmm);
//EnumChildWindows(AcW,myChildProc2,(LPARAM)&mmm);//*/
} else
{
mmm.Msg = WM_MOUSEMOVE;
mmm.wParam = LastMB ? MK_LBUTTON : 0;
mmm.lParam = -1;
mmm.PX = P.x;
mmm.PY = P.y;
myChildProc2(AcW,(LPARAM)&mmm);
//EnumChildWindows(AcW,myChildProc2,(LPARAM)&mmm);
}//*/
LastMB = MouseButton;
}
}
return 0;
}
HWND ExtPicker;
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
DWORD dwThreadId, dwProcessId;
HINSTANCE hInstance;
char String[255];
if (!hWnd)
return TRUE; // Not a window
if (!IsWindowVisible(hWnd))
return TRUE; // Not visible
if (!SendMessage(hWnd, WM_GETTEXT, sizeof(String), (LPARAM)String))
return TRUE; // No window title
if (GetWindowText(hWnd, String, sizeof(String)))
{
//if (strcmp(String,"Google - Mozilla Firefox") == 0)
if (strcmp(String,"Calculatrice") == 0)
ExtPicker = hWnd;
}
return TRUE;
}
INPUT_IO *BROWSER_CREATE(WORLD *pScene,char *Filename)
{
u32 SX,SY;
INPUT_IO *Ret;
Ret = (INPUT_IO *)new(BROWSER_Grabber);
((BROWSER_Grabber*)Ret)->pWorld = pScene;
((BROWSER_Grabber*)Ret)->TrackedWindow = NULL;//Account._WebBrowser->GetActiveXWindow();
pScene->SkipFunctions |= SKIP_TRACKER;
/*ExtPicker = NULL;
EnumWindows(EnumWindowsProc, NULL);
if (ExtPicker) ((BROWSER_Grabber*)Ret)->TrackedWindow = ExtPicker;
*/
//Account._WebBrowser->navigate("www.globulos.com");
//ShowWindow( ((BROWSER_Grabber*)Ret)->TrackedWindow , SW_HIDE);
Ret->dTotalTime = 0;
Ret->dAvgFramePerSecond = 30.0;
Ret ->Image.BASE = NULL;
Ret->ulAssociatedTextureIndex = -1;
Update((BROWSER_Grabber*)Ret,pScene);
return (INPUT_IO *)Ret;
};