C#IsWindow(Marshal.StringToHGlobalAuto())总是失败

时间:2013-09-05 10:24:25

标签: c# .net

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

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始终为false。那么有人可以帮助我,我如何检查调用过程(在这种情况下)notepad ++是否仍然是一个可见和打开的窗口?除了进程名称,我还获得了进程ID。我的研究结果是我必须使用Marshal.StringToHGlobalAuto函数和进程名来获取ptr hwnd。这是对的吗,或者哪里可能是我的错误?

marshal函数的返回值(在这种情况下):84883296并没有告诉我任何我感觉到IsWindow总是失败的原因。

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

2 个答案:

答案 0 :(得分:2)

你想要FindWindow或EnumWindows而不是BOOL WINAPI IsWindow(_In_opt_ HWND hWnd)用一个字符串句柄。

答案 1 :(得分: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返回的)是否仍然有效(窗口仍然存在)