Set OpenRA.Game.exe icon to match the mod.
This commit is contained in:
@@ -23,6 +23,34 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
class WindowsLauncher
|
class WindowsLauncher
|
||||||
{
|
{
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
static extern int SendMessage(IntPtr hwnd, uint message, uint wParam, IntPtr lParam);
|
||||||
|
|
||||||
|
[DllImport("shell32.dll")]
|
||||||
|
static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
public extern static bool DestroyIcon(IntPtr handle);
|
||||||
|
|
||||||
|
struct SHFILEINFO
|
||||||
|
{
|
||||||
|
// Native type: HICON
|
||||||
|
public IntPtr hIcon;
|
||||||
|
|
||||||
|
public int iIcon;
|
||||||
|
public uint dwAttributes;
|
||||||
|
|
||||||
|
// Native type: TCHAR[MAX_PATH]
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
|
||||||
|
|
||||||
|
public string szDisplayName;
|
||||||
|
|
||||||
|
// Native type: TCHAR[80]
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
|
||||||
|
|
||||||
|
public string szTypeName;
|
||||||
|
}
|
||||||
|
|
||||||
static Process gameProcess;
|
static Process gameProcess;
|
||||||
|
|
||||||
// Constants to be replaced by the wrapper / compilation script
|
// Constants to be replaced by the wrapper / compilation script
|
||||||
@@ -30,6 +58,9 @@ namespace OpenRA
|
|||||||
const string DisplayName = "DISPLAY_NAME";
|
const string DisplayName = "DISPLAY_NAME";
|
||||||
const string FaqUrl = "FAQ_URL";
|
const string FaqUrl = "FAQ_URL";
|
||||||
|
|
||||||
|
// References to the OpenRA.Game.exe icons for later cleanup
|
||||||
|
static IntPtr[] iconHandle = { IntPtr.Zero, IntPtr.Zero };
|
||||||
|
|
||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
@@ -60,6 +91,21 @@ namespace OpenRA
|
|||||||
if (gameProcess == null)
|
if (gameProcess == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (Platform.CurrentPlatform == PlatformType.Windows)
|
||||||
|
{
|
||||||
|
// Set the OpenRA.Game.exe icon to match the mod
|
||||||
|
// Icon.ExtractAssociatedIcon sets only the 32px icon,
|
||||||
|
// so we use native functions to set both 16 and 32px versions.
|
||||||
|
gameProcess.WaitForInputIdle();
|
||||||
|
SHFILEINFO sfi = new SHFILEINFO();
|
||||||
|
for (var i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
SHGetFileInfo(Assembly.GetExecutingAssembly().Location, 0, ref sfi, (uint)Marshal.SizeOf(sfi), (uint)(0x100 + i));
|
||||||
|
iconHandle[i] = sfi.hIcon;
|
||||||
|
SendMessage(gameProcess.MainWindowHandle, 0x80, (uint)(1 - i), sfi.hIcon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gameProcess.EnableRaisingEvents = true;
|
gameProcess.EnableRaisingEvents = true;
|
||||||
gameProcess.Exited += GameProcessExited;
|
gameProcess.Exited += GameProcessExited;
|
||||||
|
|
||||||
@@ -147,6 +193,11 @@ namespace OpenRA
|
|||||||
if (gameProcess.ExitCode != (int)RunStatus.Success)
|
if (gameProcess.ExitCode != (int)RunStatus.Success)
|
||||||
ShowErrorDialog();
|
ShowErrorDialog();
|
||||||
|
|
||||||
|
if (Platform.CurrentPlatform == PlatformType.Windows)
|
||||||
|
foreach (var handle in iconHandle)
|
||||||
|
if (handle != IntPtr.Zero)
|
||||||
|
DestroyIcon(handle);
|
||||||
|
|
||||||
Exit();
|
Exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user