|
I meant
"no"
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Why are you passing NULL for the window handle? Why not post to the actual window
you want to receive the message?
If you want to handle the message like a thread message then you should do that
appropriately - in your thread class.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks Mike,
the NULL is there because I was frustrated with he whole process and it works if I use only one PostMessage in a function.
I just tryed this code and it also does not process the WM_TEST message - which is still simple AfxMessageBox.
if(PostMessage(NULL,WM_TEST, 1, 1))
{
AfxMessageBox("PostMessage(NULL,WM_TEST, 1, 1) OK");
}
else
{
AfxMessageBox("PostMessage(NULL,WM_TEST, 1, 1) No good Not OK");
}
|
|
|
|
|
Vaclav_Sal wrote: and it works if I use only one PostMessage in a function.
The message queue processing can't execute if your code after PostMessage is doing a long running routine because it's all in one thread. You really need to stop typing code and forum messages and spend more time reading until you understand how things work.
led mike
|
|
|
|
|
Hook Uppppppp! Fishing is GREAT today!
Why don't I ever learn not to nose in your threads...just smack me...
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: Hook Uppppppp! Fishing is GREAT today!
hehe check this out[^]
urudakis wrote: but all i get is a lot a symbols
ROTFLMAO
here's another[^]. Maybe we should ask Chris to start a CPWTFPOTD forum
Last modified: 14mins after originally posted --
led mike
|
|
|
|
|
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks for reply.
...long running routine because it's all in one thread....
....
AfxGetMainWnd()->PostMessage(WM_TEST, 1, 1);
AfxGetMainWnd()->PostMessage(WM_TEST_1, 1, 1);
return strText;
This short code does not work either.
Only the first message is actually processed.
So what is MS definition of "message queue"?
It looks like there is no queue at all.
I'll check GetQueueStatus to see if it gets me some more info.
PS > should read ->
|
|
|
|
|
It appears you are not properly posting '<' and '>' characters
Vaclav_Sal wrote: So what is MS definition of "message queue"?
They hide that information in the documentation[^]
Vaclav_Sal wrote: AfxGetMainWnd()->PostMessage(WM_TEST, 1, 1);
AfxGetMainWnd()->PostMessage(WM_TEST_1, 1, 1);
What is the values of WM_TEST and WM_TEST_1 and how are you trying to receive them?
led mike
|
|
|
|
|
Both WM_TEST and WM_TEST_1 are WM_USER defined messages.
For now CMainFrame::PreTranslateMessage(MSG* pMsg)
receives the messages and just does status bar text update plus AfxMessageBox for simple trace debugging.
Snippet here:
....
case WM_TEST: // WM_USER+7
{
m_wndStatusBar.SetPaneText (1, "Status : TEST TEST TEST TEST ", TRUE);
AfxMessageBox("TEST Update status ");
break;
}
case WM_TEST_1: // WM_USER+7
{
m_wndStatusBar.SetPaneText (1, "Status : WM_TEST_1 WM_TEST_1 WM_TEST_1 ", TRUE);
AfxMessageBox("WM_TEST_1 Update status ");
break;
}
...
I do not fully understand how to implement the retrun value of PreTranslateMessage.Either way - replacing the case break with return true or false did not make any difference.
I am still looking into GetQueueStatus and see if I can use it in
PreTranslateMessage.
|
|
|
|
|
Vaclav_Sal wrote: For now CMainFrame::PreTranslateMessage(MSG* pMsg)
Well assuming you actually have WM_TEST AND WM_TEST_1 defined with different values rather than the same WM_USER + 7 as commented in your code, if you change AfxMessageBox to TRACE statements you will see you receive both messages. If you give control of the message queue to the message box by popping it up the second one gets eaten before your code starts executing again.
led mike
|
|
|
|
|
As you suggested - removing the message box works as advertised!
Thanks for your help, appeciate it.
Vaclav
|
|
|
|
|
First, you should be using WM_APP, not WM_USER.
Second, are both WM_TEST and WM_TEST_1 equal to WM_USER+7 as indicated by your comments?
Third, why use PreTranslateMessage() to catch the messages? You can't handle the message
in the standard MFC way?
If you must use PreTranslateMessage(), then return non-zero to discontinue any further processing of
the message. Return zero to let the message be dispatched/processed normally.
I did this in my little MFC test app, where the app's main window is a modal dialog...
afx_msg LRESULT OnTest(WPARAM wp, LPARAM lp);
afx_msg LRESULT OnTest1(WPARAM wp, LPARAM lp);
#define WM_TEST (WM_APP+7)
#define WM_TEST_1 (WM_APP+8)
BEGIN_MESSAGE_MAP(CMFCTesterDlg, CMyDialog)
ON_MESSAGE(WM_TEST,&CMFCTesterDlg::OnTest)
ON_MESSAGE(WM_TEST_1,&CMFCTesterDlg::OnTest1)
END_MESSAGE_MAP()
void CMFCTesterDlg::OnOK()
{
AfxGetMainWnd()-> PostMessage(WM_TEST, 1, 1);
AfxGetMainWnd()-> PostMessage(WM_TEST_1, 1, 1);
}
LRESULT CMFCTesterDlg::OnTest(WPARAM wp, LPARAM lp)
{
AfxMessageBox(_T("WM_TEST Update status "));
return 0;
}
LRESULT CMFCTesterDlg::OnTest1(WPARAM wp, LPARAM lp)
{
AfxMessageBox(_T("WM_TEST_1 Update status "));
return 0;
} Both messages are received (interestingly in reverse order they were posted).
What are you doing differently?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
First, you should be using WM_APP, not WM_USER.
Did that with same results.
Second, are both WM_TEST and WM_TEST_1 equal to WM_USER+7 as indicated by your comments?
No they are not same.
Third, why use PreTranslateMessage() to catch the messages? You can't handle the message
in the standard MFC way?
I could.
If you must use PreTranslateMessage(), then return non-zero to discontinue any further processing of
the message. Return zero to let the message be dispatched/processed normally.
Did that with same resluts.
|
|
|
|
|
Fair enough
Interesting that using normal MFC message processing like in my example code works fine -
the message doesn't get eaten, although only one modal message window can appear at a time...
Cheers,
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: If you must use PreTranslateMessage(), then return non-zero to discontinue any further processing of
the message. Return zero to let the message be dispatched/processed normally.
I agree but it has no effect on the second message getting processed in the message loop of the MessageBox right?
led mike
|
|
|
|
|
I believe so. I would expect the modal message loop of the first dialog to eat the message
that's still in the queue.
That's what happens in my sample code - it appears the messages get processed in revere order, but actually
the modal processing of the first dialog makes the second queued message get processed, popping up the second
message box first. Once that's dismissed, the first dialog continues processing.
I think that should have happened in the OP's code too...something was wrong somewhere else IMO.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: I think that should have happened in the OP's code too...something was wrong somewhere else IMO.
I don't think so, I just reproduced it in an SDI app. Returning 1 or 0 has no effect on the behavior, the MessageBox appears to process the message in either case which makes sense since my return does not happen until after the MessageBox is destroyed.
I think in your case you are not using PreTranslate and so MFC CommandTarget or something is getting hold of it then who knows what is happening.
led mike
|
|
|
|
|
Interesting... I'm also already in a modal loop in my main window - I wonder how different that makes things.
Are you using an app class PreTranslateMessage() override or main window class override?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: Are you using an app class PreTranslateMessage() override or main window class override?
My CFrameWnd derivation
led mike
|
|
|
|
|
hmm....
I can't figure out where that second message goes...
It never gets routed through PreTranslateMessage, but gets dispatched through the message map of the
destination window just fine.
Moral: PreTranslateMessage() is a bad place to do message boxes from LOL
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I would guess the answer is the code of the main MFC message loop
led mike
|
|
|
|
|
hehe yeah I just can't find it. Thankfully I'm unwilling to try any further because it's never
going to be an issue that affects ME, and I'm selfish like that LOL
Cheers man!
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: Moral: PreTranslateMessage() is a bad place to do message boxes from
That's a given. I wonder if the issue has anything to do with the message box being a modeless dialog in disguise.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I couldn't get that far to find out. I was unable to step into the source code for
the innards of the AfxMessageBox on VS 2008 (the trail ended at a call to an imported library
function which wasn't debuggable), so I couldn't even see what "modal" loop it was using.
That's why I was unable to find where that second message gets eaten.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|