我正在嘗試創建一個小工具,每 60 秒將 chrome、edge 或“xyz”帶到前面。xyz 是我寫的另一個程式。
我遇到的問題是,它把我的第一個程式(xyz)帶到了前面,但 chrome 或 edge 永遠不會出現在前面。此外,當我將 chrome 作為第一個程式以顯示它不會出現時。
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Threading;
namespace ChangeWindows
{
class Program
{
static void Main(string[] args)
{
ShowWindow();
}
[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
private static void ShowWindow()
{
// Bei start ein programm in den vordergrund holen
// BDE
Process[] processXYZ = Process.GetProcessesByName("xyz");
IntPtr xyz = processXYZ[0].MainWindowHandle;
SetForegroundWindow(xyz);
// 1 min warten
Thread.Sleep(60000);
// n?chstes Programm
// msedge
Process[] processEDGE = Process.GetProcessesByName("msedge");
IntPtr edge = processEDGE[0].MainWindowHandle;
SetForegroundWindow(msedge);
// 1 min warten
Thread.Sleep(60000);
// n?chstes Programm
// chrome
Process[] processCHROME = Process.GetProcessesByName("chrome");
IntPtr chrome = processCHROME[0].MainWindowHandle;
SetForegroundWindow(chrome);
// 1 min warten
Thread.Sleep(60000);
// von vorne beginnen
ShowWindow();
}
}
}
我也沒有收到任何錯誤訊息。例如,找不到名稱為 chrome 的行程找不到。
uj5u.com熱心網友回復:
首先,Edge 的程序稱為“msedge”,而不僅僅是“edge”
其次,正如 Jimi 指出的那樣,您應該搜索它MainWindowHandle不是 的第一個行程0x00000000
所以它應該看起來像這樣
using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
namespace ChangeWindows
{
class Program
{
static void Main(string[] args)
{
ShowWindow();
}
[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
private static void ShowWindow()
{
// Bei start ein programm in den vordergrund holen
// BDE
Process processXYZ = Process.GetProcessesByName("xyz").FirstOrDefault(p => p.MainWindowHandle != IntPtr.Zero);
if (processXYZ != null)
{
IntPtr xyz = processXYZ.MainWindowHandle;
SetForegroundWindow(xyz);
// 1 min warten
Thread.Sleep(60000);
}
// n?chstes Programm
// msedge
Process processEDGE = Process.GetProcessesByName("msedge").FirstOrDefault(p => p.MainWindowHandle != IntPtr.Zero);
if (processEDGE != null)
{
IntPtr edge = processEDGE.MainWindowHandle;
SetForegroundWindow(edge);
// 1 min warten
Thread.Sleep(60000);
}
// n?chstes Programm
// chrome
Process processCHROME = Process.GetProcessesByName("chrome").FirstOrDefault(p => p.MainWindowHandle != IntPtr.Zero);
if (processCHROME != null)
{
IntPtr chrome = processCHROME.MainWindowHandle;
SetForegroundWindow(chrome);
// 1 min warten
Thread.Sleep(60000);
}
// von vorne beginnen
ShowWindow();
}
}
}
Alternativeley,為了簡單起見,我根據您的代碼制作了自己的版本,如果您需要,這里是:
using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
namespace ChangeWindows
{
internal class Program
{
private static readonly string[] processesNames = { "xyz", "msedge", "chrome" };
static void Main(string[] args) => ShowWindow(60000);
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
private static void ShowWindow(int sleep)
{
while (true)
{
foreach (var processName in processesNames)
{
var process = Process.GetProcessesByName(processName).FirstOrDefault(p => p.MainWindowHandle != IntPtr.Zero);
if (process == null)
continue;
SetForegroundWindow(process.MainWindowHandle);
Thread.Sleep(sleep);
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/531095.html
標籤:C#。网视窗
