如何关闭 viber main window
How to close viber main window
我正在开发一个微型发射器。它的主要思想是修复 Viber 中 Windows 功能的缺失。
我希望它使启动 Viber 最小化到仅托盘。
通常,当 Viber 启动时,它会在桌面上出现一个 Viber main window 和一个图标 - 在系统托盘中。我应该一直手动关闭这个过时的 window 。
于是,写了几行代码,发现还是无法关闭window:
using System;
using System.Diagnostics;
class ViberStrt {
static void Main() {
Process newProc = Process.Start("c:\Users\Dmytro\AppData\Local\Viber\Viber.exe");
Console.WriteLine("New process has started");
//newProc.CloseMainWindow();
newProc.WaitForExit();
newProc.Close();
newProc.Dispose();
Console.WriteLine("Process has finished");
//newProc.Kill();
}
}
但无论我尝试什么(关闭、处置)- 它都不起作用。
Method Kill 不适合,因为它会杀死所有。但我唯一需要做的就是关闭 Viber main window 并将进程留在系统托盘中。
还有一种方法:立即最小化启动Viber:
using System;
using System.Diagnostics;
class LaunchViber
{
void OpenWithStartInfo()
{
ProcessStartInfo startInfo = new ProcessStartInfo("c:\Users\Dmytro\AppData\Local\Viber\Viber.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
Process.Start(startInfo);
}
static void Main()
{
//Process newProc = Process.Start("c:\Users\Dmytro\AppData\Local\Viber\Viber.exe");
LaunchViber newProc = new LaunchViber();
newProc.OpenWithStartInfo();
}
}
在这种情况下,我们会在 TaskPane 上收到一个最小化的 window 并在 SystemTray 中收到一个图标。但是在这种情况下,我完全不知道如何摆脱 TaskPane 上的图标(如何关闭最小化window)。
对于找到解决此问题的任何帮助/想法,我将不胜感激。
使用 Pinvoke,如果您知道 window 标题是什么,您可以尝试获取实际 window 的句柄。
首先,导入这些函数:
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
您可能想要声明 WM_CLOSE
常量:
const UInt32 WM_CLOSE = 0x0010;
然后关闭 window 的代码(但保留进程 运行 在后台):
var startInfo = new ProcessStartInfo(@"c:\Users\Dmytro\AppData\Local\Viber\Viber.exe");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
var newProc = Process.Start(startInfo);
var name = "Viber +381112223344";
var windowPtr = FindWindowByCaption(IntPtr.Zero, name);
while (windowPtr == IntPtr.Zero)
{
windowPtr = FindWindowByCaption(IntPtr.Zero, name);
}
System.Threading.Thread.Sleep(100);
SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
我正在开发一个微型发射器。它的主要思想是修复 Viber 中 Windows 功能的缺失。 我希望它使启动 Viber 最小化到仅托盘。 通常,当 Viber 启动时,它会在桌面上出现一个 Viber main window 和一个图标 - 在系统托盘中。我应该一直手动关闭这个过时的 window 。 于是,写了几行代码,发现还是无法关闭window:
using System;
using System.Diagnostics;
class ViberStrt {
static void Main() {
Process newProc = Process.Start("c:\Users\Dmytro\AppData\Local\Viber\Viber.exe");
Console.WriteLine("New process has started");
//newProc.CloseMainWindow();
newProc.WaitForExit();
newProc.Close();
newProc.Dispose();
Console.WriteLine("Process has finished");
//newProc.Kill();
}
}
但无论我尝试什么(关闭、处置)- 它都不起作用。 Method Kill 不适合,因为它会杀死所有。但我唯一需要做的就是关闭 Viber main window 并将进程留在系统托盘中。
还有一种方法:立即最小化启动Viber:
using System;
using System.Diagnostics;
class LaunchViber
{
void OpenWithStartInfo()
{
ProcessStartInfo startInfo = new ProcessStartInfo("c:\Users\Dmytro\AppData\Local\Viber\Viber.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
Process.Start(startInfo);
}
static void Main()
{
//Process newProc = Process.Start("c:\Users\Dmytro\AppData\Local\Viber\Viber.exe");
LaunchViber newProc = new LaunchViber();
newProc.OpenWithStartInfo();
}
}
在这种情况下,我们会在 TaskPane 上收到一个最小化的 window 并在 SystemTray 中收到一个图标。但是在这种情况下,我完全不知道如何摆脱 TaskPane 上的图标(如何关闭最小化window)。
对于找到解决此问题的任何帮助/想法,我将不胜感激。
使用 Pinvoke,如果您知道 window 标题是什么,您可以尝试获取实际 window 的句柄。
首先,导入这些函数:
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
您可能想要声明 WM_CLOSE
常量:
const UInt32 WM_CLOSE = 0x0010;
然后关闭 window 的代码(但保留进程 运行 在后台):
var startInfo = new ProcessStartInfo(@"c:\Users\Dmytro\AppData\Local\Viber\Viber.exe");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
var newProc = Process.Start(startInfo);
var name = "Viber +381112223344";
var windowPtr = FindWindowByCaption(IntPtr.Zero, name);
while (windowPtr == IntPtr.Zero)
{
windowPtr = FindWindowByCaption(IntPtr.Zero, name);
}
System.Threading.Thread.Sleep(100);
SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);