BsWin32PlatformUtility.cpp 3.5 KB

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