-1

我实际上正在开发一个小屏幕监控,如果弹出一个新的可见窗口,它会发送一封电子邮件。我现在的问题是这部分:

Console.Write("                                       GeneralSettings.aItemsToAdd_Windows[i].Name: " + GeneralSettings.aItemsToAdd_Windows[i].Name + "\n");
Console.Write("          Marshal.StringToHGlobalAuto(GeneralSettings.aItemsToAdd_Windows[i].Name): " + Marshal.StringToHGlobalAuto(GeneralSettings.aItemsToAdd_Windows[i].Name) + "\n");
Console.Write("IsWindow(Marshal.StringToHGlobalAuto(GeneralSettings.aItemsToAdd_Windows[i].Name)): " + IsWindow(Marshal.StringToHGlobalAuto(GeneralSettings.aItemsToAdd_Windows[i].Name)) + "\n\n");

if (IsWindow(Marshal.StringToHGlobalAuto(GeneralSettings.aItemsToAdd_Windows[i].Name)))
{
    listView_Windows.Items.Add(GeneralSettings.aItemsToAdd_Windows[i].Name);
}
else
{
    aDeleteWindows.Add(new myAVP {
        Name = "",
        Handle = i
    });
}

我的 Console.Writes 的输出如下:

                                       GeneralSettings.aItemsToAdd_Windows[i].Name: notepad++
          Marshal.StringToHGlobalAuto(GeneralSettings.aItemsToAdd_Windows[i].Name): 84883296
IsWindow(Marshal.StringToHGlobalAuto(GeneralSettings.aItemsToAdd_Windows[i].Name)): False

我的程序失败的原因是因为它总是通过“else”部分运行,因为 IsWindow 总是错误的。那么有人可以帮助我吗,我如何检查称为(在这种情况下)notepad++ 的进程是否仍然是可见和打开的窗口?除了进程名称,我还得到了进程 ID。我的研究结果是我必须使用带有进程名称的 Marshal.StringToHGlobalAuto 函数来获取 ptr hwnd。这是正确的,还是我的错误在哪里?

marshal 函数的返回值(在这种情况下): 84883296 并没有告诉我任何我不明白为什么 IsWindow 总是失败的原因。

到目前为止,感谢您的建议。

4

2 回答 2

2

您希望 FindWindow 或 EnumWindows 而不是 BOOL WINAPI IsWindow(_In_opt_ HWND hWnd) 与字符串的句柄一起提供。

于 2013-09-05T10:43:11.757 回答
2

正如迪特所写:

[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

进而

IntPtr handle = FindWindow(null, "title of your window");

if (handle != IntPtr.Zero)
{
    // Present
}

IsWindow用于检查窗口的句柄(例如由 返回的FindWindow)是否仍然有效(窗口仍然存在)

于 2013-09-05T10:48:15.927 回答