1 /** 2 * Miscellaneous Windows utility code. 3 * 4 * License: 5 * This Source Code Form is subject to the terms of 6 * the Mozilla Public License, v. 2.0. If a copy of 7 * the MPL was not distributed with this file, You 8 * can obtain one at http://mozilla.org/MPL/2.0/. 9 * 10 * Authors: 11 * Vladimir Panteleev <vladimir@thecybershadow.net> 12 */ 13 14 module ae.sys.windows.misc; 15 version (Windows): 16 17 import std.string; 18 19 import ae.sys.windows.imports; 20 mixin(importWin32!q{winbase}); 21 mixin(importWin32!q{wincon}); 22 mixin(importWin32!q{winnt}); 23 mixin(importWin32!q{winuser}); 24 25 import ae.sys.windows.exception; 26 import ae.sys.windows.text; 27 28 LARGE_INTEGER largeInteger(long n) pure nothrow @nogc 29 { 30 LARGE_INTEGER li; li.QuadPart = n; return li; 31 } 32 33 ULARGE_INTEGER ulargeInteger(ulong n) pure nothrow @nogc 34 { 35 ULARGE_INTEGER li; li.QuadPart = n; return li; 36 } 37 38 ulong makeUlong(DWORD dwLow, DWORD dwHigh) pure nothrow @nogc 39 { 40 ULARGE_INTEGER li; 41 li.LowPart = dwLow; 42 li.HighPart = dwHigh; 43 return li.QuadPart; 44 } 45 46 // *************************************************************************** 47 48 // Messages 49 50 void processWindowsMessages()() 51 { 52 MSG m; 53 while (PeekMessageW(&m, null, 0, 0, PM_REMOVE)) 54 { 55 TranslateMessage(&m); 56 DispatchMessageW(&m); 57 } 58 } 59 60 void messageLoop()() 61 { 62 MSG m; 63 while (GetMessageW(&m, null, 0, 0)) 64 { 65 TranslateMessage(&m); 66 DispatchMessageW(&m); 67 } 68 } 69 70 // *************************************************************************** 71 72 int messageBox()(string message, string title, int style=0) 73 { 74 return MessageBoxW(null, toWStringz(message), toWStringz(title), style); 75 } 76 77 uint getLastInputInfo()() 78 { 79 LASTINPUTINFO lii = { LASTINPUTINFO.sizeof }; 80 wenforce(GetLastInputInfo(&lii), "GetLastInputInfo"); 81 return lii.dwTime; 82 } 83 84 // *************************************************************************** 85 86 /// Hides the console window, but only if we are the owner. 87 void hideOwnConsoleWindow()() 88 { 89 HWND w = GetConsoleWindow(); 90 if (!w) 91 return; 92 DWORD pid; 93 GetWindowThreadProcessId(w, &pid); 94 if (pid == GetCurrentProcessId()) 95 ShowWindow(w, SW_HIDE); 96 } 97 98 // *************************************************************************** 99 100 /// Returns true if the host Windows OS is 64-bit. 101 bool isWin64() 102 { 103 version (D_LP64) 104 return true; // host must be 64-bit if this compiles 105 else 106 { 107 import core.sys.windows.winbase : IsWow64Process, GetCurrentProcess; 108 int is64; 109 IsWow64Process(GetCurrentProcess(), &is64).wenforce("IsWow64Process"); 110 return !!is64; 111 } 112 } 113 114 /// Returns Wine version, or null if not running under Wine. 115 string getWineVersion() 116 { 117 auto ntdll = GetModuleHandle("ntdll.dll"); 118 if (!ntdll) 119 return null; 120 alias wine_get_version_t = extern(C) const(char*) function(); 121 auto wine_get_version = cast(wine_get_version_t)GetProcAddress(ntdll, "wine_get_version"); 122 if (!wine_get_version) 123 return null; 124 import std.conv : to; 125 return wine_get_version().to!string(); 126 }