virtdisp.cpp

来自「老外的一个开源项目」· C++ 代码 · 共 1,089 行 · 第 1/3 页

CPP
1,089
字号
// Copyright (c) David Vescovi.  All rights reserved.
// Part of Project DrumStix
// Windows Embedded Developers Interest Group (WE-DIG) community project.
// http://www.we-dig.org
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//  virtdisp.cpp : Defines the entry point for the application.
//


#include "windows.h"
#include "virtdisp.h"
#include "resource.h"
#include <ras.h>
#include <winsock.h>

#define MY_SOCK_PORT 987
#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE			v_hInst;					// The current instance
HWND				v_hWnd;
HWND				v_hHelpWnd;
HICON				v_hNotifyIcon;
DWORD				v_dwRefreshTime = 100;
DWORD				v_dwAllowRemote;
DWORD				dwSockPort = MY_SOCK_PORT;
TCHAR				v_szHostname[256] = TEXT("PPP_PEER");
DWORD				dwSkip = 0, dwTotal = 0;
DWORD				cXScreen = 240, cYScreen = 320, cScreenDepth = 16;
SOCKET				Sock = INVALID_SOCKET;
HANDLE				v_hInputThread = INVALID_HANDLE_VALUE;
HANDLE				v_hConnectThread = INVALID_HANDLE_VALUE;
VIRTDISPINFO		v_Info;
BOOL				v_fSingleTap;
BOOL				v_fPaletteChanged;

