SysInfo: Changing names

git-svn-id: svn://ultimatepp.org/upp/trunk@9659 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
koldo 2016-04-01 20:18:51 +00:00
parent a2d3554f1d
commit f8f4323d8a
6 changed files with 0 additions and 2078 deletions

View file

@ -1,173 +0,0 @@
#include "SysInfo_in.h"
NAMESPACE_UPP
#ifdef PLATFORM_POSIX
bool GetBatteryStatus(bool &discharging, int &percentage, int &remainingMin)
{
/* This is only if acpi package is present
StringParse data = Sys("acpi -V");
data.GoAfter("AC Adapter", ":");
String sacStatus = data.GetText();
discharging = sacStatus != "on-line";
data.GoInit();
data.GoAfter("Battery", ":");
data.GoAfter(",");
percentage = data.GetInt("%");
data.GoAfter(",");
String remaining;
if (discharging) {
remaining = data.GetText(" ");
int hour, min;
double secs;
StringToHMS(remaining, hour, min, secs); // It is really days:hour:min in this case
remainingMin = int(secs) + min*60 + hour*24*60;
} else
remainingMin = Null;
*/
percentage = 100;
Vector<String> files = SearchFile("/proc/acpi/battery", "state");
if (files.GetCount() == 0)
return false;
StringParse state = LoadFile_Safe(files[0]);
if (state == "")
return false;
bool present;
if(!state.GoAfter_Init("present", ":"))
return false;
present = state.GetText() == "yes";
if (!present)
return false; // No battery inserted
state.GoAfter_Init("charging state", ":"); discharging = state.GetText() == "discharging";
int presentRate, remainingCapacity;
state.GoAfter_Init("present rate", ":"); presentRate = state.GetInt();
state.GoAfter_Init("remaining capacity", ":"); remainingCapacity = state.GetInt();
if (presentRate == 0 || !discharging)
remainingMin = Null;
else
remainingMin = (int)((60.*remainingCapacity)/presentRate);
int designCapacity,lastFullCapacity;
String vendor, type, model, serial;
if (!GetBatteryInfo(present/*, designCapacity, lastFullCapacity, vendor, type, model, serial*/))
percentage = (int)((100.*remainingCapacity)/lastFullCapacity);
return true;
}
bool GetBatteryInfo(bool &present/*, int &designCapacity, int &lastFullCapacity, String &vendor, String &type, String &model, String &serial*/)
{
Vector<String> files = SearchFile("/proc/acpi/battery", "info");
if (files.GetCount() == 0)
return false;
StringParse info = LoadFile_Safe(files[0]);
if (info == "")
return false;
info.GoAfter_Init("present", ":"); present = info.GetText() == "yes";
/*
info.GoAfter_Init("design capacity", ":"); designCapacity = info.GetInt();
info.GoAfter_Init("last full capacity", ":");lastFullCapacity = info.GetInt();
info.GoAfter_Init("OEM info", ":"); vendor = info.GetText();
info.GoAfter_Init("battery type", ":"); type = info.GetText();
info.GoAfter_Init("model number", ":"); model = info.GetText();
info.GoAfter_Init("serial number", ":"); serial = info.GetText();
*/
return true;
}
bool OpenCDTray(String drive)
{
String dummy;
return Sys("eject", dummy) > 0;
}
bool CloseCDTray(String drive)
{
String dummy;
return Sys("eject -t", dummy) > 0;
}
#endif
#if defined(PLATFORM_WIN32) || defined (PLATFORM_WIN64)
bool GetBatteryStatus(bool &discharging, int &percentage, int &remainingMin)
{
SYSTEM_POWER_STATUS power;
if(::GetSystemPowerStatus(&power) != 1)
return false;
if (power.ACLineStatus == 1)
discharging = false;
else
discharging = true;
if (power.BatteryLifePercent <= 100)
percentage = power.BatteryLifePercent;
else
percentage = Null;
if (discharging && power.BatteryLifeTime != -1)
remainingMin = int(power.BatteryLifeTime/60);
else
remainingMin = Null;
return true;
}
bool GetBatteryInfo(bool &present/*, int &designCapacity, int &lastFullCapacity, String &vendor, String &type, String &model, String &serial*/)
{
SYSTEM_POWER_STATUS power;
if(::GetSystemPowerStatus(&power) == 0)
return false;
if (power.BatteryFlag == 128)
return false; // No battery
//designCapacity = (int)(power.BatteryFullLifeTime/60.);
present = true;
//power.ACLineStatus == 0;
//lastFullCapacity = 0;
//vendor = type = model = serial = "UNKNOWN";
return true;
}
bool DriveOpenClose(String drive, bool open)
{
int operation;
if (open)
operation = IOCTL_STORAGE_EJECT_MEDIA;
else
operation = IOCTL_STORAGE_LOAD_MEDIA;
if (drive.IsEmpty())
return false;
else if (drive.GetCount() == 1)
drive += ":";
else {
drive = drive.Left(2);
if (drive[1] != ':')
return false;
}
HANDLE hDrive;
hDrive = CreateFile("\\\\.\\" + drive, GENERIC_READ || GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hDrive == INVALID_HANDLE_VALUE)
return false;
bool ret = false;
DWORD dummyBytesReturned;
if (DeviceIoControl(hDrive, operation, 0, 0, 0, 0, &dummyBytesReturned, 0))
ret = true;
CloseHandle(hDrive);
return ret;
}
bool OpenCDTray(String drive)
{
return DriveOpenClose(drive, true);
}
bool CloseCDTray(String drive)
{
return DriveOpenClose(drive, false);
}
#endif
END_UPP_NAMESPACE

View file

@ -1,9 +0,0 @@
#define bmYEAR 2015
#define bmMONTH 9
#define bmDAY 20
#define bmHOUR 17
#define bmMINUTE 5
#define bmSECOND 59
#define bmTIME Time(2015, 9, 20, 17, 5, 59)
#define bmMACHINE "BPC9733"
#define bmUSER "0203853"

View file

@ -1,66 +0,0 @@
#include "SysInfo.h"
NAMESPACE_UPP
#if defined(PLATFORM_WIN32) || defined (PLATFORM_WIN64)
uint64 start, end;
unsigned long nCtr, nFreq, nCtrStop;
#if defined(__MINGW32__)
uint64 __rdtsc() {
#if defined(__MINGW64__) // It does not work for now
unsigned int lo, hi;
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return uint64(lo) | (uint64(hi) << 32);
#else
unsigned int lo, hi;
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return uint64(lo) | (uint64(hi) << 32);
#endif
}
#endif
int GetCpuSpeed()
{
if(!QueryPerformanceFrequency((LARGE_INTEGER *) &nFreq))
return 0;
QueryPerformanceCounter((LARGE_INTEGER *) &nCtrStop);
nCtrStop += nFreq;
start = __rdtsc();
do
QueryPerformanceCounter((LARGE_INTEGER *) &nCtr);
while (nCtr < nCtrStop);
end = __rdtsc();
return int((end - start)/1000000);
}
#endif
#if defined(PLATFORM_POSIX)
#define __rdtsc(tm) __asm__ __volatile__ (".byte 0x0f; .byte 0x31" :"=a" (tm))
#define COUNT_SEC (double)tv.tv_sec + (1.e-6)*tv.tv_usec
int GetCpuSpeed()
{
struct timeval tv;
double cnt1, cnt2;
unsigned long start, end;
__rdtsc(start);
gettimeofday(&tv, 0);
cnt1 = COUNT_SEC + 0.01;
do {
gettimeofday(&tv, 0);
cnt2 = COUNT_SEC;
} while(cnt2 < cnt1);
__rdtsc(end);
return int((end-start)/10000);
}
#endif
END_UPP_NAMESPACE

View file

