C#: Das Etikett in die Statusbarscheibe der nativen App injiziert wird, um sich anzuzeigen

StackOverflow https://stackoverflow.com/questions/1864123

  •  16-09-2019
  •  | 
  •  

Frage

Ich schreibe eine .NET COM -DLL, die in einer nativen Windows -Anwendung ausgeführt wird.

Ich versuche, eine zusätzliche Scheibe in die Statusbar dieser App zu injizieren, und es hat keine spezifische Implementierung, daher versuche ich selbst, die Statusbar der App zu unterklassen.

Ich verwende den Win32 -API -SetParent (), um das übergeordnete Label -Steuerelement von einem .NET -Formular in die msctls_statusBar32 -Instanz zu wechseln. Ich habe ein Etikett verwendet, weil es die engste Implementierung für eine native "statische" Klassenkontrolle ist, die ich finden konnte, ohne meine eigene Kontrolle zu schreiben.

Irgendwie habe ich es sogar geschafft, NativeWindow dazu zu bringen, sich sowohl an die Statusbuch- als auch an die Nachrichten meines Etiketts einzuschließen (obwohl es im Moment sie nur an das nächste Wndproc übergeben), und ich habe dem Fenster meines Labels passende Stile und Stylexs zugewiesen , und ich kann mein Etikett als Kind mit dem MSCTLS_STATUSBAR32 als Elternteil sehen. Alles sieht aus Als ob es richtig funktionieren sollte, aber es ist nicht so. Meine Kontrolle wird in der StatusBar der Eltern App nicht angezeigt.

Was ich nicht verstehe ist, warum es nicht auftaucht. Fast alles, was ich an Übereinstimmungen korrekt vorstellen kann - gewährt, die Klasse für mein Etikett lautet "windowsForms10.static.App.0.378734a" und nicht "statisch", aber ansonsten ist es auf dem richtigen Prozess und dem richtigen Thread, das übereinstimmende Fenster hat Stile (zumindest der Hex -Wert ... Spy ++ scheint sie anders aufzuzählen) und mischt sich für alle Zwecke so ziemlich in den Rest der Kontrollen ein. Würde jemand wissen, was sonst noch getan werden muss, um es sichtbar zu machen?

(Ich war ursprünglich die Route von Createwindowex gegangen und habe WndProc -Rückrufe gesetzt, aber ich konnte die App nicht zum Laufen bringen ... sie würde ungefähr eine Minute lang gefrieren und dann entlüftet, und ich würde bemerken, dass mein Fenster aus dem Fensterbaum verschwunden war.)

Vielen Dank!

War es hilfreich?

Lösung 3

Wie sich herausstellte, war die Antwort dumm einfach einfach ... Die X- und Y -Koordnungen des Etiketts waren aus dem Anzeigebereich des StatusBar -Elternteils heraus. Bewegen Sie sie in (0, 0) und es zeigt sich genau dort! Natürlich haben sich die Probleme jetzt weiterentwickelt zu: C# WinForms Control in .net COM Server wird nicht neu gezogen

Andere Tipps

Sie können versuchen, mit der vorhandenen Statusleistensteuerung zu arbeiten. Was Sie tun können, ist, Text in einen vorhandenen Abschnitt zurückzusetzen oder eine neue hinzuzufügen. Außerdem müssten Sie wahrscheinlich neue Breiten an vorhandenen Abschnitten des Statusbuchs einrichten. Hier finden Sie Details, wie Sie hier mit StatusBar Control arbeiten:MSDN -Statusbalken

Bitte finden Sie ein Beispiel dafür, wie Sie es unten tun können. Ich habe es tatsächlich mit C# com -Objekt versucht, das von Win32 -Anwendung verwendet wurde, und es scheint für mich gut zu funktionieren.

    [ComVisible(true)]
    [Guid("CC5B405F-F3CD-417E-AA00-4638A12A2E94"),
    ClassInterface(ClassInterfaceType.None)]
    public class TestInterface : ITestInterface // see declaration of the interface below
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, IntPtr lParam);

        public const int SB_SETTEXT = 1035;
        public const int SB_SETPARTS = 1028;
        public const int SB_GETPARTS = 1030;

        public unsafe void Test()
        {
            IntPtr mainWindowHandle = Process.GetCurrentProcess().MainWindowHandle;
            // find status bar control on the main window of the application
            IntPtr statusBarHandle = FindWindowEx(mainWindowHandle, IntPtr.Zero, "msctls_statusbar32", IntPtr.Zero);
            if (statusBarHandle != IntPtr.Zero)
            {
                // set text for the existing part with index 0
                IntPtr text = Marshal.StringToHGlobalAuto("test text 0");
                SendMessage(statusBarHandle, SB_SETTEXT, 0, text);
                Marshal.FreeHGlobal(text);

                // create new parts width array
                int nParts = SendMessage(statusBarHandle, SB_GETPARTS, 0, IntPtr.Zero).ToInt32();
                nParts++;
                IntPtr memPtr = Marshal.AllocHGlobal(sizeof(int) * nParts);
                int partWidth = 100; // set parts width according to the form size
                for (int i = 0; i < nParts; i++)
                {
                    Marshal.WriteInt32(memPtr, i*sizeof(int), partWidth);
                    partWidth += partWidth;
                }
                SendMessage(statusBarHandle, SB_SETPARTS, nParts, memPtr);
                Marshal.FreeHGlobal(memPtr);

                // set text for the new part
                IntPtr text0 = Marshal.StringToHGlobalAuto("new section text 1");
                SendMessage(statusBarHandle, SB_SETTEXT, nParts-1, text0);
                Marshal.FreeHGlobal(text0);
            }
        }
    }

    [ComVisible(true)]
    [Guid("694C1820-04B6-4988-928F-FD858B95C880")]
    public interface ITestInterface
    {
       [DispId(1)]
       void Test();
    }

Hoffe das hilft, Grüße

Viele mögliche Gründe:

  1. Die .NET -Label -Steuerung bläst in die Luft, wenn es keine Winforms -Eltern gibt.
  2. Die native Statusleiste zeichnet die Etikettensteuerung wegen falscher Z-Ordnung.
  3. Die Etikettensteuerung ist nicht sichtbar.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top