// Forward declarations of functions included in this code module:
ATOM				MyRegisterClass	(HINSTANCE, LPTSTR);
BOOL				InitInstance	(HINSTANCE, int);
LRESULT CALLBACK	WndProc			(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	AboutDlg		(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	ConnectDlg		(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	SettingsDlg		(HWND, UINT, WPARAM, LPARAM);
DWORD ShowErr (TCHAR *pszFormat, ...);
BOOL IsActiveSyncConnected(void);

#define IDM_TASKBAR_NOTIFY  (WM_USER + 200)
#define IDM_CHK_STAT		(WM_USER + 201)


#define DEBUG_FLAG	0

void
ParseCmdLine (LPTSTR lpCmdLine)
{
    int Len;

    while (lpCmdLine && (TEXT('\0') != *lpCmdLine)) {
        // Skip over spaces
        while ((TEXT(' ') == *lpCmdLine) || (TEXT('\t') == *lpCmdLine)) {
            lpCmdLine++;
        }
        if (TEXT('\0') == *lpCmdLine) {
            break;
        }
        if ((TEXT('-') == *lpCmdLine) || (TEXT('/') == *lpCmdLine)) {
            lpCmdLine++;
            switch (*lpCmdLine) {
            case TEXT('c') :
            case TEXT('C') :
                // Auto-Connect
                SendMessage (v_hWnd, WM_COMMAND, ID_TOOLS_CONNECT, 0);
                break;
            case TEXT('h') :
            case TEXT('H') :
                // Set Hostname
                lpCmdLine++;
                // Skip optional spaces
                while ((TEXT(' ') == *lpCmdLine) || (TEXT('\t') == *lpCmdLine)) {
                    lpCmdLine++;
                }
                for (Len=0; (TEXT('\0') != lpCmdLine[Len]) && (TEXT(' ') != lpCmdLine[Len]) && (TEXT('\t') != lpCmdLine[Len]); Len++) {
                    Len++;
                }
                if (Len < (sizeof(v_szHostname)/sizeof(v_szHostname[0]))) {
                    _tcsncpy (v_szHostname, lpCmdLine, Len);
                    v_szHostname[Len] = TEXT('\0');
                    RETAILMSG (1, (TEXT("Setting Hostname to '%s'\r\n"), v_szHostname));
                }
                lpCmdLine += Len;
                break;
            default :
                ShowErr (TEXT("Invalid cmdline switch '%s'"), lpCmdLine);
                lpCmdLine = NULL;
                break;              
            }
        } else {
            ShowErr (TEXT("Invalid cmdline arg '%s'"), lpCmdLine);
            break;
        }
    }
}

int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{
	int			Status;
	MSG msg;
	OSVERSIONINFO	OSVersionInfo;
	TCHAR		szParamInfo[256];
	WSADATA		wsaData;
	WORD		wVersionRequested;

	wVersionRequested = MAKEWORD(1,1);
	Status = WSAStartup (wVersionRequested, &wsaData);
	if (Status != 0) {
		ShowErr (TEXT("WSAStartup call failed!!, Error %d\r\n"), WSAGetLastError());
		return -1;
	}
    
	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow)) {
		return FALSE;
	}

	if (0 == wcsncmp((L"PPP_PEER"),v_szHostname,255))
	{
		RETAILMSG(1, (L"Waiting for ActiveSync connection...\r\n"));
		while (FALSE == IsActiveSyncConnected())
		{
			Sleep(1000);		// wait for ActiveSync to connect
		}
		Sleep(2000);			// really connect good
	}
	RETAILMSG(1, (L"Virtual Display startup!\r\n"));

	cXScreen = GetSystemMetrics(SM_CXSCREEN);
	cYScreen = GetSystemMetrics(SM_CYSCREEN);
	cScreenDepth = GetDeviceCaps (GetDC(NULL), BITSPIXEL);

	memset ((char *)&v_Info, 0, sizeof(v_Info));
	OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVersionInfo);
	GetVersionEx (&OSVersionInfo);
	v_Info.dwSize = sizeof(v_Info);
	v_Info.dwMagic = MAGIC_VERSION;
	v_Info.cXScreen = cXScreen;
	v_Info.cYScreen = cYScreen;
	v_Info.cScreenDepth = cScreenDepth;
	v_Info.dwMajorVersion = OSVersionInfo.dwMajorVersion;
	v_Info.dwMinorVersion = OSVersionInfo.dwMinorVersion;
	SystemParametersInfo (SPI_GETPLATFORMTYPE, sizeof(szParamInfo)/sizeof(TCHAR), szParamInfo, 0);
	WideCharToMultiByte (CP_ACP, 0, szParamInfo, -1, v_Info.szPlatformType, sizeof(v_Info.szPlatformType), NULL, NULL);
	SystemParametersInfo (SPI_GETOEMINFO, sizeof(szParamInfo)/sizeof(TCHAR), szParamInfo, 0);
	WideCharToMultiByte (CP_ACP, 0, szParamInfo, -1, v_Info.szOEMInfo, sizeof(v_Info.szOEMInfo), NULL, NULL);

//	ShowErr (TEXT("szPlatformType='%hs', szOEMInfo='%hs'\r\n"), v_Info.szPlatformType, v_Info.szOEMInfo);
	
	gethostname (v_Info.szDeviceName, sizeof(v_Info.szDeviceName));

#if 0    
    ParseCmdLine (lpCmdLine);
#else
//	if (!_tcscmp (lpCmdLine, TEXT("-c")))
//	{
		SendMessage (v_hWnd, WM_COMMAND, ID_TOOLS_CONNECT, 0);
//	}
#endif
	
	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0))  {
		if (msg.message == WM_CLOSE)
		{
			return 0;
		}
		if (!IsDialogMessage (v_hWnd, &msg)) {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return msg.wParam;
}

void
SaveRegSettings ()
{
	HKEY	hKey;
	DWORD	dwDisp;
	if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Drivers\\Display\\PXA255\\Config"), 0, NULL,
										REG_OPTION_NON_VOLATILE, 0, NULL, &hKey, &dwDisp)) {
		RegSetValueEx (hKey, TEXT("HostName"), 0, REG_SZ, (PBYTE)v_szHostname, (_tcslen(v_szHostname)+1)*sizeof(TCHAR));
		RegSetValueEx (hKey, TEXT("RefreshTime"), 0, REG_DWORD, (PBYTE)&v_dwRefreshTime, sizeof(DWORD));
		RegSetValueEx (hKey, TEXT("AllowRemote"), 0, REG_DWORD, (PBYTE)&v_dwAllowRemote, sizeof(DWORD));
		RegCloseKey (hKey);
	}
}

//
BOOL
InitInstance (HINSTANCE hInstance, int nCmdShow)
{
	DWORD	dwSize;
	DWORD	dwValue;
	TCHAR	szTempStr[256];

	v_hInst = hInstance;
	dwSize = sizeof(szTempStr);
	szTempStr[0] = TEXT('\0');
	RegQueryValueEx (HKEY_LOCAL_MACHINE, TEXT("HostName"), (LPDWORD)TEXT("Drivers\\Display\\PXA255\\Config"), NULL, (PBYTE)szTempStr, &dwSize);
	if (szTempStr[0]) {
		_tcscpy (v_szHostname, szTempStr);
	}
	dwSize = sizeof(dwValue);
	dwValue = 0;
	RegQueryValueEx (HKEY_LOCAL_MACHINE, TEXT("RefreshTime"), (LPDWORD)TEXT("Drivers\\Display\\PXA255\\Config"), NULL, (PBYTE)&dwValue, &dwSize);
	if (dwValue) {
		v_dwRefreshTime = dwValue;
	}
	dwValue = 0;
	RegQueryValueEx (HKEY_LOCAL_MACHINE, TEXT("Port"), (LPDWORD)TEXT("Drivers\\Display\\PXA255\\Config"), NULL, (PBYTE)&dwValue, &dwSize);
	if (dwValue) {
		dwSockPort = dwValue;
	}
	dwSize = sizeof(v_dwAllowRemote);
	RegQueryValueEx (HKEY_LOCAL_MACHINE, TEXT("AllowRemote"), (LPDWORD)TEXT("Drivers\\Display\\PXA255\\Config"), NULL, (PBYTE)&v_dwAllowRemote, &dwSize);

	v_hWnd = CreateDialog (hInstance, MAKEINTRESOURCE (IDD_MAINDIALOG), NULL, (DLGPROC)WndProc);

	if (v_hWnd) {
        ShowWindow( v_hWnd, SW_SHOW );
		UpdateWindow(v_hWnd);
	}
	
    return (NULL != v_hWnd);
}

