BsWin32PlatformUtility.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "BsPrerequisitesUtil.h"
  2. #include <windows.h>
  3. #include <iphlpapi.h>
  4. namespace BansheeEngine
  5. {
  6. void PlatformUtility::terminate(bool force)
  7. {
  8. if (!force)
  9. PostQuitMessage(0);
  10. else
  11. TerminateProcess(GetCurrentProcess(), 0);
  12. }
  13. double PlatformUtility::queryPerformanceTimerMs()
  14. {
  15. LARGE_INTEGER counterValue;
  16. QueryPerformanceCounter(&counterValue);
  17. LARGE_INTEGER counterFreq;
  18. QueryPerformanceFrequency(&counterFreq);
  19. return (double)counterValue.QuadPart / (counterFreq.QuadPart * 0.001);
  20. }
  21. void PlatformUtility::copyToClipboard(const WString& string)
  22. {
  23. HANDLE hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (string.size() + 1) * sizeof(WString::value_type));
  24. WString::value_type* buffer = (WString::value_type*)GlobalLock(hData);
  25. string.copy(buffer, string.size());
  26. buffer[string.size()] = '\0';
  27. GlobalUnlock(hData);
  28. if (OpenClipboard(NULL))
  29. {
  30. EmptyClipboard();
  31. SetClipboardData(CF_UNICODETEXT, hData);
  32. CloseClipboard();
  33. }
  34. else
  35. {
  36. GlobalFree(hData);
  37. }
  38. }
  39. WString PlatformUtility::copyFromClipboard()
  40. {
  41. if (OpenClipboard(NULL))
  42. {
  43. HANDLE hData = GetClipboardData(CF_UNICODETEXT);
  44. if (hData != NULL)
  45. {
  46. WString::value_type* buffer = (WString::value_type*)GlobalLock(hData);
  47. WString string(buffer);
  48. GlobalUnlock(hData);
  49. CloseClipboard();
  50. return string;
  51. }
  52. else
  53. {
  54. CloseClipboard();
  55. return L"";
  56. }
  57. }
  58. return L"";
  59. }
  60. WString PlatformUtility::keyCodeToUnicode(UINT32 keyCode)
  61. {
  62. static HKL keyboardLayout = GetKeyboardLayout(0);
  63. static UINT8 keyboarState[256];
  64. if (GetKeyboardState(keyboarState) == FALSE)
  65. return 0;
  66. UINT virtualKey = MapVirtualKeyExW(keyCode, 1, keyboardLayout);
  67. wchar_t output[2];
  68. int count = ToUnicodeEx(virtualKey, keyCode, keyboarState, output, 2, 0, keyboardLayout);
  69. if (count > 0)
  70. return WString(output, count);
  71. return StringUtil::WBLANK;
  72. }
  73. bool PlatformUtility::getMACAddress(MACAddress& address)
  74. {
  75. std::memset(&address, 0, sizeof(address));
  76. PIP_ADAPTER_INFO adapterInfo = bs_alloc<IP_ADAPTER_INFO>();
  77. ULONG len = sizeof(IP_ADAPTER_INFO);
  78. DWORD rc = GetAdaptersInfo(adapterInfo, &len);
  79. if (rc == ERROR_BUFFER_OVERFLOW)
  80. {
  81. bs_free(adapterInfo);
  82. adapterInfo = reinterpret_cast<IP_ADAPTER_INFO*>(bs_alloc(len));
  83. }
  84. else if (rc != ERROR_SUCCESS)
  85. {
  86. bs_free(adapterInfo);
  87. return false;
  88. }
  89. if (GetAdaptersInfo(adapterInfo, &len) == NO_ERROR)
  90. {
  91. PIP_ADAPTER_INFO curAdapter = nullptr;
  92. curAdapter = adapterInfo;
  93. while (curAdapter)
  94. {
  95. if (curAdapter->Type == MIB_IF_TYPE_ETHERNET && curAdapter->AddressLength == sizeof(address))
  96. {
  97. std::memcpy(&address, curAdapter->Address, curAdapter->AddressLength);
  98. return true;
  99. }
  100. curAdapter = curAdapter->Next;
  101. }
  102. }
  103. bs_free(adapterInfo);
  104. return false;
  105. }
  106. String PlatformUtility::generateUUID()
  107. {
  108. UUID uuid;
  109. UuidCreate(&uuid);
  110. UINT8* uuidStr;
  111. UuidToStringA(&uuid, &uuidStr);
  112. String output((char*)uuidStr);
  113. RpcStringFreeA(&uuidStr);
  114. return output;
  115. }
  116. void PlatformUtility::open(const Path& path)
  117. {
  118. ShellExecute(nullptr, "open", path.toString().c_str(), nullptr, nullptr, SW_SHOWNORMAL);
  119. }
  120. }