[英]How to get handle for menu items of an application running in the back ground from an application in C#
我正在開發一個應用程序,這將是許多其他工具在后台運行的表面。 我正面臨一個問題。 在啟動后台應用程序期間,它需要加載特定文件(文件 - >加載 - >文件名)。
讓前端應用程序為Fapp
,后台應用程序為Bapp
。 Fapp
是否可以獲取Bapp's
菜單項的句柄並觸發加載功能。 我能夠獲得按鈕的句柄,但不能對菜單項執行相同的操作。
現在我們使用AutoIt實現這一點,我試圖在C#中實現這一點。
獲得要調用其菜單的窗口的句柄后,您可以使用
HMENU GetMenu(HWND)
windows api獲取菜單 HMENU GetSubMenu(HMENU, int)
進入文件菜單並再次打開菜單。 BOOL GetMenuItemInfo( ... )
獲取有關菜單的信息 PostMessage((IntPtr)hWnd, WM_COMMAND, 0, ID_MENU_ITEM);
( 相關帖子 )點擊該項目。 所有這些apis都是AutoIt所稱的(我認為)。 如果您的Bapp
是普通的Windows應用程序,具有正常的Windows菜單,而不是花哨的WPF應用程序或功能區,則此解決方案有效。 如果是這種情況,那么你看到的菜單可能不是菜單(技術上無論如何)
您確定這是讓兩個應用程序相互通信的正確方法嗎?
如果您沒有BApp的源代碼,並且它也沒有可以使用的API,那么偽裝成交互式用戶可能是與其進行交互的唯一方式。 請注意,它充滿了問題,考慮一下會發生什么
替代方法是執行與使用UI對應用程序進行單元測試時所執行的操作相同的操作。 這是因為您正在做同樣的事情,通過執行執行其功能的調用來自動化應用程序,在這種情況下,測試結果是按預期的。 由於這是WPF帖子,我們假設您正在使用MVVM編寫應用程序,並且最好的方法(為了避免在更改UI時出現漏洞)是忽略UI(View)並調用位於其下的層,即VM (視圖模型)。
實際上,只需在BApp應用程序中添加自托管WCF連接就可以很容易地在外部調用它。
this._host = new ServiceHost(service);
this._host.AddServiceEndpoint(typeof(IContract), new NetTcpBinding(), address);
this._host.Open();
這將使您能夠完全獨立地進行兩個談話。
如果您的Bapp能夠以某種方式調用Win32 API - 那么這可以通過使用SendMessage()向您的Fapp發送自定義WM_USER消息來實現。 在您的Fapp中,您處理此消息並采取適當的措施。
我不認為獲取控件的句柄並調用其處理程序是正確的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.