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)]>这里应该有一个回车符