簡體   English   中英

如何確定控件句柄是否屬於本機(或基於本機)win32 ListBox?

[英]How to determine if a control handle is of a native (or based on native one) win32 ListBox?

問題可以用這樣的簡單方式表達:給定一個控件句柄(IntPtr),我們如何知道它是一個ListBox還是一般來說,如果我們知道它是什么類型的控件會更好。

我想 ListBox 創建者不會在 ListBox 的類名中放置任何信息(例如純文本“ListBox”)(可以使用GetClassName函數獲取類名。

我需要這樣做,因為我需要確定某個屏幕點下是否有任何本機 win32 ListBox。 第一步是使用WindowFromPoint函數找到控件句柄,但接下來我們需要檢查找到的句柄是否屬於 ListBox。

更新

當我說原生列表框時,我的意思是可以使用CreateWindow創建控件,然后可以使用任何字符串指定class name 我想類名不包含任何像LISTBOX這樣的固定短語,對於 WindowsForms 中的 ListBox,它的類名的格式類似於WindowsForms10.LISTBOX.app.0.bf771...

好吧,我有向 ListBox 發送一些特殊消息來測試它的想法。 我開始嘗試使用消息LB_GETCOUNT ,但在這種情況下它實際上無濟於事。

因此,我嘗試了另一條消息LB_GETTEXTLEN ,其中我傳入了一個無效的項目索引(例如-1 ),並查看返回的結果是否完全不同且不同,以幫助識別來自其​​他控件的 ListBox。 是的,它可以提供幫助,對於 ListBox,返回值是-1而對於其他控件,返回值只是0

這是代碼:

//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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM