Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#IsWindow(Marshal.StringToHGlobalAuto())总是失败_C#_.net - Fatal编程技术网

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

C#IsWindow(Marshal.StringToHGlobalAuto())总是失败,c#,.net,C#,.net,我正在做一个小屏幕监控,如果一个新的可视窗口弹出,它会发送一封电子邮件。我现在的问题是这部分: Console.Write(" GeneralSettings.aItemsToAdd_Windows[i].Name: " + GeneralSettings.aItemsToAdd_Windows[i].Name + "\n"); Console.Write(" Marshal.StringToHGlob

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

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。这是对的,还是我的错在哪里

封送处理函数的返回值(在本例中):84883296没有告诉我任何我不明白为什么IsWindow总是失败的信息


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

您希望FindWindow或EnumWindows而不是BOOL WINAPI IsWindow(_in_opt_uhwndhwnd)使用字符串句柄进行馈送

如迪特尔所写:

[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
返回的)是否仍然有效(窗口仍然存在)

究竟为什么
IsWindow
应该接受
封送.StringToHGlobalAuto
?您是如何定义IsWindow的?定义人:[DllImport(“user32.dll”)]>这里应该有一个回车符<[return:MarshalAs(UnmanagedType.Bool)]>这里应该有一个回车符