Frage

Ich habe eine einfache Anwendung entwickelt (.dll) in LABVIEW und ich habe diese DLL einer C# Windows -Anwendung (Winforms). Wie

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

Also, wenn ich die Funktion aufrufe MyFunc Ein Fenster wird aufgetaucht (die Lab View Fenster( Front panel meiner LabView -Anwendung

Window

Ich muss den Fensternamen bekommen (ExpectedFuncName) In meiner C# -Anwendung. Ich muss den Namen des externen Fensters erhalten, das von meiner C# -Anwendung geöffnet wird. Können wir verwenden FileVersionInfo oder assembly loader den Namen bekommen?

Gibt es eine Idee, dies zu tun? Danke im Voraus.

War es hilfreich?

Lösung

Wenn Sie den Fenstergriff haben, ist dies relativ einfach:

[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();
}

Hier ist 'WindowsHandle' der Griff des erstellten Fensters.

In dem Fall haben Sie keinen Fenstergriff (ich sehe, Sie nicht), Sie müssen jedes Fenster auf der oberen Ebene auf der obersten Ebene aufzählen und durch den Erstellungsvorgang filtern (ich sehe, dass das Fenster von Ihrer Anwendung erstellt wird, indem Sie aufrufen Myfunc, Sie kennen also die Prozess -ID [*]) und verwenden dann einige Heuristik, um die erforderlichen Informationen zu bestimmen.

Hier ist der C# Import der Funktionen, die Sie verwenden sollen, wenn Sie nicht den Griff haben:

[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);

Grundsätzlich Aufzählung Anrufe EnumwindowsProc Für jedes Fenster im aktuellen Desktop. So können Sie die Fensterunterschrift erhalten.

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);
    }
}

*] In dem Fall wird das Fenster nicht von Ihrer Bewerbung erstellt (dh, aber aus einem anderen Hintergrundprozess), die Werte, die von GetWindowthreadProcessid mit einer anderen Prozess -ID zurückgegeben werden, erfordert jedoch eine andere Frage ...

Andere Tipps

Wenn Sie LabView Scripting (LabView 2010) aktivieren oder installieren ((installieren Sie esLV 8.6, 2009) Es gibt eine Eigenschaft mit dem Namen "FP.NativeWindow". Dies gibt einen Griff zum Fenster vorderen Feld zurück.
Verwenden Sie das folgende Snippet, um die Eigenschaft zu erhalten:
FP.NativeWindow

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top