9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2010-2011 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <windows.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define Assert(_m) do {} while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define vboxVDbgPrint(_m) do {} while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic LRESULT CALLBACK WindowProc(HWND hwnd,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync UINT uMsg,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WPARAM wParam,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LPARAM lParam
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(uMsg == WM_DESTROY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PostQuitMessage(0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// switch(uMsg)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// case WM_CLOSE:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// vboxVDbgPrint((__FUNCTION__": got WM_CLOSE for hwnd(0x%x)", hwnd));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// return 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// case WM_DESTROY:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// vboxVDbgPrint((__FUNCTION__": got WM_DESTROY for hwnd(0x%x)", hwnd));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// return 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// case WM_NCHITTEST:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// vboxVDbgPrint((__FUNCTION__": got WM_NCHITTEST for hwnd(0x%x)\n", hwnd));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// return HTNOWHERE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DefWindowProc(hwnd, uMsg, wParam, lParam);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXDISPWND_NAME L"tstMvWnd"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT tstMvWndCreate(DWORD w, DWORD h, HWND *phWnd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HRESULT hr = S_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Register the Window Class. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WNDCLASS wc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!GetClassInfo(hInstance, VBOXDISPWND_NAME, &wc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync wc.style = CS_OWNDC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync wc.lpfnWndProc = WindowProc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync wc.cbClsExtra = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync wc.cbWndExtra = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync wc.hInstance = hInstance;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync wc.hIcon = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync wc.hCursor = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync wc.hbrBackground = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync wc.lpszMenuName = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync wc.lpszClassName = VBOXDISPWND_NAME;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!RegisterClass(&wc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DWORD winErr = GetLastError();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrint((__FUNCTION__": RegisterClass failed, winErr(%d)\n", winErr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hr = E_FAIL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hr == S_OK)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HWND hWnd = CreateWindowEx (0 /*WS_EX_CLIENTEDGE*/,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXDISPWND_NAME, VBOXDISPWND_NAME,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WS_OVERLAPPEDWINDOW,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0, 0,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync w, h,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync GetDesktopWindow() /* hWndParent */,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NULL /* hMenu */,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hInstance,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NULL /* lpParam */);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(hWnd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hWnd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *phWnd = hWnd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DWORD winErr = GetLastError();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVDbgPrint((__FUNCTION__": CreateWindowEx failed, winErr(%d)\n", winErr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hr = E_FAIL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return hr;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic int g_Width = 400;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic int g_Height = 300;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic DWORD WINAPI tstMvWndThread(void *pvUser)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HWND hWnd = (HWND)pvUser;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECT Rect;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOL bRc = GetWindowRect(hWnd, &Rect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(bRc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = SetWindowPos(hWnd, HWND_TOPMOST,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0, /* int X */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0, /* int Y */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync g_Width, //Rect.left - Rect.right,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync g_Height, //Rect.bottom - Rect.top,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync SWP_SHOWWINDOW);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(bRc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bRc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int dX = 10, dY = 10;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int xMin = 5, xMax = 300;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int yMin = 5, yMax = 300;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int x = dX, y = dY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRc = SetWindowPos(hWnd, HWND_TOPMOST,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync x, /* int X */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync y, /* int Y */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync g_Width, //Rect.left - Rect.right,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync g_Height, //Rect.bottom - Rect.top,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync SWP_SHOWWINDOW);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync x += dX;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (x > xMax)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync x = xMin;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync y += dY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (y > yMax)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync y = yMin;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Sleep(5);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while(1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint main(int argc, char **argv, char **envp)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HWND hWnd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HRESULT hr = tstMvWndCreate(200, 200, &hWnd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(hr == S_OK);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hr == S_OK)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HANDLE hThread = CreateThread(
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NULL /* LPSECURITY_ATTRIBUTES lpThreadAttributes */,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0 /* SIZE_T dwStackSize */,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync tstMvWndThread,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hWnd,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0 /* DWORD dwCreationFlags */,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NULL /* pThreadId */);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(hThread);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hThread)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync MSG msg;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync while (GetMessage(&msg, NULL, 0, 0))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync TranslateMessage(&msg);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DispatchMessage(&msg);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DestroyWindow (hWnd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// NOREF(hInstance); NOREF(hPrevInstance); NOREF(lpCmdLine); NOREF(nCmdShow);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return main(__argc, __argv, environ);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}