DLL的线程中创建WINDOWS窗口并接收U盘移动磁盘插入消息

DLL的线程中创建WINDOWS窗口并接收U盘移动磁盘插入消息
这个问题注意以下几个关键点




1.DLL的句柄的传入
2.线程中的消息循环


HINSTANCE g_hInstance;
TCHAR U[2]; //保存U盘的盘符  
TCHAR FirstDriveFromMask(ULONG unitmask)  
{  
  char i;  
  for (i = 0; i < 26; ++i)  
  {  
    if (unitmask & 0x1)//看该驱动器的状态是否发生了变化  
      break;  
    unitmask = unitmask >> 1;  
  }  
  return (i + 'A');  
}


LRESULT OnDeviceChange(HWND hwnd,WPARAM wParam, LPARAM lParam)  
{  
  PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;  
  if (wParam==DBT_DEVICEARRIVAL)  
  {  
    if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)  
    {  
      PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;  
      U[0]=FirstDriveFromMask(lpdbv ->dbcv_unitmask);//得到u盘盘符  
      U[1]=':';
      U[2]='\0';
      MessageBox(0,U,_T("Notice!"),MB_OK);
    }  
  }  
  if (wParam==DBT_DEVICEREMOVECOMPLETE)  
  {  
    //设备删除  
  }  
  return LRESULT();  
}




LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)  
{  
  switch(message)  
  {  
    case WM_DEVICECHANGE:  
      OnDeviceChange(hwnd,wParam,lParam);  
      return 0;  
    case WM_DESTROY:  
      PostQuitMessage(0);  
      return 0;  
  }  
  return DefWindowProc(hwnd, message, wParam, lParam);  
}




DWORD WINAPI mythread_create_windows(LPVOID lparam)
{
  static TCHAR szAppName[]=TEXT ("UUUUUU");  
  HWND               hwnd;  
  MSG                msg;  
  WNDCLASS           wndclass;  


  wndclass.style            =0;  
  wndclass.lpfnWndProc      =WndProc;  
  wndclass.cbClsExtra       =0;  
  wndclass.cbWndExtra       =0;  
  wndclass.hInstance        =g_hInstance;  
  wndclass.hIcon            =0;  
  wndclass.hCursor          =0;  
  wndclass.hbrBackground    =0;  
  wndclass.lpszMenuName     =NULL;  
  wndclass.lpszClassName    =szAppName;  
  if (!RegisterClass (&wndclass))  
  {  
    MessageBox (NULL,TEXT("Program requires Windows NT!"),szAppName, MB_ICONERROR);  
    return 0;  
  }  


  hwnd = CreateWindow (szAppName,NULL,WS_DISABLED,0,0,0,0,NULL,NULL,g_hInstance,NULL);  
  while (GetMessage(&msg, NULL, 0, 0))  
  {  
    TranslateMessage (&msg);  
    DispatchMessage (&msg);  
  }  
  return 0;
}






BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
  g_hInstance=(HINSTANCE)hModule;


  switch (ul_reason_for_call)
  {
    case DLL_PROCESS_ATTACH:
      OutputDebugStringA("DLL_PROCESS_ATTACH ENTER");
      //CreateThread(NULL,NULL,mythread,NULL,NULL,NULL);
      CreateThread(NULL,NULL,mythread_create_windows,NULL,NULL,NULL);
      OutputDebugStringA("DLL_PROCESS_ATTACH END");
      break;
    case DLL_THREAD_ATTACH:
      break;
    case DLL_THREAD_DETACH:
      break;
    case DLL_PROCESS_DETACH:
      break;
  }
  return TRUE;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值