C# 获取WPF中实时运行的进程选中列表框

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

基本上,我有一个每2秒在计时器中执行一次的代码:

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”?