簡體   English   中英

如何從C#中的應用程序處理在后台運行的應用程序的菜單項

[英]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,那么偽裝成交互式用戶可能是與其進行交互的唯一方式。 請注意,它充滿了問題,考慮一下會發生什么

  • BApp尚未運行
  • BApp打開了一個模態對話框
  • BApp處於操作(或掛起)的中間,其菜單被禁用
  • BApp已更新為新版本,其UI更改
  • 交互式用戶在操作過程中更改焦點。

替代方法是執行與使用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.

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