问题描述
我在LABVIEW
中开发了一个简单的应用程序(.dll
),并将该dll恳请到C#Windows应用程序(Winforms
)中.喜欢
i've developed a simple application (.dll
) in LABVIEW
and i implorted that dll to a C# windows application(Winforms
) . Like
[DllImport(@".\sample.dll")]
public static extern void MyFunc(char[] a, StringBuilder b ,Int32 c);
因此,当我调用函数MyFunc
时,将弹出一个窗口(Labview应用程序的Lab View
窗口(Front panel
)
so when i call the function MyFunc
a window will be popped up( the Lab View
window( Front panel
of my labview application
我需要在我的C#应用程序中获取窗口名称(ExpectedFuncName
).即我需要获取由我的C#应用程序打开的外部窗口的名称.我们可以使用FileVersionInfo
或assembly loader
来获取名称吗?
i need to get the window name (ExpectedFuncName
) in my C# application. i.e i need to get the name of the external window which is opend by my C# application. Can we use FileVersionInfo
or assembly loader
to get the name?
有什么想法要这样做吗?预先感谢.
Is there any idea to do this?Thanks in advance.
推荐答案
如果您具有窗口句柄,这相对容易:
If you have the window handle, this is relatively easy:
[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"是所创建窗口的句柄.
Here, 'WindowHandle' is the handle of the created window.
如果您没有窗口句柄(我看不到),则必须枚举每个桌面顶级窗口,并按创建过程对其进行过滤(我看到该窗口是由您的应用程序通过以下方式创建的:调用 MyFunc ,因此您知道进程ID [*]),然后使用一些启发式方法来确定所需的信息.
In the case you do not have a window handle (I see you don't), you have to enumerate every desktop top-level window, filter them by the creating process (I see the window is created by you application by calling MyFunc, so you know the process ID [*]), and then use some heuristic to determine the required information.
这是在没有句柄的情况下应使用的函数的C#导入:
Here is the C# import of the functions you shall use in the case you do not have the handle:
[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 .这样您就可以获得窗口标题.
Basically EnumWindows calls EnumWindowsProc for each window found in the current desktop. So you can get the window caption.
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返回的值,但这需要另一个问题...
[*] In the case the window is not created by your application (i.e but from another background process), you shall filter the values returned by GetWindowThreadProcessId using another process ID, but this requires another question...
这篇关于如何在C#应用程序中获取外部窗口的名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!