📄 videodriver.cpp
字号:
{
first=true;
vnclog.Print(LL_INTERR, VNCLOG("DesActivate_video_driver() "));
HDESK hdeskInput;
HDESK hdeskCurrent;
int j=0;
pEnumDisplayDevices pd;
pChangeDisplaySettingsExA pcdse;
LPSTR driverName = "Winvnc video hook driver";
DEVMODE devmode;
FillMemory(&devmode, sizeof(DEVMODE), 0);
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDriverExtra = 0;
BOOL change = EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&devmode);
devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
HMODULE hUser32=LoadLibrary("USER32");
pd = (pEnumDisplayDevices)GetProcAddress( hUser32, "EnumDisplayDevicesA");
pcdse = (pChangeDisplaySettingsExA)GetProcAddress( hUser32, "ChangeDisplaySettingsExA");
if (!pcdse) return;
if (pd)
{
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
LPSTR deviceName = NULL;
devmode.dmDeviceName[0] = '\0';
INT devNum = 0;
BOOL result;
while (result = (*pd)(NULL,devNum, &dd,0))
{
if (strcmp((const char *)&dd.DeviceString[0], driverName) == 0)
break;
devNum++;
}
if (!result)
{
// printf("No '%s' found.\n", driverName);
return;
}
// printf("DevNum:%d\nName:%s\nString:%s\n\n",devNum,&dd.DeviceName[0],&dd.DeviceString[0]);
// printf("Sreen Settings'%i %i %i'\n",devmode.dmPelsWidth,devmode.dmPelsHeight,devmode.dmBitsPerPel);
CHAR deviceNum[MAX_PATH];
strcpy(&deviceNum[0], "DEVICE0");
HKEY hKeyProfileMirror = (HKEY)0;
if (RegCreateKey(HKEY_LOCAL_MACHINE,
("SYSTEM\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Services\\vncdrv"),
&hKeyProfileMirror) != ERROR_SUCCESS)
{
// printf("Can't access registry.\n");
return;
}
HKEY hKeyDevice = (HKEY)0;
if (RegCreateKey(hKeyProfileMirror,
(&deviceNum[0]),
&hKeyDevice) != ERROR_SUCCESS)
{
// printf("Can't access DEVICE# hardware profiles key.\n");
return;
}
DWORD one = 0;
if (RegSetValueEx(hKeyDevice,
("Attach.ToDesktop"),
0,
REG_DWORD,
(unsigned char *)&one,
4) != ERROR_SUCCESS)
{
// printf("Can't set Attach.ToDesktop to 0x1\n");
return;
}
strcpy((LPSTR)&devmode.dmDeviceName[0], "vncdrv");
deviceName = (LPSTR)&dd.DeviceName[0];
// save the current desktop
// save the current desktop
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent != NULL)
{
hdeskInput = OpenInputDesktop(0, FALSE, MAXIMUM_ALLOWED);
if (hdeskInput != NULL)
{
SetThreadDesktop(hdeskInput);
}
else Beep(1000,500);
}
// add 'Default.*' settings to the registry under above hKeyProfile\mirror\device
blocked=true;
if (!Temp_Resolution)
{
INT code =
(*pcdse)(deviceName,
&devmode,
NULL,
CDS_UPDATEREGISTRY,
NULL
);
// printf("Update Register on device mode: %i\n", code);
code = (*pcdse)(deviceName,
&devmode,
NULL,
0,
NULL
);
}
blocked=false;
if (hUser32)FreeLibrary(hUser32);
// reset desktop
SetThreadDesktop(hdeskCurrent);
// close the input desktop
CloseDesktop(hdeskInput);
DWORD zero = 0;
if (RegSetValueEx(hKeyDevice,
("Attach.ToDesktop"),
0,
REG_DWORD,
(unsigned char *)&zero,
4) != ERROR_SUCCESS)
{
// printf("Can't set Attach.ToDesktop to 0x0\n");
return;
}
RegCloseKey(hKeyProfileMirror);
RegCloseKey(hKeyDevice);
}
return;
}
BOOL
vncVideoDriver::ExistMirrorDriver()
{
pEnumDisplayDevices pd;
LPSTR driverName = "Winvnc video hook driver";
DEVMODE devmode;
FillMemory(&devmode, sizeof(DEVMODE), 0);
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDriverExtra = 0;
BOOL change = EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&devmode);
devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
HMODULE hUser32=LoadLibrary("USER32");
pd = (pEnumDisplayDevices)GetProcAddress( hUser32, "EnumDisplayDevicesA");
BOOL result;
if (pd)
{
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
LPSTR deviceName = NULL;
devmode.dmDeviceName[0] = '\0';
INT devNum = 0;
while (result = (*pd)(NULL,devNum, &dd,0))
{
if (strcmp((const char *)&dd.DeviceString[0], driverName) == 0)
break;
devNum++;
}
if (hUser32) FreeLibrary(hUser32);
return result;
}
else return 0;
}
HDC
vncVideoDriver::GetDcMirror()
{
typedef BOOL (WINAPI* pEnumDisplayDevices)(PVOID,DWORD,PVOID,DWORD);
HDC m_hrootdc;
pEnumDisplayDevices pd;
LPSTR driverName = "Winvnc video hook driver";
BOOL DriverFound;
DEVMODE devmode;
FillMemory(&devmode, sizeof(DEVMODE), 0);
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDriverExtra = 0;
BOOL change = EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&devmode);
devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
HMODULE hUser32=LoadLibrary("USER32");
pd = (pEnumDisplayDevices)GetProcAddress( hUser32, "EnumDisplayDevicesA");
if (pd)
{
LPSTR deviceName=NULL;
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
devmode.dmDeviceName[0] = '\0';
INT devNum = 0;
BOOL result;
DriverFound=false;
while (result = (*pd)(NULL,devNum, &dd,0))
{
if (strcmp((const char *)&dd.DeviceString[0], driverName) == 0)
{
DriverFound=true;
break;
}
devNum++;
}
if (DriverFound)
{
deviceName = (LPSTR)&dd.DeviceName[0];
m_hrootdc = CreateDC("DISPLAY",deviceName,NULL,NULL);
}
}
if (hUser32) FreeLibrary(hUser32);
return m_hrootdc;
}
BOOL
vncVideoDriver::IsMirrorDriverActive()
{
pEnumDisplayDevices pd;
LPSTR driverName = "Winvnc video hook driver";
DEVMODE devmode;
FillMemory(&devmode, sizeof(DEVMODE), 0);
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDriverExtra = 0;
BOOL change = EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&devmode);
devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
HMODULE hUser32=LoadLibrary("USER32");
pd = (pEnumDisplayDevices)GetProcAddress( hUser32, "EnumDisplayDevicesA");
BOOL result;
if (pd)
{
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
LPSTR deviceName = NULL;
devmode.dmDeviceName[0] = '\0';
INT devNum = 0;
while (result = (*pd)(NULL,devNum, &dd,0))
{
if (strcmp((const char *)&dd.DeviceString[0], driverName) == 0)
break;
devNum++;
}
if (dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)
{
if (hUser32) FreeLibrary(hUser32);
return 1;
}
else
{
if (hUser32) FreeLibrary(hUser32);
return 0;
}
}
return 0;
}
BOOL
vncVideoDriver:: GetDllProductVersion(char* dllName, char *vBuffer, int size)
{
char *versionInfo;
char fileName[MAX_PATH + 1];
void *lpBuffer;
unsigned int cBytes;
DWORD rBuffer;
if( !dllName || !vBuffer )
return(FALSE);
DWORD sName = GetModuleFileName(NULL, fileName, sizeof(fileName));
// FYI only
DWORD sVersion = GetFileVersionInfoSize(dllName, &rBuffer);
if (sVersion==0) return (FALSE);
versionInfo = new char[sVersion];
BOOL resultVersion = GetFileVersionInfo(dllName,
NULL,
sVersion,
versionInfo);
BOOL resultValue = VerQueryValue(versionInfo,
TEXT("\\StringFileInfo\\040904b0\\ProductVersion"),
&lpBuffer,
&cBytes);
if( !resultValue )
{
resultValue = VerQueryValue(versionInfo,TEXT("\\StringFileInfo\\000004b0\\ProductVersion"),
&lpBuffer,
&cBytes);
}
if( resultValue )
{
strncpy(vBuffer, (char *) lpBuffer, size);
delete versionInfo;
return(TRUE);
}
else
{
*vBuffer = '\0';
delete versionInfo;
return(FALSE);
}
}
BOOL
vncVideoDriver::Tempres()
{
pEnumDisplayDevices pd;
HMODULE hUser32=LoadLibrary("USER32");
pd = (pEnumDisplayDevices)GetProcAddress( hUser32, "EnumDisplayDevicesA");
first=true;
DWORD i;
int curw,curh,curp;
int regw,regh,regp;
DISPLAY_DEVICE dd;
DEVMODE dm;
LPSTR deviceName = NULL;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
DEVMODE devmode;
FillMemory(&devmode, sizeof(DEVMODE), 0);
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDriverExtra = 0;
for(i=0; (*pd)(NULL, i, &dd, 0); i++)
{
if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
{
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(dm);
EnumDisplaySettings((char*)(dd.DeviceName), ENUM_CURRENT_SETTINGS, &dm);
break;
}
}
deviceName = (LPSTR)&dd.DeviceName[0];
EnumDisplaySettings(deviceName,ENUM_CURRENT_SETTINGS,&devmode);
curw=devmode.dmPelsWidth;
curh=devmode.dmPelsHeight;
curp=devmode.dmBitsPerPel;
EnumDisplaySettings(deviceName,ENUM_REGISTRY_SETTINGS,&devmode);
regw=devmode.dmPelsWidth;
regh=devmode.dmPelsHeight;
regp=devmode.dmBitsPerPel;
if (curw==regw && curh==regh && curp==regp)
return false;
else return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -