[英]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.