本帖最后由 getlow 于 2010-04-18 00:54:02 编辑

解决方案 »

  1.   


    有一个当前活动对象的概念。 当前操作对象是某个程序,输入消息就会被发送到这个程序。
    每个程序自己的消息队列,只不过是一个
    while( GetMessage(...) )
    {
    }
    你的程序完全可以忽略windows发送过来的消息。
      

  2.   

    最近刚开始接触Windows应用程序的编程,使用了孙鑫老师的视频及图书。书中有这样一段话:“每个Windows应用程序开始运行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息。”
    ========================================
    其实这个说法本身是有问题的,因为消息队列并不是一个进程一个,而是每一个有需要的线程会被创建一个消息队列。  我现在的困惑是,当有若干个应用程序存在时,就会有若干个消息队列存在。这时,Windows是如何知道要把消息传到哪个消息队列中?
    ================================
    消息队列应该是有由系统维护的,你可以想像成有一个由系统维护的队列链表,通过消息接收的窗口等信息,系统很容易定位到具体的队列。
      

  3.   

    看《深入浅出MFC》吧,里面讲的很清楚。这一句两句也说不清楚。
      

  4.   

    http://blog.csdn.net/chinazhangjie/archive/2010/03/19/5395790.aspx
      

  5.   

    先顶后问,我在主程序中用Loadlibrary("option")获得的句柄为0,不知道怎么回事,下面是dll中的代码
    #include "stdafx.h"bool Init(HINSTANCE);
    LRESULT CALLBACK WNDPROC_OPTION(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
     )
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:if(!Init(hModule)){MessageBox(NULL,(LPCWSTR)("无法初始化游戏选项!"),NULL,MB_OK);return false;}
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
    }
    return TRUE;
    }bool Init(HINSTANCE hInstance)
    {
    WNDCLASSEX wndClass;
    wndClass.cbClsExtra=0;
    wndClass.cbSize=sizeof(WNDCLASSEX);
    wndClass.cbWndExtra=0;
    wndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    wndClass.hCursor=LoadCursor(hInstance,IDC_ARROW);
    wndClass.hIcon=NULL;
    wndClass.hIconSm=NULL;
    wndClass.hInstance=hInstance;
    wndClass.lpfnWndProc=WNDPROC_OPTION;
    wndClass.lpszClassName=(LPCWSTR)("option");
    wndClass.style=CS_HREDRAW | CS_VREDRAW;
    RegisterClassEx(&wndClass); HWND hWnd=CreateWindow((LPCWSTR)("option"),(LPCWSTR)("游戏选项"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,640,480,NULL,NULL,hInstance,NULL);
    if(!hWnd)
    return false;
    ShowWindow(hWnd,SW_SHOWDEFAULT);
    UpdateWindow(hWnd); MSG msg;
    while(GetMessage(&msg,hWnd,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return true;
    }LRESULT CALLBACK WNDPROC_OPTION(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch(message)
    {
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
    }