c++ win32编程问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ win32编程问题相关的知识,希望对你有一定的参考价值。
如果想在窗口的一个范围内点击鼠标 触发一个函数应该怎样实现 用windows GUI 不要使用MFC
你可以用SendMessage或Keybd_event, mouse_event还有一个PostMessage和SendMessage基本一样. 参考技术A 我以前是这样写的:在WM_LBUTTONDOWN消息下捕获鼠标点击位置,判断是否在想要的区域内,不在的话直接break。
c++ Qt/Win32 - USB 以编程方式弹出,但仍显示在 QFileSystemModel 和 GetLogicalDrives()
【中文标题】c++ Qt/Win32 - USB 以编程方式弹出,但仍显示在 QFileSystemModel 和 GetLogicalDrives()【英文标题】:c++ Qt/Win32 - USB programmatically ejected, but still shows in QFileSystemModel and GetLogicalDrives() 【发布时间】:2015-03-17 15:02:07 【问题描述】:我有一个填充了 QFileSystemModel 的 QTreeView,并且我将根路径设置为“\”(如“\\”)。这很好用,可以看到本地驱动器和 USB 驱动器。我的问题是,当我使用 DeviceIoControl(..., FSCTL_DISMOUNT_VOLUME, ...) 以编程方式弹出 USB 驱动器(我正在为 kiosk 模式下的 Win7 应用程序编程,因此它需要处理 Windows 级活动)时,随后通过 DeviceIoControl(..., IOCTL_STORAGE_EJECT_MEDIA, ...),虽然这两个函数都返回 true,并且 windows 系统服务托盘没有显示 USB 图标,并且 windows 资源管理器没有 USB 条目,但我的 QFileSystemModel 仍然看到驱动器。
我确实有一个从 QSortFilterProxyModel 派生的代理模型,它正在过滤所看到的内容,因为我真的只想看到 USB 驱动器。这是调用我的 USBController 类来检测已安装的可移动设备。该函数调用 GetLogicalDrives(),它实际上返回了我刚刚以编程方式弹出的 USB 的驱动器号。
我已经四处寻找解决这个困境的方法,但还没有解决这个问题。有没有人有什么建议?以下是相关代码:
来自 UsbController.h 的函数:
bool UsbController::ejectDrive(char driveletter, QString &errmsg)
char devicepath[7];
char format[] = "\\\\.\\?:";
strcpy_s(devicepath, format);
devicepath[4] = driveletter;
errmsg = "";
DWORD dwRet = 0;
wchar_t wtext[7];
size_t textlen = 7;
mbstowcs_s(&textlen, wtext, devicepath,strlen(devicepath)+1);
HANDLE hVol = CreateFile(wtext, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hVol == INVALID_HANDLE_VALUE)
FormatErrorMsg("CreateFile: ", errmsg);
return false;
if(!DeviceIoControl(hVol, FSCTL_LOCK_VOLUME, 0, 0, 0, 0, &dwRet, 0))
FormatErrorMsg("Lock Volume: ", errmsg);
return false;
if(!DeviceIoControl(hVol, FSCTL_DISMOUNT_VOLUME, 0, 0, 0, 0, &dwRet, 0))
FormatErrorMsg("Dismount Volume: ", errmsg);
return false;
if (!DeviceIoControl(hVol, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, &dwRet, 0))
FormatErrorMsg("Eject Media: ", errmsg);
return false;
CloseHandle(hVol);
return true;
QMap<QString,QString> UsbController::getMountedRemovables()
DWORD test = GetLogicalDrives();
DWORD mask = 1;
UINT type = 0;
WCHAR wdrive[] = L"?:\\"; // use as a drive letter template
QMap<QString,QString> removables;
for (int i = 0; i < 32; i++)
if (test & mask)
wdrive[0] = (char)('A' + i); // change letter in template
type = GetDriveType(wdrive);
switch (type)
case DRIVE_REMOVABLE:
QString qdrive = QString((char)('A' + i)) + ":";
if (!removables.contains(qdrive))
QString name = mountNameFromDriveLetter((char)('A' + i));
removables.insert(qdrive, name);
break;
default: break;
mask = mask << 1;
return removables;
我的代理模型中的函数(数据使用了acceptedRemovables QMap,它通过调用UsbController 填充到detectMountedRemovables() 中:
QVariant DriveFilterProxyModel::data(const QModelIndex & index, int role) const
QVariant data = QSortFilterProxyModel::data(index, role);
if (role == Qt::DisplayRole)
QString source = data.toString();
for (int i = 0; i < acceptList.size(); i++)
if (source.contains(acceptList[i]))
QString drivestring = source;
if (drivestring.contains('('))
drivestring = drivestring.remove(0, drivestring.indexOf('(')+1);
drivestring = drivestring.remove(drivestring.indexOf(')'), drivestring.size()-drivestring.indexOf(')')+1);
QMap<QString,QString>::const_iterator iter = acceptedNonRemovables.find(drivestring);
if (iter != acceptedNonRemovables.end())
if (source.contains("Data")) // no path as yet applied
QString newsource(source);
newsource.replace("Data", iter.value());
qDebug() << "DriveFilterProxyModel::filterAcceptsRow(): Mapped drive: should replace \"Data\" with: " << iter.value() << " to produce: " << newsource;
return newsource;
else
iter = acceptedRemovables.find(drivestring);
if (iter != acceptedRemovables.end())
if (!source.contains('(')) // no drive name found
QString newsource = QString("Removable Disk (%1)").arg(source);
qDebug() << "DriveFilterProxyModel::filterAcceptsRow(): USB drive: should change simple drive letter to: " << newsource;
return newsource;
return data;
void DriveFilterProxyModel::detectMountedRemovables()
acceptedRemovables = UsbController::getMountedRemovables();
resetAcceptList();
【问题讨论】:
当您使用 GUI 弹出驱动器而不是使用代码弹出驱动器时,驱动器号是否消失(从您的程序的角度来看)? 【参考方案1】:我猜驱动器仍然可以被系统识别,但它仍处于弹出模式。
查看Enumerating all available drive letters in Windows 问题,您可能会在那里找到可行的解决方案。
【讨论】:
以上是关于c++ win32编程问题的主要内容,如果未能解决你的问题,请参考以下文章
无法理解普通 c++ 与 vc++、win32 编程、mfc、win32 api、CLI 之间的关系 [关闭]