拖放文件图标后未收到WM_DROPFILES

时间:2015-09-25 15:41:54

标签: winapi drag-and-drop

我有一个WINAPI应用程序,我希望通过将文件拖放到我的应用程序的Icon上来启动它。

主窗口是用

创建的
hWnd = CreateWindow("app-name",
                    "",
                    WS_OVERLAPPEDWINDOW
                    | WS_CLIPSIBLINGS
                    | WS_EX_ACCEPTFILES,
                    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
                    NULL, NULL, hInstance, NULL);

并且有一个WndProc

static LRESULT CALLBACK
WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE:
            {
                DragAcceptFiles(hWnd, TRUE);

                // etc (other controls and windows created here)

            }
            break;
        case WM_DROPFILES:
           {
             char filename[MAX_PATH];
             HDROP hDropInfo = (HDROP) wParam;
             DragQueryFile(hDropInfo, 0, filename, MAX_PATH);
             // etc open file... 
           }
           break;

问题在于,当我将文件从资源管理器拖放到我的程序图标上时,该程序已启动,但我没有收到任何WM_DROPFILES消息。如果我将文件类型配置为"打开"也是如此。我的程序 - 它已经启动但没有收到WM_DROPFILES。

但是一旦程序初始化,我可以将一个文件拖放到它的一些窗口中,然后我按照预期得到WM_DROPFILES消息。

我做错了什么?

感谢您的建议!

BR Alfred

1 个答案:

答案 0 :(得分:0)

如上所述,您可以使用lpCmdLine函数的WinMain参数:

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

    // remove double quotes from filename with spaces
    if( lpCmdLine[0] == '"' ) {
        lpCmdLine++;
        lpCmdLine[strlen(lpCmdLine)-1] = 0;
    }

    printf("%s\n",lpCmdLine);

    // ...
}