C++ 使用 Win API 获取 Ctrl 键按下时鼠标选中的文件类型
以下是一个示例代码,实现了在按下 Ctrl 键时,获取鼠标选中的文件,并判断文件类型并打印出来:
#include <Windows.h>
#include <iostream>
#include <Shlwapi.h>
#include <shellapi.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int main()
{
WNDCLASS wc = { 0 };
wc.lpszClassName = L"Window Class";
wc.lpfnWndProc = WndProc;
RegisterClass(&wc);
HWND hwnd = CreateWindow(wc.lpszClassName, L"Window", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, NULL, NULL);
ShowWindow(hwnd, SW_SHOWDEFAULT);
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
DragAcceptFiles(hwnd, TRUE);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_DROPFILES:
if (GetKeyState(VK_CONTROL) < 0)
{
HDROP hDrop = (HDROP)wParam;
UINT fileCount = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
for (UINT i = 0; i < fileCount; i++)
{
TCHAR fileName[MAX_PATH];
DragQueryFile(hDrop, i, fileName, MAX_PATH);
// Get the file type
SHFILEINFO fileInfo = { 0 };
SHGetFileInfo(fileName, 0, &fileInfo, sizeof(fileInfo), SHGFI_TYPENAME);
std::wcout << fileName << L" is " << fileInfo.szTypeName << std::endl;
}
DragFinish(hDrop);
}
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
在这个示例代码中,我们创建了一个窗口,并在窗口创建时调用了 DragAcceptFiles 函数来启用拖拽文件功能。在窗口过程函数中,我们处理了 WM_DROPFILES 消息,通过 GetKeyState 函数来判断是否按下了 Ctrl 键。如果按下了 Ctrl 键,我们就可以通过 DragQueryFile 函数来获取鼠标选中的文件路径,然后再通过 SHGetFileInfo 函数来获取文件类型信息。最后,我们将文件名和文件类型信息输出到控制台中。
需要注意的是,在使用 SHGetFileInfo 函数时,我们需要包含 Shlwapi.lib 库文件,并在代码中添加以下头文件:
#include <Shlwapi.h>
#include <shellapi.h>
另外,我们也需要在程序初始化时调用 CoInitialize 函数来初始化 COM 库。
原文地址: https://www.cveoy.top/t/topic/oBjQ 著作权归作者所有。请勿转载和采集!