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 Wine version, or null if not running under Wine.
101 string getWineVersion()
102 {
103 	auto ntdll = GetModuleHandle("ntdll.dll");
104 	if (!ntdll)
105 		return null;
106 	alias wine_get_version_t = extern(C) const(char*) function();
107 	auto wine_get_version = cast(wine_get_version_t)GetProcAddress(ntdll, "wine_get_version");
108 	if (!wine_get_version)
109 		return null;
110 	import std.conv : to;
111 	return wine_get_version().to!string();
112 }