Home > Mobile >  How to define the message loop when using SetWinEventHook()?
How to define the message loop when using SetWinEventHook()?

Time:09-26

I'm trying to listen to events in a third-party app window, in which I don't own the source.

I don't understand this part of the crash

CodePudding user response:

The message loop needs to be in main, in your case after the call to SetWinEventHook. And since you don't otherwise have a way for your program to exit you'll probably want to create a dialog with an exit button, and in the handler for that buttons BN_CLICKED use a call to MessageBox to confirm that the user wants to exit and if so do a PostQuitMessage). The confirmation is because it would be too easy to exit otherwise.

CodePudding user response:

The message loop you have shown is perfectly fine (after moving it into EventHook()).

The "crash" is not really a crash. It is simply the program terminating itself abruptly because the thread is still running when the std::thread object is destroyed, as you have not called join() or detach() on it before it went out of scope when _tmain() exited.

Per std::thread::~thread:

Destroys the thread object.

If *this has an associated thread (joinable() == true), std::terminate() is called.

Notes

A thread object does not have an associated thread (and is safe to destroy) after

  • it was default-constructed
  • it was moved from
  • join() has been called
  • detach() has been called

So, simpy call t1.join() before _tmain() exits:

int _tmain(int argc, _TCHAR* argv[])
{
    std::thread t1(EventHook);
    ... 
    t1.join();
    return 0;
}
  • Related