Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private static void SingleInstanceCallback(object sender, InstanceCallbackEventArgs args)
- {
- if (args == null || _mainFrm == null) return;
- Action<bool> d = (bool x) =>
- {
- _mainFrm.ApendArgs(args.CommandLineArgs);
- _mainFrm.Activate(x);
- };
- _mainFrm.Invoke(d, true);
- }
- static Mutex Mutex;
- static NamedPipeManager NamedPipeManager;
- static Form1 main;
- Mutex = new Mutex(true, "MyApplicationName", out bool Is);
- if (!Is)
- {
- NamedPipeManager.Write("1");
- Application.Exit();
- return;
- }
- NamedPipeManager = new NamedPipeManager();
- NamedPipeManager.ReceiveString += NamedPipeManager_ReceiveString;
- NamedPipeManager.Start();
- private static void NamedPipeManager_ReceiveString(string obj)
- {
- if (main.WindowState == FormWindowState.Minimized)
- main.WindowState = FormWindowState.Normal;
- main.Activate();
- }
- private void NamedPipeManager_ReceiveString(string obj)
- {
- main.WindowState = FormWindowState.Minimized;
- main.WindowState = FormWindowState.Normal;
- main.Activate();
- }
- [DllImport("user32.dll")]
- [return: MarshalAs(UnmanagedType.Bool)]
- static extern bool SetForegroundWindow(IntPtr hWnd);
- [DllImport("user32.dll")]
- static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
- const int ShowWindow_Restore = 9;
- static void Main()
- {
- Process this_process = Process.GetCurrentProcess();
- //найти все процессы с таким же именем
- Process[] other_processes =
- Process.GetProcessesByName(this_process.ProcessName).Where(pr => pr.Id != this_process.Id).ToArray();
- foreach (var pr in other_processes)
- {
- pr.WaitForInputIdle(1000); //на случай, если процесс еще не загрузился
- //берем первый процесс с окном, активируем его и выходим
- IntPtr hWnd = pr.MainWindowHandle;
- if (hWnd == IntPtr.Zero) continue;
- ShowWindow(hWnd, ShowWindow_Restore);
- SetForegroundWindow(hWnd);
- Environment.Exit(0);
- }
- //если ничего не найдено, продолжаем работу...
- }
- [DllImport("user32.dll")]
- private static extern IntPtr GetForegroundWindow();
- //[DllImport("user32.dll")]
- //public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
- [DllImport("User32")]
- private static extern int SetForegroundWindow(IntPtr hwnd);
- [DllImport("user32.dll")]
- private static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
- [DllImport("user32.dll")]
- private static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);
- public static void xBringToFront2(this Form form) {
- var currentForegroundWindow = GetForegroundWindow();
- var thisWindowThreadId = GetWindowThreadProcessId(form.Handle, IntPtr.Zero);
- var currentForegroundWindowThreadId = GetWindowThreadProcessId(currentForegroundWindow, IntPtr.Zero);
- AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, true);
- //SetWindowPos(form.Handle, new IntPtr(0), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
- // !!! активирует окно и устанавливает фокус ввода
- form.Activate(); // или (нет разницы): SetForegroundWindow(form.Handle);
- AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, false);
- //form.Show();
- //form.Activate();
- // !!! выносит окно на передний план
- form.TopMost = true;
- form.TopMost = false;
- }
Add Comment
Please, Sign In to add comment