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 之间的关系 [关闭]

Win32 API VS C++;文本框内容到字符串

C++ Win32界面编程中的窗口风格要点总结

Win32编程知识积累

在 Windows 中编程 C 或 C++ 时如何操作 GUID?

c++ win32编辑框光标不闪烁