我已经开发了一个简单的应用程序(.dll
)LABVIEW
,我将该DLL转录到C#windows应用程序(Winforms
).喜欢
[DllImport(@".\sample.dll")]
public static extern void MyFunc(char[] a, StringBuilder b ,Int32 c);
Run Code Online (Sandbox Code Playgroud)
因此,当我调用该函数时,MyFunc
将弹出一个窗口(Lab View
窗口(Front panel
我的labview应用程序)
我需要ExpectedFuncName
在我的C#应用程序中获取窗口名称().即我需要获取由我的C#应用程序打开的外部窗口的名称.我们可以使用FileVersionInfo
或assembly 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();
}
Run Code Online (Sandbox Code Playgroud)
这里,'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);
Run Code Online (Sandbox Code Playgroud)
基本上,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);
}
}
Run Code Online (Sandbox Code Playgroud)
[*]如果窗口不是由您的应用程序创建的(即来自另一个后台进程),您应使用另一个进程ID过滤GetWindowThreadProcessId返回的值,但这需要另一个问题......
归档时间: |
|
查看次数: |
4553 次 |
最近记录: |