aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS.WinForms/Commands.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ShiftOS.WinForms/Commands.cs')
-rw-r--r--ShiftOS.WinForms/Commands.cs108
1 files changed, 108 insertions, 0 deletions
diff --git a/ShiftOS.WinForms/Commands.cs b/ShiftOS.WinForms/Commands.cs
new file mode 100644
index 0000000..9fb1785
--- /dev/null
+++ b/ShiftOS.WinForms/Commands.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ShiftOS.Engine;
+using System.IO;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Threading;
+
+namespace ShiftOS.WinForms
+{
+ [Namespace("coherence")]
+ [RequiresUpgrade("kernel_coherence")]
+ public static class CoherenceCommands
+ {
+ [DllImport("user32.dll")]
+ static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
+
+ static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
+ const UInt32 SWP_SHOWWINDOW = 0x0040;
+
+
+
+ [DllImport("user32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct RECT
+ {
+ public int Left; // x position of upper-left corner
+ public int Top; // y position of upper-left corner
+ public int Right; // x position of lower-right corner
+ public int Bottom; // y position of lower-right corner
+ }
+
+ [Command("launch", "process: \"C:\\path\\to\\process\" - The process path to launch.", "Launch a process inside kernel coherence.")]
+ [RequiresArgument("process")]
+ public static bool LaunchApp(Dictionary<string, object> args)
+ {
+ string process = args["process"].ToString();
+ var prc = Process.Start(process);
+ StartCoherence(prc);
+ return true;
+ }
+
+ private static void StartCoherence(Process prc)
+ {
+ RECT rct = new RECT();
+
+
+ while (!GetWindowRect(prc.MainWindowHandle, ref rct))
+ {
+ }
+
+
+
+ AppearanceManager.Invoke(new Action(() =>
+ {
+ IShiftOSWindow coherenceWindow = new Applications.CoherenceOverlay(prc.MainWindowHandle, rct);
+
+ AppearanceManager.SetupWindow(coherenceWindow);
+ SetWindowPos(prc.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
+
+ //MakeExternalWindowBorderless(prc.MainWindowHandle);
+ }));
+
+ }
+
+ const int WS_BORDER = 8388608;
+ const int WS_DLGFRAME = 4194304;
+ const int WS_CAPTION = WS_BORDER | WS_DLGFRAME;
+ const int WS_SYSMENU = 524288;
+ const int WS_THICKFRAME = 262144;
+ const int WS_MINIMIZE = 536870912;
+ const int WS_MAXIMIZEBOX = 65536;
+ const int GWL_STYLE = -16;
+ const int GWL_EXSTYLE = -20;
+ const int WS_EX_DLGMODALFRAME = 0x1;
+ const int SWP_NOMOVE = 0x2;
+ const int SWP_NOSIZE = 0x1;
+ const int SWP_FRAMECHANGED = 0x20;
+ const uint MF_BYPOSITION = 0x400;
+ const uint MF_REMOVE = 0x1000;
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
+ public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
+ public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
+ public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
+ public static void MakeExternalWindowBorderless(IntPtr MainWindowHandle)
+ {
+ int Style = 0;
+ Style = GetWindowLong(MainWindowHandle, GWL_STYLE);
+ Style = Style & ~WS_CAPTION;
+ Style = Style & ~WS_SYSMENU;
+ Style = Style & ~WS_THICKFRAME;
+ Style = Style & ~WS_MINIMIZE;
+ Style = Style & ~WS_MAXIMIZEBOX;
+ SetWindowLong(MainWindowHandle, GWL_STYLE, Style);
+ Style = GetWindowLong(MainWindowHandle, GWL_EXSTYLE);
+ SetWindowLong(MainWindowHandle, GWL_EXSTYLE, Style | WS_EX_DLGMODALFRAME);
+ SetWindowPos(MainWindowHandle, new IntPtr(0), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
+ }
+ }
+}