在x64上未调用WM_DROPFILES

问题描述

如何进行拖放?在win32机器上,它可以正常工作,但是在x64上,根本不调用WM_DROPFILES消息。问题出在哪里?

static LRESULT CALLBACK WindowProc(HWND hWnd,UINT msg,WParaM wParam,LParaM lParam) {
    switch(msg) {
        case WM_CREATE: {   
      SetTimer(hWnd,int(1000./24),NULL);
            DragAcceptFiles(hWnd,true);
            return 0;
        }
        case WM_DROPFILES: {    
            DEBUG;
            return 0;
        }
    case WM_DESTROY: 
            KillTimer(hWnd,0);
      PostQuitMessage(0);
    break;
      return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    return 0;
}

        HWND hWnd; WNDCLASSEX wCs; 
        static const char* wndClassName = "WndClass";

        wCs.cbSize          = sizeof wCs;
        wCs.style           = CS_HREDRAW | CS_VREDRAW;
        wCs.lpfnWndProc     = WindowProc;
        wCs.cbClsExtra      = 0;
        wCs.cbWndExtra      = 0;
        wCs.hInstance       = hInstance;
        wCs.hIcon           = LoadIcon(hInstance,MAKEINTRESOURCE(ID_MYICON));
        wCs.hCursor         = LoadCursor(NULL,IDC_ARROW);
        wCs.hbrBackground   = NULL;
        wCs.lpszMenuName    = NULL;
        wCs.lpszClassName   = wndClassName;
        wCs.hIconSm         = LoadIcon(hInstance,MAKEINTRESOURCE(ID_MYICON));

        if (RegisterClassEx(&wCs)) {
            hWnd = CreateWindowEx(
                WS_EX_CLIENTEDGE | WS_EX_ACCEPTFILES,// extended window style
                wndClassName,// registered class name
                TEXT("APP"),// and window title
                WS_OVERLAPPEDWINDOW,// window style
                CW_USEDEFAULT,CW_USEDEFAULT,g_winw,g_winh,NULL,hInstance,// handle to application instance
                this                        // if need to take pointer
            );
            SetwindowLongPtr(hWnd,GWLP_USERDATA,(LParaM)this);
        }
        if(hWnd==NULL) {
            MessageBox(NULL,"Window Creation Failed!","Error!",MB_ICONEXCLAMATION | MB_OK);
            return E_FAIL;
        }
        if (s_winstate==3)
            ShowWindow(hWnd,SW_MAXIMIZE);
        else
            ShowWindow(hWnd,SW_SHOWnorMAL);
        UpdateWindow(hWnd);
        mHInstance=hInstance;       
        hfont = CreateFont(15,"Arial");
        SendMessage(hWnd,WM_SETFONT,(WParaM)hfont,TRUE);

在这里的另一个主题中发现,拖放可能是x64 Drag-and-drop from 32 to 64-bit

的问题

区别在于WM_DROPFILES消息对我完全没有显示

解决方法

添加

    ChangeWindowMessageFilter (WM_DROPFILES,MSGFLT_ADD);
    ChangeWindowMessageFilter (WM_COPYDATA,MSGFLT_ADD);
    ChangeWindowMessageFilter (0x0049,MSGFLT_ADD);

SendMessage之后(hWnd,WM_SETFONT,(WPARAM)hfont,TRUE);解决问题-谢谢。