gpt4 book ai didi

c# - 如何在 C# 应用程序中获取外部窗口的名称?

转载 作者:太空宇宙 更新时间:2023-11-03 17:46:08 25 4
gpt4 key购买 nike

我在 LABVIEW 中开发了一个简单的应用程序 (.dll),我将该 dll 导入到 C# windows 应用程序 (Winforms) .喜欢

    [DllImport(@".\sample.dll")]
public static extern void MyFunc(char[] a, StringBuilder b ,Int32 c);

所以当我调用函数 MyFunc 时,会弹出一个窗口(Lab View 窗口(Front panel 我的 labview 应用程序

Window

我需要在我的 C# 应用程序中获取窗口名称 (ExpectedFuncName)。即我需要获取由我的 C# 应用程序打开的外部窗口的名称。我们可以使用 FileVersionInfoassembly loader 来获取名称吗?

有没有办法做到这一点?提前致谢。

最佳答案

如果你有窗口句柄,这就相对容易了:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);


[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern int GetWindowTextLength(IntPtr hWnd);

...

int len;

// Window caption
if ((len = GetWindowTextLength(WindowHandle)) > 0) {
sb = new StringBuilder(len + 1);
if (GetWindowText(WindowHandle, sb, sb.Capacity) == 0)
throw new Exception(String.Format("unable to obtain window caption, error code {0}", Marshal.GetLastWin32Error()));
Caption = sb.ToString();
}

这里,'WindowHandle'是创建的窗口的句柄。

如果你没有窗口句柄(我看你没有),你必须枚举每个桌面顶级窗口,通过创建过程过滤它们(我看到窗口是由你的应用程序创建的调用 MyFunc,因此您知道进程 ID [*]),然后使用一些启发式方法来确定所需的信息。

这是在您没有句柄的情况下应使用的函数的 C# 导入:

[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);

private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

基本上 EnumWindows 为当前桌面中找到的每个窗口调用 EnumWindowsProc。这样你就可以获得窗口标题。

List<string> WindowLabels = new List<string>();

string GetWindowCaption(IntPtr hWnd) { ... }

bool MyEnumWindowsProc(IntPtr hWnd, IntPtr lParam) {
int pid;

GetWindowThreadProcessId(hWnd, out pid);

if (pid == Process.GetCurrentProcess().Id) {
// Window created by this process -- Starts heuristic
string caption = GetWindowCaption(hWnd);

if (caption != "MyKnownMainWindowCaption") {
WindowLabels.Add(caption);
}
}

return (true);
}

void DetectWindowCaptions() {
EnumWindows(MyEnumWindowsProc, IntPtr.Zero);

foreach (string s in WindowLabels) {
Console.WriteLine(s);
}
}

[*] 如果窗口不是由您的应用程序创建的(即,而是来自另一个后台进程),您应使用另一个进程 ID 过滤 GetWindowThreadProcessId 返回的值,但这需要另一个问题...

关于c# - 如何在 C# 应用程序中获取外部窗口的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3849025/

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