2016-06-15 3 views
-4

Das Problem kann in einer einfachen Art und Weise ausgedrückt werden: Gegeben ein Steuerelement Handle (IntPtr), woher wissen wir, ob es von ListBox oder im Allgemeinen wäre es besser, wenn wir wissen, welche Art von Kontrolle es ist.Wie zu bestimmen, ob ein Steuerelement-Handle einer systemeigenen Win32 ListBox ist (oder basierend auf systemeigenem Win32)?

Ich nehme an, dass die ListBox Schöpfer keine Informationen nicht setzen (wie der Klartext „List-Box“) innerhalb des Klassennamen des List-Box (der Klassennamen erhalten werden kann GetClassName Funktion.

Ich muß Tun Sie dies, weil ich feststellen muss, ob es eine native win32 ListBox unter einem bestimmten Bildschirmpunkt gibt. Der erste Schritt besteht darin, das Steuerelement mit der Funktion WindowFromPoint zu finden, aber als nächstes müssen wir prüfen, ob das gefundene Handle von einer ListBox ist oder nicht.

Ich habe stundenlang gegoogelt, ohne etwas Interessantes zu finden. Danke für Ihre Hilfe!

UPDATE

Wenn ich sage nativer listbox ich die Kontrolle bedeuten erstellt CreateWindow mit werden kann, und dann kann der class name mit einer beliebigen Zeichenkette angegeben werden. Ich nehme an, dass Klassennamen enthalten keinen festen Satz wie LISTBOX, wie sie für die List-Box in Windows, der Klassenname es ein Format wie WindowsForms10.LISTBOX.app.0.bf771 hat ...

+2

'GetClassName' -> String-Vergleich. –

+0

@ JonathanPotter Der Klassenname kann beliebig sein (er wird vom Steuerelementersteller eingegeben). Ich vermute also, dass es keine Informationen darüber gibt, ob es sich um eine ListBox handelt. – Hopeless

+3

Das macht keinen Sinn. Wenn es ein natives Listbox-Steuerelement ist, wird der Klassenname "LISTBOX" sein. –

Antwort

-3

Nun, ich Ich hatte die Idee, eine spezielle Nachricht an die ListBox zu senden, um sie zu testen. Ich fing an, mit der Nachricht LB_GETCOUNT zu versuchen, jedoch kann es in diesem Fall tatsächlich nicht helfen.

Also habe ich eine andere Nachricht LB_GETTEXTLEN versucht, in der ich in einem ungültigen Artikel Index übergeben (wie -1) und sehen, ob das zurückgegebene Ergebnis völlig anders und anders ist, um eine ListBox von anderen Steuerelementen zu erkennen. Und ja, es kann helfen, für die ListBox ist der zurückgegebene Wert -1, während für andere Steuerelemente der zurückgegebene Wert nur 0 ist. Hier

ist der Code:

//LB is a defined enum for ListBox messages, which can be found in pinvoke 
var isListBox = User32.SendMessage(handle, (uint)LB.LB_GETTEXTLEN, -1, 0).ToInt32() != 0; 
+3

Herr, nein! Wie alle anderen Steuerelemente deklariert die Listbox ihre klassenspezifischen Nachrichten im Bereich WM_USER + x. Das Werfen eines "LB_GETTEXTLEN" bei beliebigen Steuerelementen kann als "CM_KILLARMYOFKITTENS" -Nachrichten interpretiert werden. Was für eine schreckliche, schreckliche Idee. Jonathan Potter gab Ihnen die richtige Antwort in Kommentaren. Ignoriere es nicht einfach. – IInspectable

+0

@Intensible und ja Sie leben in der Welt von Win32, aber vollständig verstehen nicht die Welt der Win32-Wrapper namens *** Windows Forms *** - nur 8 Fragen/beantwortet mit "Winforms" getaggt - In einem anderen sprechen Sie nicht weiß nicht einmal, dass der Klassenname angepasst werden kann, um es komplett anders zu machen? – Hopeless

+0

@Intensible Ich streite nicht gegen dich wegen der schlechten Idee meiner Lösung *** ABER *** Ich streite mich gegen dich, weil ich vorgeschlagen habe, dass ich die Lösung von Jonathan Potter (der dir einen Kommentar zu deinem Kommentar gab) benutze. . Diese Lösung funktioniert im Allgemeinen nicht (und nicht immer, weil keine Bindung an den Klassennamen besteht). – Hopeless