文档章节

C++ 实时获取USB移动介质盘符

CHONGCHEN
 CHONGCHEN
发布于 2018/11/08 15:06
字数 540
阅读 42
收藏 0
#include <iostream>
#include <Windows.h>
#include <Dbt.h>

using namespace std;
#define THRD_MESSAGE_EXIT WM_USER + 1
static HWND hwnd = nullptr;
static const CHAR CLASS_NAME[] = "ActivityProbe";//不可为空
static const GUID GUID_DEVINTERFACE_LIST[] = {
    { 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } },
    { 0x53f56307, 0xb6bf, 0x11d0, { 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } },
    { 0x4D1E55B2, 0xF16F, 0x11CF, { 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } },
    { 0xad498944, 0x762f, 0x11d0, { 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c } }
};
//线程应该做的事
DWORD WINAPI threadCallBack(LPVOID lpParameter);
ATOM registerClass();
bool createMessageOnlyWindow();
LRESULT deviceChange(UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
DWORD WINAPI threadCallBack(LPVOID lpParameter);
char firstDriveFromMask(ULONG unitmask);

#if 1
ATOM registerClass() {
    //创建窗口
    WNDCLASS wc{};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = GetModuleHandle(nullptr); //窗口进程的实例句柄
    wc.lpszClassName = CLASS_NAME;
    return RegisterClass(&wc);
}
#endif

#if 1
bool createMessageOnlyWindow() {
    hwnd = CreateWindowEx(0,
        CLASS_NAME,
        (LPCSTR)"",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        nullptr, nullptr, GetModuleHandle(nullptr), nullptr);
    return hwnd != nullptr;
}
#endif

//刷新状态
void updateDevice(PDEV_BROADCAST_VOLUME  pDevInf, WPARAM wParam) {
    if (DBT_DEVICEARRIVAL == wParam) {
        std::cout << "插入" << std::endl;
        std::cout << firstDriveFromMask(pDevInf->dbcv_unitmask) << std::endl;
    } else {
        std::cout << "移出" << std::endl;
        std::cout << firstDriveFromMask(pDevInf->dbcv_unitmask) << std::endl;
    }
}

char firstDriveFromMask(ULONG unitmask) {
    char i;

    for (i = 0; i < 26; ++i) {
        if (unitmask & 0x1)
            break;
        unitmask = unitmask >> 1;
    }

    return(i + 'A');
}

//检验
LRESULT deviceChange(UINT message, WPARAM wParam, LPARAM lParam) {
    //设备移入与移出任意一种状态均符合状态
    PDEV_BROADCAST_HDR pdr = (PDEV_BROADCAST_HDR)lParam;
    if ((DBT_DEVICEARRIVAL == wParam
        || DBT_DEVICEREMOVECOMPLETE == wParam)
        && DBT_DEVTYP_VOLUME == pdr->dbch_devicetype) {
        updateDevice((PDEV_BROADCAST_VOLUME)pdr, wParam);
    }
    return 0;
}

//系统自有全局函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    LRESULT result{};
    if (WM_DEVICECHANGE == message) {
        result = deviceChange(message, wParam, lParam);
    } else {
        result = DefWindowProc(hWnd, message, wParam, lParam);
    }
    return result;
}

#include <thread>
#include <Poco/Thread.h>