DWORD
ShowErr (TCHAR *pszFormat, ...)
{
	va_list ArgList;
	TCHAR	szTemp[1024];
	
	va_start (ArgList, pszFormat);

	wvsprintf (szTemp, pszFormat, ArgList);

	return MessageBox (NULL, szTemp, TEXT("VIRTDisp"), MB_OK | MB_TOPMOST);
}

DWORD
DoInput (LPVOID lpArg)
{
	USHORT	Cmd;
	USHORT	MouseData[2];
	DWORD	dwFlags;
	TIMEVAL		timeout;
	fd_set		readfds;

	while (INVALID_SOCKET != Sock) {
		FD_ZERO (&readfds);
		FD_SET (Sock, &readfds);
		timeout.tv_sec = 20;
		timeout.tv_usec = 0;
		if (SOCKET_ERROR == select (1, &readfds, NULL, NULL, &timeout)) {
			DEBUGMSG (1, (TEXT("DoInput: Error %d from select\r\n"), WSAGetLastError()));
			break;
		}

		// Was there any data?
		if (!FD_ISSET(Sock, &readfds)) {
			continue;
		}		
		
		if (recv (Sock, (char *)&Cmd, sizeof(Cmd), 0) != sizeof(Cmd)) {
			DEBUGMSG (1, (TEXT("DoInput: Error %d reading cmd\r\n"), WSAGetLastError()));
			break;
		}
		switch (Cmd) {
			case 0 :
			case MOUSEEVENTF_LEFTDOWN :
			case MOUSEEVENTF_LEFTUP :
				if (recv (Sock, (char*)MouseData, sizeof(MouseData), 0) == sizeof(MouseData)) {
					// mouse_event() expects the coordinates in "touch coordinates"
					// so we multiply by 4
					mouse_event (MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | Cmd, MouseData[0] * 0xFFFF/ cXScreen, MouseData[1] * 0xFFFF/cYScreen, 0, 0);
//					ShowErr (TEXT("Mouse_event (0x%X, %d, %d, %d, %d)\r\n"), MOUSEEVENTF_MOVE | Cmd, MouseData[0] * 0xFFFF/ 240, MouseData[1] * 0xFFFF/320, 0, 0);

				}
				break;
			case WM_KEYDOWN:
			case WM_KEYUP:
			case WM_SYSKEYUP:
			case WM_SYSKEYDOWN:
				if (recv (Sock, (char *)MouseData, sizeof(USHORT), 0) == sizeof(USHORT)) {
					dwFlags = ((WM_KEYUP == Cmd) || (WM_SYSKEYUP == Cmd)) ? KEYEVENTF_KEYUP : 0;
					// No scancode data.
					keybd_event ((BYTE)MouseData[0], 0, dwFlags, 0);
				}
				break;

			default :
				break;
		}

	}
	DEBUGMSG (1, (TEXT("DoInput thread exiting\r\n")));
	return -1;
}

ULONG
ComputeCRC(IN PUCHAR Buffer, IN UINT Length)
{
    ULONG Crc, Carry;
    UINT i, j;
    UCHAR CurByte;

    Crc = 0xffffffff;

    for (i = 0; i < Length; i++) {

        CurByte = Buffer[i];

        for (j = 0; j < 8; j++) {

            Carry = ((Crc & 0x80000000) ? 1 : 0) ^ (CurByte & 0x01);

            Crc <<= 1;

            CurByte >>= 1;

            if (Carry) {

                Crc = (Crc ^ 0x04c11db6) | Carry;

            }

        }

    }

    return Crc;

}



DWORD
DoConnect (LPVOID lpArg)
{
	int			Status;
	SOCKADDR_IN	SockAddr;
	struct hostent *pHost;
	char		szHostName[256];

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?