@ -1,535 +0,0 @@
#include "SysInfo_in.h"
NAMESPACE_UPP
struct KeyCodes {
String key;
int code;
};
#if defined(PLATFORM_WIN32) || defined (PLATFORM_WIN64)
Array <String> GetWinRegSubkeys(const String& key, HKEY base) {
HKEY hkey;
Array <String> subkeys;
if(RegOpenKeyEx(base, key, 0, KEY_READ, &hkey) != ERROR_SUCCESS)
return subkeys;
char temp[_MAX_PATH];
dword len;
for(dword dw = 0; len = sizeof(temp), RegEnumKeyEx(hkey, dw, temp, &len, 0, 0, 0, 0) == ERROR_SUCCESS; dw++)
subkeys.Add(temp);
RegCloseKey(hkey);
return subkeys;
}
void Mouse_LeftDown() {mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);}
void Mouse_LeftUp() {mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);}
void Mouse_MiddleDown() {mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0);}
void Mouse_MiddleUp() {mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);}
void Mouse_RightDown() {mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);}
void Mouse_RightUp() {mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);}
bool Mouse_SetPos(long xMove, long yMove, int64 windowId) {
long left, top, right, bottom;
if (windowId != 0) {
Window_GetRect(windowId, left, top, right, bottom);
xMove = xMove + left;
yMove = yMove + top;
}
SetCursorPos(xMove, yMove);
return true;
}
bool Mouse_GetPos(long &x, long &y) {
POINT p;
GetCursorPos (&p);
x = p.x;
y = p.y;
return true;
}
KeyCodes keyCodes[60] = {
"NUMPAD7", VK_NUMPAD7, "BACK", VK_BACK,
"NUMPAD8", VK_NUMPAD8, "TAB", VK_TAB,
"NUMPAD9", VK_NUMPAD9, "RETURN", VK_RETURN,
"MULTIPLY", VK_MULTIPLY, "SHIFT", VK_SHIFT,
"ADD", VK_ADD, "CONTROL", VK_CONTROL,
"SEPARATOR", VK_SEPARATOR, "MENU", VK_MENU,
"SUBTRACT", VK_SUBTRACT, "PAUSE", VK_PAUSE,
"DECIMAL", VK_DECIMAL, "CAPITAL", VK_CAPITAL,
"DIVIDE", VK_DIVIDE, "ESCAPE", VK_ESCAPE,
"F1", VK_F1, "SPACE", VK_SPACE,
"F2", VK_F2, "END", VK_END,
"F3", VK_F3, "HOME", VK_HOME,
"F4", VK_F4, "LEFT", VK_LEFT,
"F5", VK_F5, "UP", VK_UP,
"F6", VK_F6, "RIGHT", VK_RIGHT,
"F7", VK_F7, "DOWN", VK_DOWN,
"F8", VK_F8, "PRINT", VK_PRINT,
"F9", VK_F9, "SNAPSHOT", VK_SNAPSHOT,
"F10", VK_F10, "INSERT", VK_INSERT,
"F11", VK_F11, "DELETE", VK_DELETE,
"F12", VK_F12, "LWIN", VK_LWIN,
"NUMLOCK", VK_NUMLOCK, "RWIN", VK_RWIN,
"SCROLL", VK_SCROLL, "NUMPAD0", VK_NUMPAD0,
"LSHIFT", VK_LSHIFT, "NUMPAD1", VK_NUMPAD1,
"RSHIFT", VK_RSHIFT, "NUMPAD2", VK_NUMPAD2,
"LCONTROL", VK_LCONTROL, "NUMPAD3", VK_NUMPAD3,
"RCONTROL", VK_RCONTROL, "NUMPAD4", VK_NUMPAD4,
"LMENU", VK_LMENU, "NUMPAD5", VK_NUMPAD5,
"RMENU", VK_RMENU, "NUMPAD6", VK_NUMPAD6,
/*"PGUP", XK_Page_Up, "PGDOWN", XK_Page_Down
"CAPSLOCK", XK_Caps_Lock, "BACKSPACE",XK_BackSpace */
""
};
void PressKeyVK(int keyVK, bool hold = false, bool release = false, bool compatible = false) {
long nScan, nExtended;
nScan = MapVirtualKey(keyVK, 2);
nExtended = 0;
if (nScan == 0)
nExtended = KEYEVENTF_EXTENDEDKEY;
nScan = MapVirtualKey(keyVK, 0);
if (compatible)
nExtended = 0;
if (!release)
keybd_event((BYTE)keyVK, (BYTE)nScan, nExtended, 0);
if (!hold)
keybd_event((BYTE)keyVK, (BYTE)nScan, KEYEVENTF_KEYUP | nExtended, 0);
}
#if defined(__MINGW32__)
// #define MAPVK_VK_TO_VSC 0
// #define MAPVK_VSC_TO_VK 1
#ifndef MAPVK_VK_TO_CHAR
#define MAPVK_VK_TO_CHAR 2
#endif
// #define MAPVK_VSC_TO_VK_EX 3
#endif
//#define MAPVK_VK_TO_VSC_EX 4
// This is less nice but more compatible for Notepad and MSWord for example
void PressKey(wchar key, bool hold = false, bool release = false) {
if ((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z') || (key >= '0' && key <= '9')) {
HKL hKeyboardLayout = ::GetKeyboardLayout(0);
SHORT nVK = VkKeyScanExW(key, hKeyboardLayout);
UINT nScan = MapVirtualKeyExW(nVK, MAPVK_VK_TO_CHAR, hKeyboardLayout);
if (!release)
keybd_event((BYTE)nVK, (BYTE)nScan, 0, 0);
if (!hold)
keybd_event((BYTE)nVK, (BYTE)nScan, KEYEVENTF_KEYUP, 0);
} else {
String numStr = FormatIntDec(key, 5, '0');
PressKeyVK(VK_LMENU, true);
PressKeyVK(VK_NUMPAD0 + numStr[0] - '0');
PressKeyVK(VK_NUMPAD0 + numStr[1] - '0');
PressKeyVK(VK_NUMPAD0 + numStr[2] - '0');
PressKeyVK(VK_NUMPAD0 + numStr[3] - '0');
PressKeyVK(VK_NUMPAD0 + numStr[4] - '0');
PressKeyVK(VK_LMENU, false, true);
}
}
/*
void PressKey(wchar key, bool hold = false, bool release = false)
{
bool caps, num, scroll;
if (IsLetter(key)) {
GetKeyLockStatus(caps, num, scroll);
if (caps)
SetKeyLockStatus(false, num, scroll);
}
HKL hKeyboardLayout = ::GetKeyboardLayout(0);
if (hKeyboardLayout) { // Last resource !!
String numStr = FormatIntDec(key, 4, '0');
PressKeyVK(VK_LMENU, true);
PressKeyVK(VK_NUMPAD0 + numStr[0] - '0');
PressKeyVK(VK_NUMPAD0 + numStr[1] - '0');
PressKeyVK(VK_NUMPAD0 + numStr[2] - '0');
PressKeyVK(VK_NUMPAD0 + numStr[3] - '0');
PressKeyVK(VK_LMENU, false, true);
return;
}
UINT nScan = MapVirtualKeyExW(nVK, MAPVK_VK_TO_CHAR, hKeyboardLayout);
long nExtended = 0;
if (nScan == 0)
nExtended = KEYEVENTF_EXTENDEDKEY;
nScan = MapVirtualKeyExW(nVK, MAPVK_VK_TO_VSC, hKeyboardLayout);
bool shift, ctrl, alt;
shift = nVK & 0x100;
ctrl = nVK & 0x200;
alt = nVK & 0x400;
nVK = nVK & 0xFF;
if (!release) {
if (shift)
keybd_event (VK_SHIFT, 0, 0, 0);
if (ctrl)
keybd_event (VK_CONTROL, 0, 0, 0);
if (alt)
keybd_event (VK_MENU, 0, 0, 0);
keybd_event ((BYTE)nVK, (BYTE)nScan, nExtended, 0);
}
if (!hold) {
keybd_event ((BYTE)nVK, (BYTE)nScan, KEYEVENTF_KEYUP | nExtended, 0);
if (shift)
keybd_event (VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
if (ctrl)
keybd_event (VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
if (alt)
keybd_event (VK_MENU, 0, KEYEVENTF_KEYUP, 0);
}
if (IsLetter(key) && caps)
SetKeyLockStatus(true, num, scroll);
}
*/
bool GetKeyLockStatus(bool &caps, bool &num, bool &scroll) {
caps = GetKeyState(VK_CAPITAL);
num = GetKeyState(VK_NUMLOCK);
scroll = GetKeyState(VK_SCROLL);
return true;
}
bool SetKeyLockStatus(bool caps, bool num, bool scroll) {
bool capsnow, numnow, scrollnow;
GetKeyLockStatus(capsnow, numnow, scrollnow);
if (capsnow != caps)
PressKeyVK(VK_CAPITAL);
if (numnow != num)
PressKeyVK(VK_NUMLOCK);
if (scrollnow != scroll)
PressKeyVK(VK_SCROLL);
return true;
}
#endif
#ifdef PLATFORM_POSIX
bool Mouse_GetPos(long &x, long &y) {
SetSysInfoX11ErrorHandler();
_XDisplay *dpy = XOpenDisplay (NULL);
if (!dpy) {
SetX11ErrorHandler();
return false;
}
bool ret = false;
Window root, child;
Window r = DefaultRootWindow(dpy);
int retx, rety;
int wx, wy;
unsigned int keys_buttons;
if (XQueryPointer(dpy, r, &root, &child, &retx, &rety, &wx, &wy, &keys_buttons)) {
x = wx;
y = wy;
ret = true;
} else
x = y = -1;
XCloseDisplay (dpy);
SetX11ErrorHandler();
return ret;
}
bool Mouse_SetPos(long x, long y, int64 windowId) {
SetSysInfoX11ErrorHandler();
_XDisplay *dpy = XOpenDisplay (NULL);
if (!dpy) {
SetX11ErrorHandler();
return false;
}
long left, top, right, bottom;
Window r = DefaultRootWindow(dpy);
if (windowId != 0) {
Window_GetRect(windowId, left, top, right, bottom);
x = x + left;
y = y + top;
}
XWarpPointer(dpy, None, r, 0, 0, 0, 0, x, y);
XCloseDisplay (dpy);
SetX11ErrorHandler();
return true;
}
// libxtst-dev
#if !defined(flagNO_XTEST)
void Mouse_FakeClick(int button, int press) {
_XDisplay *dpy = XOpenDisplay(NULL);
XTestFakeButtonEvent(dpy, button, press, CurrentTime);
XFlush(dpy);
XCloseDisplay(dpy);
}
void Mouse_LeftDown() {Mouse_FakeClick(1, True);}
void Mouse_LeftUp() {Mouse_FakeClick(1, False);}
void Mouse_MiddleDown() {Mouse_FakeClick(2, True);}
void Mouse_MiddleUp() {Mouse_FakeClick(2, False);}
void Mouse_RightDown() {Mouse_FakeClick(3, True);}
void Mouse_RightUp() {Mouse_FakeClick(3, False);}
void PressKeyVK(int key, _XDisplay *dpy = NULL) {
bool local = false;
if (!dpy) {
if (!(dpy = XOpenDisplay(NULL)))
return;
local = true;
}
XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, key), True, CurrentTime);
XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, key), False, CurrentTime);
if (local) {
XFlush(dpy);
XCloseDisplay(dpy);
}
}
void PressKey(wchar key, _XDisplay *dpy = NULL) {
bool local = false;
if (!dpy) {
if (!(dpy = XOpenDisplay(NULL)))
return;
local = true;
}
wchar k = key;
if (key > 0x00ff)
key = key | 0x01000000;
bool shift = false;
KeyCode code = XKeysymToKeycode(dpy, key);
if (code != 0) {
if (XkbKeycodeToKeysym(dpy, code, 0, 0) != key) {
if (XkbKeycodeToKeysym(dpy, code, 1, 0) == key)
shift = true;
else
code = 0;
}
} else {
int firstKeycode, maxKeycode;
int keysymsPerKeycode;
XDisplayKeycodes(dpy, &firstKeycode, &maxKeycode);
KeySym *keysyms = XGetKeyboardMapping(dpy, firstKeycode, maxKeycode - firstKeycode + 1, &keysymsPerKeycode);
int indx = (maxKeycode - firstKeycode - 1)*keysymsPerKeycode;
keysyms[indx] = key;
XChangeKeyboardMapping(dpy, firstKeycode, keysymsPerKeycode, keysyms, maxKeycode-firstKeycode);
XSync(dpy, False);
code = maxKeycode-1;
if (XkbKeycodeToKeysym(dpy, code, 0, 0) != key) {
if (XkbKeycodeToKeysym(dpy, code, 1, 0) == key)
shift = true;
}
}
if (code != 0) {
if (shift)
XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, XK_Shift_L), True, CurrentTime);
XTestFakeKeyEvent(dpy, code, True, CurrentTime);
XTestFakeKeyEvent(dpy, code, False, CurrentTime);
if (shift)
XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, XK_Shift_L), False, CurrentTime);
}
if (local) {
XFlush(dpy);
XCloseDisplay(dpy);
}
}
#endif
bool GetKeyLockStatus0(bool &caps, bool &num, bool &scroll, _XDisplay *dpy) {
int x, y, xx, yy;
Window dm1, dm2;
unsigned int sKbdState;
if(!XQueryPointer(dpy, DefaultRootWindow(dpy), &dm1, &dm2, &x, &y, &xx, &yy, &sKbdState))
return false;
caps = sKbdState & LockMask;
num = sKbdState & Mod2Mask;
scroll = sKbdState & Mod5Mask;
return true;
}
bool GetKeyLockStatus(bool &caps, bool &num, bool &scroll) {
_XDisplay *dpy;
if (!(dpy = XOpenDisplay(NULL)))
return false;
if (!GetKeyLockStatus0(caps, num, scroll, dpy)) {
XCloseDisplay(dpy);
return false;
}
XFlush(dpy);
XCloseDisplay(dpy);
return true;
}
#if !defined(flagNO_XTEST)
bool SetKeyLockStatus(bool caps, bool num, bool scroll) {
_XDisplay *dpy;
if (!(dpy = XOpenDisplay(NULL)))
return false;
bool oldcaps, oldnum, oldscroll;
if (!GetKeyLockStatus0(oldcaps, oldnum, oldscroll, dpy)) {
XCloseDisplay(dpy);
return false;
}
if (caps != oldcaps)
PressKeyVK(XK_Caps_Lock, dpy);
if (num != oldnum)
PressKeyVK(XK_Num_Lock, dpy);
if (scroll != oldscroll)
PressKeyVK(XK_Scroll_Lock, dpy);
XFlush(dpy);
XCloseDisplay(dpy);
return true;
}
KeyCodes keyCodes[] = {
"NUMPAD7", XK_KP_7, "BACK", XK_BackSpace,
"NUMPAD8", XK_KP_8, "TAB", XK_Tab,
"NUMPAD9", XK_KP_9, "RETURN", XK_Return,
"MULTIPLY", XK_KP_Multiply, "SHIFT", XK_Shift_Lock,
"ADD", XK_KP_Add, "CONTROL", XK_Control_L,
"SEPARATOR", XK_KP_Separator,"MENU", XK_Super_L,
"SUBTRACT", XK_KP_Subtract, "PAUSE", XK_Pause,
"DECIMAL", XK_KP_Decimal, /*"CAPITAL", VK_CAPITAL,*/
"DIVIDE", XK_KP_Divide, "ESCAPE", XK_Escape,
"F1", XK_F1, "SPACE", XK_KP_Space,
"F2", XK_F2, "END", XK_End,
"F3", XK_F3, "HOME", XK_Home,
"F4", XK_F4, "LEFT", XK_Left,
"F5", XK_F5, "UP", XK_Up,
"F6", XK_F6, "RIGHT", XK_Right,
"F7", XK_F7, "DOWN", XK_Down,
"F8", XK_F8, "PRINT", XK_Sys_Req,
"F9", XK_F9, /*"SNAPSHOT", VK_SNAPSHOT,*/
"F10", XK_F10, "INSERT", XK_Insert,
"F11", XK_F11, "DELETE", XK_Delete,
"F12", XK_F12, "LWIN", XK_Meta_L,
"NUMLOCK", XK_Num_Lock, "RWIN", XK_Meta_R,
"SCROLL", XK_Scroll_Lock, "NUMPAD0", XK_KP_0,
"LSHIFT", XK_Shift_L, "NUMPAD1", XK_KP_1,
"RSHIFT", XK_Shift_R, "NUMPAD2", XK_KP_2,
"LCONTROL", XK_Control_L, "NUMPAD3", XK_KP_3,
"RCONTROL", XK_Control_R, "NUMPAD4", XK_KP_4,
"LMENU", XK_Super_L, "NUMPAD5", XK_KP_5,
"RMENU", XK_Super_R, "NUMPAD6", XK_KP_6,
"PGUP", XK_Page_Up, "PGDOWN", XK_Page_Down,
"CAPSLOCK", XK_Caps_Lock, "BACKSPACE",XK_BackSpace,
""
};
#endif
#endif
#if defined(PLATFORM_WIN32) || !defined(flagNO_XTEST)
void Mouse_LeftClick()
{
Mouse_LeftDown();
Mouse_LeftUp();
}
void Mouse_RightClick()
{
Mouse_RightDown();
Mouse_RightUp();
}
void Mouse_MiddleClick()
{
Mouse_MiddleDown();
Mouse_MiddleUp();
}
void Mouse_LeftDblClick()
{
Mouse_LeftClick();
Mouse_LeftClick();
}
void Mouse_MiddleDblClick()
{
Mouse_MiddleClick();
Mouse_MiddleClick();
}
void Mouse_RightDblClick()
{
Mouse_RightClick();
Mouse_RightClick();
}
int GetKeyCode(String key) {
for (int i = 0; keyCodes[i].code != 0; ++i)
if (keyCodes[i].key == key)
return keyCodes[i].code;
return 0;
}
void Keyb_SendKeys(String text, long finalDelay, long delayBetweenKeys)
{
Array <wchar> virt;
bool inKey = false;
String key = "";
WString wtext(text);
for (int i = 0; i < wtext.GetCount(); ++i) {
bool vk = false;
Sleep(delayBetweenKeys);
wchar c = wtext[i];
if (c == '{')
inKey = true;
else if (c == '}') {
if (key == "{")
c = '{';
else {
c = GetKeyCode(key);
vk = true;
}
inKey = false;
key = "";
} else if (inKey == 1)
key.Cat(c);
else if (c == '\n') {
c = GetKeyCode("RETURN");
vk = true;
}
if (inKey == false) {
if (!vk)
PressKey(c);
#if defined(PLATFORM_WIN32) || defined (PLATFORM_WIN64)
else {
PressKeyVK(c, true);
virt.Add(c);
}
#endif
}
}
#if defined(PLATFORM_WIN32) || defined (PLATFORM_WIN64)
for (int i = 0; i < virt.GetCount(); ++i)
PressKeyVK(virt[i], false, true);
#endif
Sleep(finalDelay);
}
#endif
END_UPP_NAMESPACE

