[英]::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與PostMessage
和SendNotifyMessage
。 我也嘗試過使用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
不會執行任何操作,否則活動窗口可能會捕獲您的消息。 誰知道如何/是否在活動窗口中對其進行處理? 如果您具有來自FindWindow
或FindWindowEx
的有效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.