C# 获取WPF中实时运行的进程选中列表框
基本上,我有一个每2秒在计时器中执行一次的代码:C# 获取WPF中实时运行的进程选中列表框,c#,wpf,listbox,C#,Wpf,Listbox,基本上,我有一个每2秒在计时器中执行一次的代码: void GetAllPlayerWindows() { Process[] processes = Process.GetProcessesByName("gamex"); foreach (Process p in processes) { IntPtr windowHandle = p.MainWindowHandle; if (p.Main
void GetAllPlayerWindows()
{
Process[] processes = Process.GetProcessesByName("gamex");
foreach (Process p in processes)
{
IntPtr windowHandle = p.MainWindowHandle;
if (p.MainWindowTitle != "Login")
{
Character player = new Character();
player.Handle = p.MainWindowHandle;
player.Name = p.MainWindowTitle;
lstPlayers.Items.Add(player);
}
}
}
这是角色类:
public class Character
{
public string Name { get; set; } //MainWindowTitle
public IntPtr Handle { get; set; } //MainWindowHandle
}
这是我的WPF复选列表框
<ListBox x:Name="lstPlayers" ItemsSource="{Binding playerList}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Path=Item.Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我不知道如何监控“gamex”进程并使其与列表框协调。因此,如果一个新进程生成了一个项目,如果它被删除了,它就会删除它。由于每隔2秒执行一次GetAllPlayerWindows()
,因此它会不断将每个进程添加到列表框中,并进行复制。如何预防
我想要达到的目标:
有一个列表框,它总是更新并获取名为“gamex”的进程,获取它们的mainwindowtitle并确保它不是“Login”。然后创建一个新的角色实例,并将进程句柄和窗口标题作为名称放在其中。并将此角色实例放入列表框中。这样我就可以访问它的项目,并获得名称和句柄。对你的播放器进行测试。如果返回null,则进程还不在列表中,在这种情况下,您可以添加它
void GetAllPlayerWindows()
{
Process[] processes = Process.GetProcessesByName("gamex");
foreach (Process p in processes)
{
IntPtr windowHandle = p.MainWindowHandle;
if (p.MainWindowTitle != "Login")
{
// find if the handle already is in the list
if (lstPlayers.Find(i => i.Handle == windowHandle) == null)
{
// it is not, add it
Character player = new Character();
player.Handle = p.MainWindowHandle;
player.Name = p.MainWindowTitle;
lstPlayers.Items.Add(player);
}
}
}
}
好的,我找到了自己的答案:
void GetAllPlayerWindows()
{
Process[] processes = Process.GetProcessesByName("gamex");
foreach (Process p in processes)
{
IntPtr windowHandle = p.MainWindowHandle;
if (p.MainWindowTitle != "Login" && !ContainsHandle(p))//<--Made a little function
{
Character player = new Character();
player.Handle = p.MainWindowHandle;
player.Name = p.MainWindowTitle;
lstPlayers.Items.Add(player);
}
}
}
bool ContainsHandle(Process p)
{
for (int i = 0; i < lstPlayers.Items.Count; i++)
{
Character player = lstPlayers.Items[i] as Character;
if (player.Handle == p.MainWindowHandle)
return true;
}
return false;
}
void GetAllPlayerWindows()
{
Process[]processs=Process.GetProcessesByName(“gamex”);
foreach(进程中的进程p)
{
IntPtr windowHandle=p.MainWindowHandle;
if(p.MainWindowTitle!=“Login”&&&&!ContainsHandle(p))//当您保留MainWindowHandle时,很容易在列表上循环,并且仅在MainWindowHandle不在列表中时添加项目。您都可以在GetAllPlayerWindows
中执行此操作。这实际上是我的主要问题。您能提供一个示例吗?我从“对于进程中的每个进程p”,然后我怎么说“如果listbox不包含句柄属性的字符!=p.MainWindowHandle”?