View file

@ -1,677 +0,0 @@
#include "SysInfo_in.h"
NAMESPACE_UPP
#if defined(PLATFORM_WIN32) || defined (PLATFORM_WIN64)
#ifndef PRODUCT_UNLICENSED
#define PRODUCT_UNLICENSED 0xABCDABCD
#endif
#ifndef PRODUCT_BUSINESS
#define PRODUCT_BUSINESS 0x00000006
#endif
#ifndef PRODUCT_BUSINESS_N
#define PRODUCT_BUSINESS_N 0x00000010
#endif
#ifndef PRODUCT_CLUSTER_SERVER
#define PRODUCT_CLUSTER_SERVER 0x00000012
#endif
#ifndef PRODUCT_CLUSTER_SERVER_V
#define PRODUCT_CLUSTER_SERVER_V 0x00000040
#endif
#ifndef PRODUCT_CORE
#define PRODUCT_CORE 0x00000065
#endif
#ifndef PRODUCT_CORE_N
#define PRODUCT_CORE_N 0x00000062
#endif
#ifndef PRODUCT_CORE_COUNTRYSPECIFIC
#define PRODUCT_CORE_COUNTRYSPECIFIC 0x00000063
#endif
#ifndef PRODUCT_CORE_SINGLELANGUAGE
#define PRODUCT_CORE_SINGLELANGUAGE 0x00000064
#endif
#ifndef PRODUCT_DATACENTER_EVALUATION_SERVER
#define PRODUCT_DATACENTER_EVALUATION_SERVER 0x00000050
#endif
#ifndef PRODUCT_DATACENTER_SERVER
#define PRODUCT_DATACENTER_SERVER 0x00000008
#endif
#ifndef PRODUCT_DATACENTER_SERVER_CORE
#define PRODUCT_DATACENTER_SERVER_CORE 0x0000000C
#endif
#ifndef PRODUCT_DATACENTER_SERVER_CORE_V
#define PRODUCT_DATACENTER_SERVER_CORE_V 0x00000027
#endif
#ifndef PRODUCT_DATACENTER_SERVER_V
#define PRODUCT_DATACENTER_SERVER_V 0x00000025
#endif
#ifndef PRODUCT_ENTERPRISE
#define PRODUCT_ENTERPRISE 0x00000004
#endif
#ifndef PRODUCT_ENTERPRISE_E
#define PRODUCT_ENTERPRISE_E 0x00000046
#endif
#ifndef PRODUCT_ENTERPRISE_N_EVALUATION
#define PRODUCT_ENTERPRISE_N_EVALUATION 0x00000054
#endif
#ifndef PRODUCT_ENTERPRISE_N
#define PRODUCT_ENTERPRISE_N 0x0000001B
#endif
#ifndef PRODUCT_ENTERPRISE_EVALUATION
#define PRODUCT_ENTERPRISE_EVALUATION 0x00000048
#endif
#ifndef PRODUCT_ENTERPRISE_SERVER
#define PRODUCT_ENTERPRISE_SERVER 0x0000000A
#endif
#ifndef PRODUCT_ENTERPRISE_SERVER_CORE
#define PRODUCT_ENTERPRISE_SERVER_CORE 0x0000000E
#endif
#ifndef PRODUCT_ENTERPRISE_SERVER_CORE_V
#define PRODUCT_ENTERPRISE_SERVER_CORE_V 0x00000029
#endif
#ifndef PRODUCT_ENTERPRISE_SERVER_IA64
#define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F
#endif
#ifndef PRODUCT_ENTERPRISE_SERVER_V
#define PRODUCT_ENTERPRISE_SERVER_V 0x00000026
#endif
#ifndef PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT
#define PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT 0x0000003B
#endif
#ifndef PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL
#define PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL 0x0000003C
#endif
#ifndef PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC
#define PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC 0x0000003D
#endif
#ifndef PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC
#define PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC 0x0000003E
#endif
#ifndef PRODUCT_HOME_BASIC
#define PRODUCT_HOME_BASIC 0x00000002
#endif
#ifndef PRODUCT_HOME_BASIC_E
#define PRODUCT_HOME_BASIC_E 0x00000043
#endif
#ifndef PRODUCT_HOME_BASIC_N
#define PRODUCT_HOME_BASIC_N 0x00000005
#endif
#ifndef PRODUCT_HOME_PREMIUM
#define PRODUCT_HOME_PREMIUM 0x00000003
#endif
#ifndef PRODUCT_HOME_PREMIUM_E
#define PRODUCT_HOME_PREMIUM_E 0x00000044
#endif
#ifndef PRODUCT_HOME_PREMIUM_N
#define PRODUCT_HOME_PREMIUM_N 0x0000001A
#endif
#ifndef PRODUCT_HOME_PREMIUM_SERVER
#define PRODUCT_HOME_PREMIUM_SERVER 0x00000022
#endif
#ifndef PRODUCT_HOME_SERVER
#define PRODUCT_HOME_SERVER 0x00000013
#endif
#ifndef PRODUCT_HYPERV
#define PRODUCT_HYPERV 0x0000002A
#endif
#ifndef PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT
#define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT 0x0000001E
#endif
#ifndef PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING
#define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING 0x00000020
#endif
#ifndef PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY
#define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY 0x0000001F
#endif
#ifndef PRODUCT_MULTIPOINT_STANDARD_SERVER
#define PRODUCT_MULTIPOINT_STANDARD_SERVER 0x0000004C
#endif
#ifndef PRODUCT_MULTIPOINT_PREMIUM_SERVER
#define PRODUCT_MULTIPOINT_PREMIUM_SERVER 0x0000004D
#endif
#ifndef PRODUCT_PROFESSIONAL
#define PRODUCT_PROFESSIONAL 0x00000030
#endif
#ifndef PRODUCT_PROFESSIONAL_E
#define PRODUCT_PROFESSIONAL_E 0x00000045
#endif
#ifndef PRODUCT_PROFESSIONAL_N
#define PRODUCT_PROFESSIONAL_N 0x00000031
#endif
#ifndef PRODUCT_PROFESSIONAL_WMC
#define PRODUCT_PROFESSIONAL_WMC 0x00000067
#endif
#ifndef PRODUCT_SB_SOLUTION_SERVER_EM
#define PRODUCT_SB_SOLUTION_SERVER_EM 0x00000036
#endif
#ifndef PRODUCT_SERVER_FOR_SB_SOLUTIONS
#define PRODUCT_SERVER_FOR_SB_SOLUTIONS 0x00000033
#endif
#ifndef PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM
#define PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM 0x00000037
#endif
#ifndef PRODUCT_SERVER_FOR_SMALLBUSINESS
#define PRODUCT_SERVER_FOR_SMALLBUSINESS 0x00000018
#endif
#ifndef PRODUCT_SERVER_FOR_SMALLBUSINESS_V
#define PRODUCT_SERVER_FOR_SMALLBUSINESS_V 0x00000023
#endif
#ifndef PRODUCT_SERVER_FOUNDATION
#define PRODUCT_SERVER_FOUNDATION 0x00000021
#endif
#ifndef PRODUCT_SB_SOLUTION_SERVER
#define PRODUCT_SB_SOLUTION_SERVER 0x00000032
#endif
#ifndef PRODUCT_SMALLBUSINESS_SERVER
#define PRODUCT_SMALLBUSINESS_SERVER 0x00000009
#endif
#ifndef PRODUCT_SMALLBUSINESS_SERVER_PREMIUM
#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x00000019
#endif
#ifndef PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE
#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE 0x0000003F
#endif
#ifndef PRODUCT_SOLUTION_EMBEDDEDSERVER
#define PRODUCT_SOLUTION_EMBEDDEDSERVER 0x00000038
#endif
#ifndef PRODUCT_STANDARD_EVALUATION_SERVER
#define PRODUCT_STANDARD_EVALUATION_SERVER 0x0000004F
#endif
#ifndef PRODUCT_STANDARD_SERVER
#define PRODUCT_STANDARD_SERVER 0x00000007
#endif
#ifndef PRODUCT_STANDARD_SERVER_CORE
#define PRODUCT_STANDARD_SERVER_CORE 0x0000000D
#endif
#ifndef PRODUCT_STANDARD_SERVER_V
#define PRODUCT_STANDARD_SERVER_V 0x00000024
#endif
#ifndef PRODUCT_STANDARD_SERVER_CORE_V
#define PRODUCT_STANDARD_SERVER_CORE_V 0x00000028
#endif
#ifndef PRODUCT_STANDARD_SERVER_SOLUTIONS
#define PRODUCT_STANDARD_SERVER_SOLUTIONS 0x00000034
#endif
#ifndef PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE
#define PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE 0x00000035
#endif
#ifndef PRODUCT_STARTER
#define PRODUCT_STARTER 0x0000000B
#endif
#ifndef PRODUCT_STARTER_E
#define PRODUCT_STARTER_E 0x00000042
#endif
#ifndef PRODUCT_STARTER_N
#define PRODUCT_STARTER_N 0x0000002F
#endif
#ifndef PRODUCT_STORAGE_ENTERPRISE_SERVER
#define PRODUCT_STORAGE_ENTERPRISE_SERVER 0x00000017
#endif
#ifndef PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE
#define PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE 0x0000002E
#endif
#ifndef PRODUCT_STORAGE_EXPRESS_SERVER
#define PRODUCT_STORAGE_EXPRESS_SERVER 0x00000014
#endif
#ifndef PRODUCT_STORAGE_EXPRESS_SERVER_CORE
#define PRODUCT_STORAGE_EXPRESS_SERVER_CORE 0x0000002B
#endif
#ifndef PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER
#define PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER 0x00000060
#endif
#ifndef PRODUCT_STORAGE_STANDARD_SERVER
#define PRODUCT_STORAGE_STANDARD_SERVER 0x00000015
#endif
#ifndef PRODUCT_STORAGE_STANDARD_SERVER_CORE
#define PRODUCT_STORAGE_STANDARD_SERVER_CORE 0x0000002C
#endif
#ifndef PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER
#define PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER 0x0000005F
#endif
#ifndef PRODUCT_STORAGE_WORKGROUP_SERVER
#define PRODUCT_STORAGE_WORKGROUP_SERVER 0x00000016
#endif
#ifndef PRODUCT_STORAGE_WORKGROUP_SERVER_CORE
#define PRODUCT_STORAGE_WORKGROUP_SERVER_CORE 0x0000002D
#endif
#ifndef PRODUCT_UNDEFINED
#define PRODUCT_UNDEFINED 0x00000000
#endif
#ifndef PRODUCT_ULTIMATE
#define PRODUCT_ULTIMATE 0x00000001
#endif
#ifndef PRODUCT_ULTIMATE_E
#define PRODUCT_ULTIMATE_E 0x00000047
#endif
#ifndef PRODUCT_ULTIMATE_N
#define PRODUCT_ULTIMATE_N 0x0000001C
#endif
#ifndef PRODUCT_WEB_SERVER
#define PRODUCT_WEB_SERVER 0x00000011
#endif
#ifndef PRODUCT_WEB_SERVER_CORE
#define PRODUCT_WEB_SERVER_CORE 0x0000001D
#endif
#ifndef SM_SERVERR2
#define SM_SERVERR2 89
#endif
#ifndef VER_SUITE_WH_SERVER
#define VER_SUITE_WH_SERVER 0x00008000
#endif
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
bool GetOsInfo(String &kernel, String &kerVersion, String &kerArchitecture, String &distro,
String &distVersion, String &desktop, String &deskVersion)
{
OSVERSIONINFOEX osvi;
SYSTEM_INFO si;
PGNSI pGNSI;
PGPI pGPI;
BOOL bOsVersionInfoEx;
ZeroMemory(&si, sizeof(SYSTEM_INFO));
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if(!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi)))
return false;
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
if(NULL != pGNSI)
pGNSI(&si);
else
GetSystemInfo(&si);
kerVersion = Format("%d.%d", (int)osvi.dwMajorVersion, (int)osvi.dwMinorVersion);
kernel = "Windows";
switch(si.wProcessorArchitecture) {
case PROCESSOR_ARCHITECTURE_AMD64: kerArchitecture = "64 bits"; break;
case PROCESSOR_ARCHITECTURE_IA64: kerArchitecture = "Itanium 64 bits"; break;
case PROCESSOR_ARCHITECTURE_INTEL: kerArchitecture = "32 bits"; break;
default: kerArchitecture = "Unknown";
}
if (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId && osvi.dwMajorVersion > 4) {
if (osvi.dwMajorVersion == 6) {
if (osvi.dwMinorVersion == 3) {
if (osvi.wProductType == VER_NT_WORKSTATION)
kernel.Cat(" 8.1");
else
kernel.Cat(" Server 2012 R2");
} else if (osvi.dwMinorVersion == 2) {
if (osvi.wProductType == VER_NT_WORKSTATION)
kernel.Cat(" 8");
else
kernel.Cat(" Server 2012");
} else if (osvi.dwMinorVersion == 1) {
if (osvi.wProductType == VER_NT_WORKSTATION)
kernel.Cat(" 7");
else
kernel.Cat(" Server 2008 R2");
} else if (osvi.dwMinorVersion == 0) {
if (osvi.wProductType == VER_NT_WORKSTATION)
kernel.Cat(" Vista");
else
kernel.Cat(" Server 2008");
}
pGPI = (PGPI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo");
DWORD dwType;
if (pGPI(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType)) {
switch(dwType) {
case PRODUCT_UNLICENSED: distro = "Unlicensed"; break;
case PRODUCT_BUSINESS: distro = "Business Edition"; break;
case PRODUCT_BUSINESS_N: distro = "Business Edition N"; break;
case PRODUCT_CLUSTER_SERVER: distro = "HPC Edition"; break;
case PRODUCT_CLUSTER_SERVER_V: distro = "Server Hyper Core V"; break;
case PRODUCT_CORE: distro = "Windows 8"; break;
case PRODUCT_CORE_N: distro = "Windows 8 N"; break;
case PRODUCT_CORE_COUNTRYSPECIFIC: distro = "Windows 8 China"; break;
case PRODUCT_CORE_SINGLELANGUAGE: distro = "Windows 8 Single Language"; break;
case PRODUCT_DATACENTER_EVALUATION_SERVER: distro = "Server Datacenter (evaluation installation)"; break;
case PRODUCT_DATACENTER_SERVER: distro = "Server Datacenter (full installation)"; break;
case PRODUCT_DATACENTER_SERVER_CORE: distro = "Server Datacenter (core installation)"; break;
case PRODUCT_DATACENTER_SERVER_CORE_V: distro = "Server Datacenter without Hyper-V (core installation)"; break;
case PRODUCT_DATACENTER_SERVER_V: distro = "Server Datacenter without Hyper-V (full installation)"; break;
case PRODUCT_ENTERPRISE: distro = "Enterprise"; break;
case PRODUCT_ENTERPRISE_E: distro = "Not supported"; break;
case PRODUCT_ENTERPRISE_N_EVALUATION: distro = "Enterprise N (evaluation installation)"; break;
case PRODUCT_ENTERPRISE_N: distro = "Enterprise N"; break;
case PRODUCT_ENTERPRISE_EVALUATION: distro = "Server Enterprise (evaluation installation)"; break;
case PRODUCT_ENTERPRISE_SERVER: distro = "Server Enterprise (full installation)"; break;
case PRODUCT_ENTERPRISE_SERVER_CORE: distro = "Server Enterprise (core installation)"; break;
case PRODUCT_ENTERPRISE_SERVER_CORE_V: distro = "Server Enterprise without Hyper-V (core installation)"; break;
case PRODUCT_ENTERPRISE_SERVER_IA64: distro = "Server Enterprise for Itanium-based Systems"; break;
case PRODUCT_ENTERPRISE_SERVER_V: distro = "Server Enterprise without Hyper-V (full installation)"; break;
case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT: distro = "Windows Essential Server Solution Management"; break;
case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL: distro = "Windows Essential Server Solution Additional"; break;
case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC: distro = "Windows Essential Server Solution Management SVC"; break;
case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC: distro = "Windows Essential Server Solution Additional SVC"; break;
case PRODUCT_HOME_BASIC: distro = "Home Basic"; break;
case PRODUCT_HOME_BASIC_E: distro = "Not supported"; break;
case PRODUCT_HOME_BASIC_N: distro = "Home Basic N"; break;
case PRODUCT_HOME_PREMIUM: distro = "Home Premium"; break;
case PRODUCT_HOME_PREMIUM_E: distro = "Not supported"; break;
case PRODUCT_HOME_PREMIUM_N: distro = "Home Premium N"; break;
case PRODUCT_HOME_PREMIUM_SERVER: distro = "Windows Home Server 2011"; break;
case PRODUCT_HOME_SERVER: distro = "Windows Storage Server 2008 R2 Essentials"; break;
case PRODUCT_HYPERV: distro = "Microsoft Hyper-V Server"; break;
case PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT: distro = "Windows Essential Business Server Management Server"; break;
case PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING: distro = "Windows Essential Business Server Messaging Server"; break;
case PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY: distro = "Windows Essential Business Server Security Server"; break;
case PRODUCT_MULTIPOINT_STANDARD_SERVER: distro = "Windows MultiPoint Server Standard (full installation)"; break;
case PRODUCT_MULTIPOINT_PREMIUM_SERVER: distro = "Windows MultiPoint Server Premium (full installation)"; break;
case PRODUCT_PROFESSIONAL: distro = "Professional"; break;
case PRODUCT_PROFESSIONAL_E: distro = "Not supported"; break;
case PRODUCT_PROFESSIONAL_N: distro = "Professional N"; break;
case PRODUCT_PROFESSIONAL_WMC: distro = "Professional with Media Center"; break;
case PRODUCT_SB_SOLUTION_SERVER_EM: distro = "Server For SB Solutions EM"; break;
case PRODUCT_SERVER_FOR_SB_SOLUTIONS: distro = "Server For SB Solutions"; break;
case PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM: distro = "Server For SB Solutions EM"; break;
case PRODUCT_SERVER_FOR_SMALLBUSINESS: distro = "Windows Server 2008 for Windows Essential Server Solutions"; break;
case PRODUCT_SERVER_FOR_SMALLBUSINESS_V: distro = "Windows Server 2008 without Hyper-V for Windows Essential Server Solutions"; break;
case PRODUCT_SERVER_FOUNDATION: distro = "Server Foundation"; break;
case PRODUCT_SB_SOLUTION_SERVER: distro = "Windows Small Business Server 2011 Essentials"; break;
case PRODUCT_SMALLBUSINESS_SERVER: distro = "Windows Small Business Server"; break;
case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: distro = "Small Business Server Premium"; break;
case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE: distro = "Small Business Server Premium (core installation)"; break;
case PRODUCT_SOLUTION_EMBEDDEDSERVER: distro = "Windows MultiPoint Server"; break;
case PRODUCT_STANDARD_EVALUATION_SERVER: distro = "Server Standard (evaluation installation)"; break;
case PRODUCT_STANDARD_SERVER: distro = "Server Standard"; break;
case PRODUCT_STANDARD_SERVER_CORE: distro = "Server Standard (core installation)"; break;
case PRODUCT_STANDARD_SERVER_V: distro = "Server Standard without Hyper-V"; break;
case PRODUCT_STANDARD_SERVER_CORE_V: distro = "Server Standard without Hyper-V (core installation)"; break;
case PRODUCT_STANDARD_SERVER_SOLUTIONS: distro = "Server Solutions Premium"; break;
case PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE: distro = "Server Solutions Premium (core installation)"; break;
case PRODUCT_STARTER: distro = "Starter"; break;
case PRODUCT_STARTER_E: distro = "Not supported"; break;
case PRODUCT_STARTER_N: distro = "Starter N"; break;
case PRODUCT_STORAGE_ENTERPRISE_SERVER: distro = "Storage Server Enterprise"; break;
case PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE: distro = "Storage Server Enterprise (core installation)"; break;
case PRODUCT_STORAGE_EXPRESS_SERVER: distro = "Storage Server Express"; break;
case PRODUCT_STORAGE_EXPRESS_SERVER_CORE: distro = "Storage Server Express (core installation)"; break;
case PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER: distro = "Storage Server Standard (evaluation installation)"; break;
case PRODUCT_STORAGE_STANDARD_SERVER: distro = "Storage Server Standard"; break;
case PRODUCT_STORAGE_STANDARD_SERVER_CORE: distro = "Storage Server Standard (core installation)"; break;
case PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER: distro = "Storage Server Workgroup (evaluation installation)"; break;
case PRODUCT_STORAGE_WORKGROUP_SERVER: distro = "Storage Server Workgroup"; break;
case PRODUCT_STORAGE_WORKGROUP_SERVER_CORE: distro = "Storage Server Workgroup (core installation)"; break;
case PRODUCT_UNDEFINED: distro = "An unknown product"; break;
case PRODUCT_ULTIMATE: distro = "Ultimate"; break;
case PRODUCT_ULTIMATE_E: distro = "Not supported"; break;
case PRODUCT_ULTIMATE_N: distro = "Ultimate N"; break;
case PRODUCT_WEB_SERVER: distro = "Web Server (full installation)"; break;
case PRODUCT_WEB_SERVER_CORE: distro = "Web Server (core installation)"; break;
}
}
} else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
if (GetSystemMetrics(SM_SERVERR2) )
kernel.Cat(" Server 2003 R2");
else if (osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER)
kernel.Cat(" Storage Server 2003");
else if (osvi.wSuiteMask & VER_SUITE_WH_SERVER)
kernel.Cat(" Home Server");
else if( osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
kernel.Cat(" XP Professional x64 Edition");
else
kernel.Cat(" Server 2003");
// Test for the server type.
if (osvi.wProductType != VER_NT_WORKSTATION ) {
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ) {
if(osvi.wSuiteMask & VER_SUITE_DATACENTER )
distro = "Datacenter Edition for Itanium-based Systems";
else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
distro = "Enterprise Edition for Itanium-based Systems";
}
} else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ) {
if(osvi.wSuiteMask & VER_SUITE_DATACENTER )
distro = "Datacenter x64 Edition";
else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
distro = "Enterprise x64 Edition";
else
distro = "Standard x64 Edition";
} else {
if (osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER )
distro = "Compute Cluster Edition";
else if(osvi.wSuiteMask & VER_SUITE_DATACENTER )
distro = "Datacenter Edition";
else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
distro = "Enterprise Edition";
else if (osvi.wSuiteMask & VER_SUITE_BLADE )
distro = "Web Edition";
else
distro = "Standard Edition";
}
} else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) {
kernel.Cat(" XP");
if(osvi.wSuiteMask & VER_SUITE_PERSONAL )
distro = "Home Edition";
else
distro = "Professional";
} else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) {
kernel.Cat(" 2000");
if (osvi.wProductType == VER_NT_WORKSTATION)
distro = "Professional";
else {
if(osvi.wSuiteMask & VER_SUITE_DATACENTER)
distro = "Datacenter Server";
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
distro = "Advanced Server";
else
distro = "Server";
}
}
// Include service pack (if any) and build number.
if(osvi.wServicePackMajor > 0)
kerVersion.Cat(Format(" %s", osvi.szCSDVersion));
kerVersion.Cat(Format(" (Build %d)", (int)osvi.dwBuildNumber));
} else if (osvi.dwPlatformId == 1) {
switch(osvi.dwMinorVersion) {
case 0:
kernel.Cat(" 95");
break;
case 10:
kernel.Cat(" 98");
break;
case 90:
kernel.Cat(" Millennium");
break;
}
distro = "";
} else if (osvi.dwPlatformId == 2) {
switch(osvi.dwMajorVersion) {
kernel.Cat(" NT");
case 3:
kernel.Cat(" 3.51");
break;
case 4:
kernel.Cat(" 4.0");
break;
}
distro = "";
}
desktop = kernel;
distVersion = deskVersion = "";
return true;
}
#endif
#ifdef PLATFORM_POSIX
static bool GetOsInfoCheckRelease(String &distro, String &distVersion) {
StringParse release;
for (FindFile ff("/etc/*-release"); ff; ff.Next())
release += LoadFile_Safe(ff.GetPath());
if (release.IsEmpty())
return false;
if(!release.GoAfter("DISTRIB_ID="))
if (!release.GoAfter("ID="))
return false;
distro = ToLower(release.GetText());
if (distro.IsEmpty())
return false;
if (!release.GoAfter_Init("DISTRIB_RELEASE="))
if (!release.GoAfter_Init("VERSION_ID="))
return false;
distVersion = ToLower(release.GetText());
return true;
}
bool GetOsInfo(String &kernel, String &kerVersion, String &kerArchitecture, String &distro, String &distVersion, String &desktop, String &deskVersion)
{
struct utsname buf;
if (0 == uname(&buf)) {
kernel = buf.sysname;
kerVersion = String(buf.release) + " " + String(buf.version);
kerArchitecture = buf.machine;
}
if (kernel.IsEmpty())
kernel = LoadFile_Safe("/proc/sys/kernel/ostype");
if (kernel.IsEmpty())
kernel = LoadFile_Safe("/proc/version");
if (kernel.IsEmpty()) {
if (Sys("sysctl_cmd -n kern.version").Find("FreeBSD") >= 0)
kernel = "freebsd";
}
if (kernel.IsEmpty())
kernel = ToLower(Sys("uname -s"));
if (kerVersion.IsEmpty())
kerVersion = LoadFile_Safe("/proc/sys/kernel/osrelease") + " " + LoadFile_Safe("/proc/sys/kernel/version");
if (kerVersion.IsEmpty())
kerArchitecture = ToLower(Sys("uname -v"));
if (kerArchitecture.IsEmpty())
kerArchitecture = ToLower(Sys("uname -m"));
// printenv
if (GetEnv("GNOME_DESKTOP_SESSION_ID").GetCount() || GetEnv("GNOME_KEYRING_SOCKET").GetCount()) {
desktop = "gnome";
StringParse gnomeVersion = Sys("gnome-about --version");
gnomeVersion.GoAfter("gnome-about");
deskVersion = gnomeVersion.GetText();
} else if (GetEnv("KDE_FULL_SESSION").GetCount() || GetEnv("KDEDIR").GetCount() || GetEnv("KDE_MULTIHEAD").GetCount()) {
desktop = "kde";
StringParse konsole = Sys("konsole --version");
konsole.GoAfter("KDE", ":");
deskVersion = konsole.GetText();
if (deskVersion.IsEmpty())
deskVersion = GetEnv("KDE_SESSION_VERSION");
} else if (GetEnv("MATE_KEYRING_CONTROL").GetCount()) {
desktop = "mate";
StringParse mateVersion = Sys("mate-about --version");
while (true) {
String str = mateVersion.GetText();
if (atof(str) > 0) {
deskVersion = str;
break;
} else if (str.IsEmpty())
break;
}
} else {
String str = GetEnv("CINNAMON_VERSION");
if (!str.IsEmpty()) {
desktop = "cinnamon";
deskVersion = str;
} else {
StringParse desktopStr = ToLower(Sys("xprop -root"));
if (desktopStr.Find("lxde") >= 0 || ToLower(GetEnv("DESKTOP_SESSION")) == "lxde") {
desktop = "lxde";
desktopStr.GoAfter("_ob_version", "=");
deskVersion = desktopStr.GetText();
} else if (desktopStr.Find("xfce") >= 0) {
desktopStr.GoAfter("_dt_save_mode", "=");
desktop = desktopStr.GetText();
StringParse xfceVersion = Sys(Format("%s-about --version", desktop));
while (true) {
String str = xfceVersion.GetText();
if (atof(str) > 0) {
deskVersion = str;
break;
} else if (str.IsEmpty())
break;
}
} else if (desktopStr.Find("enlightenment") >= 0) {
desktop = "enlightenment";
desktopStr.GoAfter("enlightenment_version", "=");
desktopStr = desktopStr.GetText();
if (desktopStr.GetText() == "enlightenment")
deskVersion = desktopStr.GetText();
} else
desktop = GetEnv("DESKTOP_SESSION");
}
}
if (GetOsInfoCheckRelease(distro, distVersion))
;
else if (FileExists("/usr/share/doc/ubuntu-minimal") || FileExists("/usr/share/ubuntu-docs"))
distro = "ubuntu";
else if (FileExists("/etc/fedora-release")) {
distro = "fedora";
StringParse strFile = LoadFile_Safe("/etc/fedora-release");
strFile.GoAfter("release");
distVersion = strFile.GetText();
} else if (FileExists("/etc/redhat-release")) {
distro = "redhat";
distVersion = LoadFile_Safe("/etc/redhat-release");
} else if (FileExists("/etc/SuSE-release")) {
StringParse strFile = LoadFile_Safe("/etc/SuSE-release");
distro = strFile.GetText();
strFile.GoAfter_Init("VERSION", "=");
distVersion = strFile.GetText();
} else if (FileExists("/etc/mandrake-release")) {
distro = "mandrake";
distVersion = LoadFile_Safe("/etc/mandrake-release");
} else if (FileExists("/etc/mandriva-release")) {
distro = "mandriva";
distVersion = LoadFile_Safe("/etc/mandriva-release");
} else if (FileExists("/etc/aurox-release")) {
distro = "aurox";
distVersion = LoadFile_Safe("/etc/aurox-release");
} else if (FileExists("/etc/altlinux-release")) {
distro = "altlinux";
distVersion = LoadFile_Safe("/etc/altlinux-releas");
} else if (FileExists("/etc/yellowdog-release")) {
distro = "yellowdog";
distVersion = LoadFile_Safe("/etc/gentoo-yellowdog");
} else if (FileExists("/etc/gentoo-release")) {
distro = "gentoo";
distVersion = LoadFile_Safe("/etc/gentoo-release");
} else if (FileExists("/usr/portage")) {
distro = "gentoo";
distVersion = LoadFile_Safe("/usr/portage");
} else if (FileExists("/etc/slackware-version")) {
distro = "slackware";
StringParse strFile = LoadFile_Safe("/etc/slackware-version");
strFile.GetText();
distVersion = strFile.GetText();
} else if (FileExists("/etc/debian_version")) {
distro = "debian";
distVersion = LoadFile_Safe("/etc/debian_version");
} else if (LoadFile_Safe("/etc/release").Find("Solaris") >= 0)
distro = "solaris";
else if (ToLower(Sys("uname -r")).Find("freebsd") >= 0)
distro = "freebsd";
else if (ToLower(Sys("uname -r")).Find("solaris") >= 0)
distro = "solaris";
else {
distro = LoadFile_Safe("/etc/osname_version");
distVersion = "";
}
if (distro.IsEmpty())
distro = LoadFile_Safe("/etc/issue");
if (distro.IsEmpty())
distro = distVersion = "UNKNOWN";
return true;
}
#endif
END_UPP_NAMESPACE

