我实际上正在开发一个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总是失败的原因。
到目前为止,感谢您的建议。
答案 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
返回的)是否仍然有效(窗口仍然存在)