问题描述
如何进行拖放?在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);解决问题-谢谢。