主对话框A在按钮响应事件中加载dll并生成一个非模态对话框B,为让B能接收TAB\Enter\Esc等按键的事件消息,在B的WM_CREATE响应OnCreate中
       
      SetWindowsHookEx( WH_GETMESSAGE, GetMsgProc,NULL, GetCurrentThreadId());
但是主对话框的消息也一并钩住了。问题:
1、在挂钩时传入的线程ID是A的?B的?
2、如果非模态对话框B不是在dll中产生而是直接在A的某个方法中产生的话是否有独立的线程?
3、一个UI线程对应一个消息队列,如果A,B是同一个线程是否意味着二者共用一个消息队列?
4、非模态对话框如果想自己定义某个消息的响应函数或者重写消息处理循环该在何处下手?谢谢!

解决方案 »

  1.   

    1,如果你不是创建线程的方法生成的对话框B,A和B在同一个线程,也就是同一个线程ID
    2,如果你不是创建线程的方法,不管是DLL还是A中的方法都一样
    3,每个窗口都有自己的消息循环
    4,在对话框B的类中添加消息响应
      

  2.   

    看来LZ对线程概念还没有理解,线程与EXE和DLL没有联系,调用DLL中的代码不会改变线程,如果你没有调用CreateThread等函数去创建线程,那么整个执行过程都是在同一线程中。消息队列是属于线程的,同一线程最多只有一个消息队列。非模态对话框的消息响应与模态对话框没有差别。
      

  3.   

    谢谢二位!
    据 shequay 的回答,A B 共用同一个消息队列但消息循环不同,结合 cnzdgs 回答,
    对于在dll中产生的非模态对话框的消息,如果想自己定义处理过程方法有二,1,不起新线程但重写B的消息循环从而重新定义处理函数
    2,起新线程并把B绑定到新线程,在新线程中下钩子也可达到对某类消息进行特定处理的目的。结贴,谢谢!
      

  4.   

    谢谢二位!
    据 shequay 的回答,A B 共用同一个消息队列但消息循环不同,结合 cnzdgs 回答,
    对于在dll中产生的非模态对话框的消息,如果想自己定义处理过程方法有二,1,不起新线程但重写B的消息循环从而重新定义处理函数
    2,起新线程并把B绑定到新线程,在新线程中下钩子也可达到对某类消息进行特定处理的目的。结贴,谢谢!
      

  5.   

        三种办法:1   线程(UIThread)
    2   timer
    3   自己做消息泵(PeekMessage)