View file

@ -1,618 +0,0 @@
#include "SysInfo_in.h"
#include <plugin/png/png.h>
#include <plugin/jpg/jpg.h>
#include <plugin/bmp/bmp.h>
NAMESPACE_UPP
bool Window_SaveCapture(int64 windowId, String fileName, int left, int top, int width, int height)
{
if ((width <= 0 && width != -1) || (height <= 0 && height != -1))
return false;
Image img = Window_SaveCapture(windowId, left, top, width, height);
if (IsNull(img))
return false;
if (GetFileExt(fileName) == ".png") {
PNGEncoder encoder;
return encoder.SaveFile(fileName, img);
} else if (GetFileExt(fileName) == ".jpg") {
JPGEncoder encoder(90);
return encoder.SaveFile(fileName, img);
} else if (GetFileExt(fileName) == ".bmp") {
BMPEncoder encoder;
return encoder.SaveFile(fileName, img);
} else
return false;
}
#if defined(PLATFORM_WIN32) || defined (PLATFORM_WIN64)
#if defined(__MINGW32__)
#define labs(x) labs((Upp::int64)(x))
#elif defined(_MSC_VER)
#define labs(x) abs(x)
#endif
Rect GetDesktopRect() {
HWND wH = GetDesktopWindow();
RECT rc;
if (!GetWindowRect(wH, &rc))
return Null;
Rect ret(rc.left, rc.top, rc.right, rc.bottom);
return ret;
}
Image Window_SaveCapture(int64 windowId, int left, int top, int width, int height) {
if ((width <= 0 && width != -1) || (height <= 0 && height != -1))
return Null;
HWND wH = reinterpret_cast<HWND>(windowId);
if (wH == 0)
wH = GetDesktopWindow();
RECT rc;
if (!GetWindowRect(wH, &rc))
return Null;
if (left == -1)
left = rc.left;
if (top == -1)
top = rc.top;
if (width == -1)
width = rc.right - rc.left;
if (height == -1)
height = rc.bottom - rc.top;
HDC hDC = NULL;
HDC memDC = NULL;
HBITMAP hb = NULL;
HBITMAP oldBM = NULL;
Image img = Null;
ImageBuffer b;
if ((hDC = GetDC(0)) == NULL)
goto end;
if ((memDC = CreateCompatibleDC(hDC)) == NULL)
goto end;
if ((hb = CreateCompatibleBitmap(hDC, width, height)) == NULL)
goto end;
if ((oldBM = (HBITMAP)SelectObject(memDC, hb)) == NULL)
goto end;
if (!BitBlt(memDC, 0, 0, width, height , hDC, left, top, SRCCOPY))
goto end;
BITMAPINFO bmpInfo;
ZeroMemory(&bmpInfo, sizeof(BITMAPINFO));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
if (!GetDIBits(hDC, hb, 0, 0, NULL, &bmpInfo, DIB_RGB_COLORS))
goto end;
if(bmpInfo.bmiHeader.biSizeImage <= 0)
bmpInfo.bmiHeader.biSizeImage = bmpInfo.bmiHeader.biWidth*labs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biHeight = -height;
b.Create(width, height);
if (!GetDIBits(hDC, hb, 0, height, ~b, (BITMAPINFO *)&bmpInfo.bmiHeader, DIB_RGB_COLORS))
goto end;
img = b;
end:
SelectObject(hDC, oldBM);
DeleteObject(hb);
DeleteDC(memDC);
ReleaseDC(0, hDC);
return img;
}
class ScreenGrab {
private:
enum {GRAB_MODE_DESKTOP, GRAB_MODE_WINDOW, GRAB_MODE_RECT};
static HDC lDCDest;
static HGDIOBJ lDib;
static void *lDibPtr;
static HGDIOBJ lBmpOld;
static BITMAPINFO tBmpInfo;
static PAVIFILE lAVIPtrFile;
static PAVISTREAM lAVIPtrStrm;
static AVISTREAMINFO tAVIHdr;
static AVIFILEINFO tAVIFile;
long lAVICnt;
double frameRate;
long numFrames; // number of frames in video stream
long firstFrame; // position of the first video frame
String fileName;
bool viewMouse;
bool opened;
int grabMode;
uint64 hwnd;
int left;
int top;
int width;
int height;
bool AVIOpen(bool create = true);
bool AVIWrite();
void AVIClose();
HICON GetCursorHandle();
bool DIBCreate(HWND lHandleSource, long lWidth, long lHeight, long lPosX, long lPosY);
void DIBClean();
bool ScreenshotMemory();
public:
ScreenGrab(String fileName, double secsFrame = 1, bool viewMouse = true);
~ScreenGrab();
bool IniGrabDesktop();
bool IniGrabWindow(uint64 handle);
bool IniGrabDesktopRectangle(int left, int top, int width, int height);
bool Grab(unsigned duration);
bool GrabSnapshot();
void Close();
};
bool Record_Desktop(String fileName, int duration, double secsFrame, bool viewMouse)
{
ScreenGrab grab(fileName, secsFrame, viewMouse);
if (!grab.IniGrabDesktop())
return false;
if (!grab.Grab(duration))
return false;
grab.Close();
return true;
}
bool Record_DesktopRectangle(String fileName, int duration, int left, int top, int width, int height, double secsFrame, bool viewMouse)
{
ScreenGrab grab(fileName, secsFrame, viewMouse);
if (!grab.IniGrabDesktopRectangle(left, top, width, height))
return false;
if (!grab.Grab(duration))
return false;
grab.Close();
return true;
}
bool Record_Window(String fileName, int duration, int64 handle, double secsFrame, bool viewMouse)
{
ScreenGrab grab(fileName, secsFrame, viewMouse);
if (!grab.IniGrabWindow(handle))
return false;
if (!grab.Grab(duration))
return false;
grab.Close();
return true;
}
bool ScreenGrab::AVIOpen(bool create)
{
long lRet, mode, res;
AVIFileInit();
if (create)
mode = OF_CREATE | OF_WRITE;
else
mode = OF_SHARE_DENY_WRITE;
lRet = AVIFileOpen(&lAVIPtrFile, fileName, mode, 0);
if (lRet == AVIERR_OK && create) {
tAVIHdr.fccType = streamtypeVIDEO;
tAVIHdr.fccHandler = 0;
tAVIHdr.dwScale = 100;
tAVIHdr.dwRate = (DWORD)(tAVIHdr.dwScale*frameRate);
//tAVIHdr.dwQuality = -1;
tAVIHdr.dwSuggestedBufferSize = tBmpInfo.bmiHeader.biSizeImage;
SetRect(&(tAVIHdr.rcFrame), 0, 0, tBmpInfo.bmiHeader.biWidth, tBmpInfo.bmiHeader.biHeight);
lRet = AVIFileCreateStream(lAVIPtrFile, &lAVIPtrStrm, &tAVIHdr);
if (lRet == AVIERR_OK) {
lRet = AVIStreamSetFormat(lAVIPtrStrm, 0, &(tBmpInfo.bmiHeader), sizeof(tBmpInfo.bmiHeader));
if (lRet == AVIERR_OK)
lAVICnt = 0;
}
} else {
res = AVIFileGetStream(lAVIPtrFile, &lAVIPtrStrm, streamtypeVIDEO, 0);
if (res != AVIERR_OK)
return false;
firstFrame = AVIStreamStart(lAVIPtrStrm);
if (firstFrame != -1)
return false;
numFrames = AVIStreamLength(lAVIPtrStrm);
if (numFrames == -1)
return false;
res = AVIFileInfo(lAVIPtrFile, &tAVIFile, sizeof(tAVIFile));
if (res != AVIERR_OK)
return false;
res = AVIStreamInfo(lAVIPtrStrm, &tAVIHdr, sizeof(tAVIHdr));
if (res != AVIERR_OK)
return false;
}
return true;
}
bool ScreenGrab::AVIWrite()
{
HRESULT lRet;
lRet = AVIStreamWrite(lAVIPtrStrm, lAVICnt, 1, lDibPtr, tBmpInfo.bmiHeader.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);
if (lRet == AVIERR_OK) {
lAVICnt++;
return true;
} else
return false;
}
void ScreenGrab::AVIClose()
{
if (lAVIPtrStrm != 0)
AVIStreamClose(lAVIPtrStrm);
if (lAVIPtrFile != 0)
AVIFileClose(lAVIPtrFile);
AVIFileExit();
}
HICON ScreenGrab::GetCursorHandle()
{
HWND lHandle;
POINT lpPos;
long lThreadID;
long lCurrentThreadID;
GetCursorPos(&lpPos);
lHandle = WindowFromPoint(lpPos);
lThreadID = GetWindowThreadProcessId(lHandle, 0);
lCurrentThreadID = GetWindowThreadProcessId(reinterpret_cast<HWND>(GetWindowIdFromProcessId(GetProcessId())), 0);
HICON ret;
if (lThreadID != lCurrentThreadID) {
if (AttachThreadInput(lCurrentThreadID, lThreadID, true)) {
ret = GetCursor();
AttachThreadInput(lCurrentThreadID, lThreadID, false);
}
} else
ret = GetCursor();
return ret;
}
bool ScreenGrab::DIBCreate(HWND lHandleSource, long lWidth, long lHeight, long lPosX, long lPosY)
{
HDC lDCSource, lDCSourceDesktop;
POINT lpCursorPos;
lDCSource = GetWindowDC(lHandleSource);
lDCSourceDesktop = GetWindowDC(0);
bool ret = false;
if (lDCSource != 0 && lDCSourceDesktop != 0) {
lDCDest = CreateCompatibleDC(lDCSource);
if (lDCDest != 0) {
tBmpInfo.bmiHeader.biSize = sizeof(tBmpInfo.bmiHeader);
tBmpInfo.bmiHeader.biWidth = lWidth;
tBmpInfo.bmiHeader.biHeight = lHeight;
tBmpInfo.bmiHeader.biPlanes = 1;
tBmpInfo.bmiHeader.biBitCount = 24;
tBmpInfo.bmiHeader.biCompression = 0;
tBmpInfo.bmiHeader.biSizeImage = ((tBmpInfo.bmiHeader.biWidth * 3 + 3) & 0xFFFFFFFC) * tBmpInfo.bmiHeader.biHeight;
lDib = CreateDIBSection(lDCDest, &tBmpInfo, 0, &lDibPtr, 0, 0);
if (lDib != 0) {
lBmpOld = SelectObject(lDCDest, lDib);
BitBlt(lDCDest, 0, 0, lWidth, lHeight, lDCSourceDesktop, lPosX, lPosY, 0xCC0020);
if (viewMouse) {
GetCursorPos(&lpCursorPos);
DrawIcon(lDCDest, lpCursorPos.x - lPosX, lpCursorPos.y - lPosY, GetCursorHandle());
}
ret = true;
}
}
}
ReleaseDC(lHandleSource, lDCSource);
ReleaseDC(0, lDCSourceDesktop);
return ret;
}
void ScreenGrab::DIBClean()
{
SelectObject(lDCDest, lBmpOld);
DeleteDC(lDCDest);
DeleteObject(lDib);
}
bool ScreenGrab::ScreenshotMemory()
{
HWND lHandle;
RECT lpRect;
long lWidth, lHeight;
long lPosX, lPosY;
switch (grabMode) {
case GRAB_MODE_DESKTOP:
lHandle = GetDesktopWindow();
GetWindowRect(lHandle, &lpRect);
lWidth = lpRect.right - lpRect.left;
lHeight = lpRect.bottom - lpRect.top;
lPosX = lpRect.left;
lPosY = lpRect.top;
break;
case GRAB_MODE_WINDOW:
lHandle = reinterpret_cast<HWND>(hwnd);
GetWindowRect(lHandle, &lpRect);
lWidth = lpRect.right - lpRect.left;
lHeight = lpRect.bottom - lpRect.top;
lPosX = lpRect.left;
lPosY = lpRect.top;
break;
case GRAB_MODE_RECT:
lHandle = GetDesktopWindow();
GetWindowRect(lHandle, &lpRect);
lWidth = width;
lHeight = height;
lPosX = left;
lPosY = top;
break;
default:
throw Exc(t_("Unknown grab mode"));
return false;
}
if (DIBCreate(lHandle, lWidth, lHeight, lPosX, lPosY))
return true;
else
return false;
}
HDC ScreenGrab::lDCDest;
HGDIOBJ ScreenGrab::lDib;
void *ScreenGrab::lDibPtr;
HGDIOBJ ScreenGrab::lBmpOld;
PAVIFILE ScreenGrab::lAVIPtrFile;
PAVISTREAM ScreenGrab::lAVIPtrStrm;
BITMAPINFO ScreenGrab::tBmpInfo;
AVISTREAMINFO ScreenGrab::tAVIHdr;
AVIFILEINFO ScreenGrab::tAVIFile;
ScreenGrab::ScreenGrab(String _fileName, double secsFrame, bool _viewMouse)
{
opened = false;
fileName = _fileName;
viewMouse = _viewMouse;
frameRate = 1./secsFrame;
}
ScreenGrab::~ScreenGrab()
{
Close();
}
void ScreenGrab::Close()
{
if (!opened)
return;
AVIClose();
DIBClean();
opened = false;
}
bool ScreenGrab::IniGrabDesktop()
{
opened = true;
grabMode = GRAB_MODE_DESKTOP;
if (!ScreenshotMemory())
return false;
if (!AVIOpen())
return false;
return true;
}
bool ScreenGrab::IniGrabWindow(uint64 handle)
{
opened = true;
grabMode = GRAB_MODE_WINDOW;
hwnd = handle;
if (!ScreenshotMemory())
return false;
if (!AVIOpen())
return false;
return true;
}
bool ScreenGrab::IniGrabDesktopRectangle(int _left, int _top, int _width, int _height)
{
opened = true;
grabMode = GRAB_MODE_RECT;
left = _left;
top = _top;
width = _width;
height = _height;
if (!ScreenshotMemory())
return false;
if (!AVIOpen())
return false;
return true;
}
bool ScreenGrab::Grab(unsigned duration)
{
if (!opened)
return false;
TimeStop timer;
timer.Reset();
while (timer.Elapsed() < duration*1000) {
if (!ScreenshotMemory())
return false;
if (!AVIWrite())
return false;
while (timer.Elapsed() < (lAVICnt*1000.)/frameRate)
Sleep(10);//DoEvents();
}
return true;
}
bool ScreenGrab::GrabSnapshot()
{
if (!opened)
return false;
if (!ScreenshotMemory())
return false;
if (!AVIWrite())
return false;
return true;
}
#endif
#ifdef PLATFORM_POSIX
Window GetToplevelParent(_XDisplay *display, Window window) {
Window parent;
Window root;
Window *children;
unsigned int numChildren;
while (true) {
if (0 == XQueryTree(display, window, &root, &parent, &children, &numChildren))
return -1;
if (children)
XFree(children);
if (window == root || parent == root)
return window;
else
window = parent;
}
}
Rect GetDesktopRect() {
SetSysInfoX11ErrorHandler();
_XDisplay *dpy = XOpenDisplay (NULL);
if (!dpy) {
SetX11ErrorHandler();
return Null;
}
int screen = DefaultScreen(dpy);
int64 windowId = RootWindow(dpy, screen);
XWindowAttributes rc;
if (!XGetWindowAttributes(dpy, windowId, &rc)) {
XCloseDisplay(dpy);
SetX11ErrorHandler();
return Null;
}
Rect ret(rc.x, rc.y, rc.x + rc.width, rc.y + rc.height);
XCloseDisplay(dpy);
SetX11ErrorHandler();
return ret;
}
Image Window_SaveCapture(int64 windowId, int left, int top, int width, int height)
{
if ((width <= 0 && width != -1) || (height <= 0 && height != -1))
return Null
SetSysInfoX11ErrorHandler();
_XDisplay *dpy = XOpenDisplay (NULL);
if (!dpy) {
SetX11ErrorHandler();
return Null;
}
int screen = DefaultScreen(dpy);
if (windowId == 0)
windowId = RootWindow(dpy, screen);
else {
windowId = GetToplevelParent(dpy, windowId);
if (windowId < 0) {
SetX11ErrorHandler();
return Null;
}
}
XWindowAttributes rc;
if (!XGetWindowAttributes(dpy, windowId, &rc)) {
XCloseDisplay(dpy);
SetX11ErrorHandler();
return Null;
}
if (left == -1)
left = rc.x;
if (top == -1)
top = rc.y;
if (width == -1)
width = rc.width;
if (height == -1)
height = rc.height;
XImage *image = XGetImage(dpy, windowId, left, top, width, height, XAllPlanes(), ZPixmap);
if (image == NULL) {
XCloseDisplay(dpy);
SetX11ErrorHandler();
return Null;
}
ImageBuffer ib(width, height);
unsigned long red_mask = image->red_mask;
unsigned long green_mask = image->green_mask;
unsigned long blue_mask = image->blue_mask;
for (int y = 0; y < height; y++) {
RGBA *row = ib[y];
for (int x = 0; x < width ; x++) {
unsigned long pixel = XGetPixel(image, x, y);
unsigned char blue = pixel & blue_mask;
unsigned char green = (pixel & green_mask) >> 8;
unsigned char red = (pixel & red_mask) >> 16;
(row + x)->r = red;
(row + x)->g = green;
(row + x)->b = blue;
}
}
XCloseDisplay(dpy);
SetX11ErrorHandler();
Image img;
img = ib;
return img;
}
#endif
bool Snap_Desktop(String fileName)
{
return Window_SaveCapture(0, fileName);
}
bool Snap_DesktopRectangle(String fileName, int left, int top, int width, int height)
{
return Window_SaveCapture(0, fileName, left, top, width, height);
}
bool Snap_Window(String fileName, int64 handle)
{
return Window_SaveCapture(handle, fileName);
}
Image Snap_Desktop()
{
return Window_SaveCapture(0);
}
Image Snap_DesktopRectangle(int left, int top, int width, int height)
{
return Window_SaveCapture(0, left, top, width, height);
}
Image Snap_Window(int64 handle)
{
return Window_SaveCapture(handle);
}
END_UPP_NAMESPACE