簡體   English   中英

當我進入另一個程序時,:: PostMessage不起作用

[英]::PostMessage doesn't work when I am tabbed in to another program

在我們的程序中,我們打開了一個單獨的dll對話框來顯示信息。 當我們的系統計時器導致系統鎖定時,我需要關閉此對話框。

我通過在MainFrm和EditDisplayDll中注冊系統消息來將信息發送到dll

SYSTEMLOCK = RegisterWindowMessage(“ SystemLock”);

當我通過發送郵件時

:: PostMessage(GetActiveWindow()-> m_hWnd,SYSTEMLOCK,0,0);

該消息正確發送到我的EditDisplayDll並在系統鎖定時關閉對話框。 但是,如果我在等待超時的同時按住Alt鍵並使用其他程序(Firefox,Outlook等),則該消息永遠不會正確調用EditDisplayDll。 MainFrm和內部其他窗口MainFrm正確地鎖定和隱藏自己在這兩種情況下。

我也嘗試過將HWND_BROADCAST與PostMessageSendNotifyMessage 我也嘗試過使用FindWindow()FindWindowEx()專門調用EditDisplayDll。

我不能使用GetDlgItem()類的東西,因為MainFrm.cpp無法訪問此dll。

我決定使用GetActiveWindow()原因是,我相信無論我身在哪個窗口(無論是在前景Vs活動窗口中的圖像中看到的那樣GetActiveWindow() ,它都可以查看程序的特定窗口

最后,我的問題是,無論我當前在哪個程序中,是否都可以調用程序中的所有Windows,或者是否可以通過另一種方式訪問​​EditDisplayDll的特定IDD以便向其發送SYSTEMLOCK消息。 ?

CWnd * cWndED = FindWindow(_T(“ EditDisplay”),_ T(“ EditDisplay”)); HWND hwnd =(HWND)cWndED;

您應該將Win32 API :: FindWindow與正確的類,窗口名稱一起使用。 並且不要將CWnd指針轉換為HWND。 您的代碼應如下所示:

HWND hWnd = ::FindWindow(_T("ProperClass"), _T("ProperNmae"));
if (hWnd != NULL)
{
  ::PostMessage(hWnd, YOUR_MESSAGE, ....);
}

我建議您使用Spy ++查找Dll窗口類和名稱,然后嘗試使用上述方法查找。 請記住,對於此類任務,最好使用本機API。

如果您同時知道窗口名稱和元素,則FindWindow是一個很好的解決方案。
如果要獲取窗口的HWND (窗口內沒有元素),則可以將其作為第一個參數NULL傳遞。

::FindWindow(NULL, _T("WindowName"));

返回您的代碼:如果您很幸運, PostMessage不會執行任何操作,否則活動窗口可能會捕獲您的消息。 誰知道如何/是否在活動窗口中對其進行處理? 如果您具有來自FindWindowFindWindowEx的有效IsWindow(HWND) ,請使用PostMessage
如果您希望從HWND獲得CWnd ,請查看 (通話速度可能很慢)

HWND hWnd = ::FindWindow(_T("ClassName"), _T("WindowName"));
if (hWnd && IsWindow(hWnd))
{
    ::PostMessage(hWnd, MESSAGE_TO_BE_SEND, lParam_or_Flags);
}

暫無
暫無

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

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