2010-07-29 31 views
2

我正在研究一個小的宏記錄/重放工具,它可以自動化我們擁有的一些非常古老的Visual Basic 6 GUI。爲此,我通過名稱來識別控件(即控件的name屬性的值,即)。如何獲得給定其HWND的Visual Basic控件的名稱?

該工具的一部分需要根據HWND來確定控件的名稱。對於使用VB.NET完成的較新的Visual Basic應用程序,我可以使用WM_GETCONTROLNAME窗口消息。這很好地工作。

但是,此消息不被舊窗口所理解。有沒有什麼辦法來控制Visual Basic 6應用程序?一個不需要在GUI過程中的解決方案將是可取的,但如果我有一個解決方案只能在GUI過程中使用,那麼這也是可以接受的(因爲我可以自己做注射)。

UPDATE:有一件事我只是想,這個溫和的成功:我用AccessibleObjectFromWindow檢查,顯示給定的HWND對象的IAccessible接口的實現。如果我得到一個實現(似乎許多[所有?] Visual Basic控件實現此接口),我使用accName屬性讀出「可訪問的名稱」。有時候這會產生一個有用的字符串,但通常不會。

回答

1

我相信唯一的辦法就是進入進程並獲得一個指向Form對象的指針,但我不知道如何從外部做到這一點。

是否有可能將WM_GETCONTROLNAME的支持添加到那些較舊的應用程序中?

或者,也許你可以通過其他一些本地可用的屬性來識別控件?

除此之外,正如Raymond所說,there isn't much you can do

+0

這些都是虔誠的建議,謝謝!現在看來我需要掛鉤進程(我可以這樣做),然後直接訪問Form對象。我不知道該怎麼做,但幾個月前已經做了類似的事情,所以它可能會解決。 – 2010-07-30 08:17:28

1

你可以修改vb6應用程序嗎?如果是這樣,在每個表單加載事件中,您可以迭代me.controls並使用SetProp(ctrl.hwnd, "MYNAME:" & ctrl.name, 0) api將名稱添加到窗口自己的屬性列表中,然後在其他應用程序中,您可以EnumProps(ctrl_HWND)查找以MYNAME:開頭的值並解析出值。

+0

很有創意的想法!但是 - 不,我不能修改應用程序。我相信我甚至沒有可以訪問的源代碼。有人告訴我,有一種工具可以用來讀出給定GUI的Visual Basic名稱,顯然一些GUI測試工具也可以這樣做 - 所以它肯定有可能。 – 2010-07-31 11:09:46

相關問題