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 + -
显示快捷键?