//线程回调
DWORD WINAPI threadCallBack(LPVOID lpParameter) {
    //注册类别
    if (0 == registerClass()) return -1;
    //创建窗口 填充HWND
    if (0 == createMessageOnlyWindow()) return -1;
    //注册通知
    //registerDeviceNotify();
#if 1
    MSG msg;
    while (GetMessage(&msg, nullptr, 0, 0)) {
        if (msg.message == THRD_MESSAGE_EXIT) {
            std::cout << "worker receive the exiting message..." << std::endl;
            return 0;
        }
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
#endif
    return 0;
}

//#include <Poco/Thread.h>
//#include <Poco/ThreadTarget.h>
#include <thread>

int main() {
    
#if 0
    DWORD threadId;
    HANDLE tHandle = CreateThread(nullptr, 0, threadCallBack, nullptr, 0, &threadId);
    if (nullptr == tHandle) {
        std::cout << "Thread Create Error!!!" << std::endl;
        return -1;
    }

    PostThreadMessage(threadId, THRD_MESSAGE_EXIT, 0, 0);
    WaitForSingleObject(tHandle, INFINITE);
    CloseHandle(tHandle);
#endif

    //创建新线程用来执行检测USB动态任务
    std::thread create(threadCallBack, nullptr);
    std::cout << "当前子线程ID: " << create.get_id() << std::endl;
    std::cout << "当前子线程句柄: " << create.native_handle() << std::endl;
    //create.detach();
    create.join();
 
    return 0;
}

思考

  • 奇怪了,不断精简下发现没有注册通知也能达到目的

© 著作权归作者所有

CHONGCHEN
粉丝 5
博文 40
码字总数 20154
作品 0
武汉
后端工程师
私信 提问
运行MFC程序提示没有找到MFC42D.DLL文件的解决方法

运行MFC AppWizard(exe)程序,汇编成功,可是运行时,出现错误:“没有找到MFC42D.DLL,因此这个应用程序未能启动.重新安装应用程序可能会修复此问题. ” 解决方案为:出现上述提示的原因是...

lcniuren33
2012/07/04
4.9K
0
LLVM/Clang 在Windows上的设置

由于Clang源代码的缘故,Clang在编译C++程序的时候 ,后端是MinGW,无法正常的寻找到C++ libc++ Include目录 Clang查找libc++目录 由Clang源代码 lib\Frontend\InitHeaderSearch.cpp 文件实现...

Force武装卫队
2012/12/17
14.1K
0
C# vs C++之二:GC vs RAII

C# vs C++之二:GC vs RAII 资源管理 C中资源管理极为繁琐易错,大多复杂C系统都面临内存泄露、悬挂指针等问题 一方面由底层语言特点决定;另一方面也由于C语言特性相对较少,严重依赖程序员...

ddatsh
2011/06/28
1K
6
C语言/C++编程学习—绘制神奇代码之星空动态

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/03/26
0
0
C语言编程学习之递归实现汉诺塔图解

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nettysocetio-demo1(nettysocetio通讯,两客户端聊天,群发消息改造)

前言: 网上大多数都是只能群发,或者只能发给自己.并没有一个案例完整的群发并且又可以客户端之间聊天的案例,特此改造好的案例给大家分享一下.只要是一对一聊天,一对多群发. 内容: 废话不多说...

RobertZhou
33分钟前
3
0
在Serverless Kubernetes集群中轻松运行Argo Workflow

导读 Argo是一个基于kubernetes实现的一个Workflow(工作流)开源工具,基于kubernetes的调度能力实现了工作流的控制和任务的运行。 目前阿里云容器服务ACK集群中已经支持工作流的部署和调度,...

阿里云官方博客
35分钟前
3
0
后端的轮子(三)--- 缓存

前言 前面花了一篇文章说数据库这个轮子,其实说得还很浅很浅的,真正的数据库比这复杂不少,今天我们继续轮子系列,今天说说缓存系统吧。 缓存是后端使用得最多的东西了,因为性能是后端开发...

java后端开发
42分钟前
3
0
​京交会组委会企业回访 信必优将携新产品再出发

2020年京交会将于明年5月28日至6月1日在北京举办。为给各界客商提供更多潜在合作机会,打造“永不落幕京交会”,11月12日,京交会组委会办公室举办首场会后集中采访活动,对入选“2019年京交...

symbiochina88
44分钟前
3
0
读「SOLID」的设计原则记录

阅读链接:https://xueyuanjun.com/post/9719 单一职责原则(Single Responsibility Principle) 一个类只做某一件事。 例:操作订单时我们需要查询数据进行验证 如果在订单类中直接查询MyS...

子尤-
49分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部