gpt4 book ai didi

.net - 如何检测消息框是否可见?

转载 作者:行者123 更新时间:2023-12-05 09:25:31 25 4
gpt4 key购买 nike

我有 2 个可见的表单。是否可以检测消息框是否可见/显示在另一个表单上?

最佳答案

这是可能的,但需要大量的 P/Invoke 服务。诀窍是枚举 UI 线程拥有的窗口,并检查其中一个是否是 Windows 对话框窗口。这段代码可以解决问题。我不能保证 100% 的准确性,应用程序中可能存在另一个类似于消息框模板的非托管对话框。

using System;
using System.Text;
using System.Runtime.InteropServices;

static class MessageBoxFinder {
public static bool IsPresent() {
// Enumerate windows to find the message box
EnumThreadWndProc callback = new EnumThreadWndProc(checkWindow);
return false == EnumThreadWindows(GetCurrentThreadId(), callback, IntPtr.Zero);
}
private static bool checkWindow(IntPtr hWnd, IntPtr lp) {
// Checks if <hWnd> is a dialog
StringBuilder sb = new StringBuilder(260);
GetClassName(hWnd, sb, sb.Capacity);
if (sb.ToString() != "#32770") return true;
// Got a dialog, check if the the STATIC control is present
IntPtr hText = GetDlgItem(hWnd, 0xffff);
return hText == IntPtr.Zero;
}
// P/Invoke declarations
private delegate bool EnumThreadWndProc(IntPtr hWnd, IntPtr lp);
[DllImport("user32.dll")]
private static extern bool EnumThreadWindows(int tid, EnumThreadWndProc callback, IntPtr lp);
[DllImport("kernel32.dll")]
private static extern int GetCurrentThreadId();
[DllImport("user32.dll")]
private static extern int GetClassName(IntPtr hWnd, StringBuilder buffer, int buflen);
[DllImport("user32.dll")]
private static extern IntPtr GetDlgItem(IntPtr hWnd, int item);
}

关于.net - 如何检测消息框是否可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2336805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com