2015-09-25 15 views
1

我有一個WINAPI應用程序,我想通過將文件拖放到我的應用程序的圖標上來啓動它。WM_DROPFILES在將圖標拖放到圖標後未收到

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

建立的主窗口,並與

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; 

的問題WndProc的是,當我將它從資源管理器中的文件拖放到我的程序圖標,程序已啓動,但我沒有收到任何WM_DROPFILES消息。如果我將文件類型配置爲「打開」我的程序 - 它已啓動但沒有收到WM_DROPFILES,情況也是如此。

但是,一旦程序初始化,我可以拖放一個文件到它的一些窗口,然後我得到WM_DROPFILES消息,因爲我期望它。

我在做什麼錯?

感謝您的諮詢!

BR阿爾弗雷德

+3

的'WM_DROPFILES'消息就可以被丟棄的文件上運行的應用程序,非不圖標運行應用程序(畢竟,沒有運行的應用程序沒有窗口。)對於後一種情況,您將在命令行上獲取文件名。 –

+0

謝謝,所以我可以使用函數GetCommandLine(); – Alfred

+1

或更高版本我使用WinMain的參數2:lpCmdLine – Alfred

回答

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); 

    // ... 
}