1. 程式人生 > >C#實現檢測U盤的插拔

C#實現檢測U盤的插拔

C# Winform中WndProc 函式作用:

主要用在攔截並處理系統訊息和自定義訊息

比如:
windows程式會產生很多訊息,比如你單擊滑鼠,移動視窗都會產生訊息。這個函式就是預設的訊息處理函式。你可以過載這個函式來制定自己的訊息處理流程.

在Winform程式中,可以重寫WndProc函式,來捕捉所有發生的視窗訊息。

這樣,我們就可以"篡改"傳入的訊息,而人為的讓視窗改變行為。

我們用C#實現檢測U盤插拔的功能,是用重寫C# WndProc函式來做到的。 

簡單測試程式碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;  //新增IO名稱空間

namespace CheckUdisk
{
    public partial class Form1 : Form
    {

        //定義常量
        public const int WM_DEVICECHANGE = 0x219;
        public const int DBT_DEVICEARRIVAL = 0x8000;
        public const int DBT_CONFIGCHANGECANCELED = 0x0019;
        public const int DBT_CONFIGCHANGED = 0x0018;
        public const int DBT_CUSTOMEVENT = 0x8006;           
        public const int DBT_DEVICEQUERYREMOVE = 0x8001;
        public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;
        public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
        public const int DBT_DEVICEREMOVEPENDING = 0x8003;
        public const int DBT_DEVICETYPESPECIFIC = 0x8005;
        public const int DBT_DEVNODES_CHANGED = 0x0007;
        public const int DBT_QUERYCHANGECONFIG = 0x0017;
        public const int DBT_USERDEFINED = 0xFFFF;



        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        protected override void WndProc(ref Message m)
        {

            try
            {
                if (m.Msg == WM_DEVICECHANGE)
                {
                    switch (m.WParam.ToInt32())
                    {
                        case WM_DEVICECHANGE:
                            break;
                        case DBT_DEVICEARRIVAL:
                            DriveInfo[] s = DriveInfo.GetDrives();
                            foreach (DriveInfo drive in s)
                            {
                                if (drive.DriveType == DriveType.Removable)
                                {
                                    this.richTextBox1.AppendText("U盤已插入,碟符是" + drive.Name.ToString() + "\r\n");
                                    break;
                                }
                            }
                            break;
                        case DBT_CONFIGCHANGECANCELED:
                            MessageBox.Show("2");
                            break;
                        case DBT_CONFIGCHANGED:
                            MessageBox.Show("3");
                            break;
                        case DBT_CUSTOMEVENT:
                            MessageBox.Show("4");
                            break;
                        case DBT_DEVICEQUERYREMOVE:
                            MessageBox.Show("5");
                            break;
                        case DBT_DEVICEQUERYREMOVEFAILED:
                            MessageBox.Show("6");
                            break;
                        case DBT_DEVICEREMOVECOMPLETE:
                            this.richTextBox1.AppendText("U盤已解除安裝");
                            break;
                        case DBT_DEVICEREMOVEPENDING:
                            MessageBox.Show("7");
                            break;
                        case DBT_DEVICETYPESPECIFIC:
                            MessageBox.Show("8");
                            break;
                        case DBT_DEVNODES_CHANGED:
                            MessageBox.Show("9");
                            break;
                        case DBT_QUERYCHANGECONFIG:
                            MessageBox.Show("10");
                            break;
                        case DBT_USERDEFINED:
                            MessageBox.Show("11");
                            break;
                        default:
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            base.WndProc(ref m);
        }
    }
}
當我們插拔U盤時,Form1窗體會出現下面響應



相關推薦

C#實現檢測U

C# Winform中WndProc 函式作用: 主要用在攔截並處理系統訊息和自定義訊息 比如:windows程式會產生很多訊息,比如你單擊滑鼠,移動視窗都會產生訊息。這個函式就是預設的訊息處理函式。你可以過載這個函式來制定自己的訊息處理流程. 在Winform程式

C#.NET U監控

【1】涉及的知識點 1) windows訊息處理函式 protected override void WndProc(ref Message m) 捕獲Message的系統硬體改變發出的系統訊息 2) 硬體資訊類 DriveInfo【2】核心函式 訊息常量: /// &

qt linux下自動檢測U

如果用U盤來更新軟體,需要先刪除當前的可執行檔案,但是如果刪除之後,複製失敗的話會導致後續沒有檔案可以運行了。一個方法是將新的可執行檔案放到另一個目錄中,當copy成功後修改linux的啟動檔案,然後reboot.    使用qt自帶的QDBus可以實現。 D-B

C#檢測U是否插入

定義 con 可用 cte 發生 def wndproc box default public partial class Form1 : Form { #region u盤屬性 public const int WM_DE

linux c程式實現獲取U的名字(卷標/碟符)

一、U盤的卷標 在linux系統下,顯示的U盤的卷標如下圖所示: 在linux系統下,顯示的U盤的碟符如下圖所示: 獲取U盤的卷標是通過命令blkid -s LABEL來實現,執行完shell命令,在標準輸出中就顯示 /dev/sda1: LABEL=ESD-USB 其中 /de

【玩轉開源】Linux C 檢測網口熱

int NetDetect(char *net_name, int *statue) { int ret = 0; int skfd = 0; struct ifreq ifr; skfd = socket(AF_INET, SOCK_DGRAM, 0); //建議s

linux c檢測網線熱(netlink)

#include <sys/types.h> #include <sys/socket.h> #include <asm/types.h> #include <linux/netlink.h> #include

Opencv(C++)實現二階線性

i++ -- alt key ++ enc 新的 round idt #include<opencv2\opencv.hpp> #include<iostream> using namespace cv; using namespace std;

U強制出丟失數據的恢復方法(U寫保護的四種解決方法)

沒有 文件 生成列 灰色 下載 而且 tool 需要 大小 ● U盤強制拔出丟失數據的恢復方法 U盤從出現以來,小巧便攜容量大深受人們的喜愛,不用像雲盤一樣需要下載,所以重要的文件我們都喜歡用U盤來傳遞數據,但是很多人使用U盤拔出時都沒有使用“彈出U盤”功能,取出過程中電腦

C# Winform下一個熱的MIS/MRP/ERP框架(多語言方案)

文件加載 全局 查詢 分享 技術 變量 支持 對象 style 個別時候,我們需要一種多語種切換方案。   我的想方案是這樣的: 1、使用文本文本存儲多語言元素,應用程序啟動時加載到內存表中; 2、應用程序啟動時從配置文件加載語種定義; 3、所有窗體繼承自一個Base

C# Winform下一個熱的MIS/MRP/ERP框架11(啟航)

aer tab chan byname 可能 清理 contex cati break   初學時,有了想法卻完全不知道該從何下指,此序列將拋磚引玉,與大家共同學習進步。   一個程序的初始,必然是啟動。   我的要求:   1、應用程序保持單例;   2、從配置文件加載一

C# Winform下一個熱的MIS/MRP/ERP框架15(窗體基類場景1)

分享 需求 權限 檢測 表名 check 系統 ref 代碼 最基礎的窗體基類其實是通過應用場景反推的結構。 以下是場景一:   單表應用,普通的數據,比如單位/顏色/特殊字典等使用者少的,無需過多控制的可以使用一個數據表格來管理。   和Excel表格差不多,批量修改,統

Ubuntu18.04使用f3probe檢測U實際容量

專案主頁 https://fight-flash-fraud.readthedocs.io/ 使用f3probe 能快速檢測出被測U盤的實際容量, 命令 $ sudo f3probe --destructive --time-ops /dev/sdc F3 probe 7.0 Copyri

C# Winform下一個熱的MIS/MRP/ERP框架16(窗體基類場景2)

基礎資料 簡單 bubuko 圖片 主鍵 筆記 沒有 窗體 熱插拔 如果沒有特別需求,和場景1一樣只變更表名,主鍵字段,檢測字段等名稱,不需要寫其它代碼了。 * 清單列表+單筆編輯/保存,適用於大多數基礎資料管理以及簡單的單據資料錄入(當然,排版是要改一改的): *

C# Winform下一個熱的MIS/MRP/ERP框架14(自動更新)

對於軟體來說,啟用自動更新是非常必要的。 根據軟體的應用場景,我們可以設計不同的更新模型。 目前,IMES框架執行在.Net framework 4.0下面,使用的Win系統版本在Win7,域內管控,平時業務調整也不是很頻繁。 所以,我的更新很粗放,就是刪除舊檔案,拷貝新檔案: 1、更新檔案放置在檔案

C# Winform下一個熱的MIS/MRP/ERP框架13(窗體基類)

作為一個ERP資料處理框架,大部分的開發場景都差不多。 理想中,對於通用資料處理,我的步驟如下: 1、為窗體指定資料來源(資料表/查詢等); 2、拖入編輯控制元件,指定繫結欄位; 3、結束。 為此,我設計了幾個基類窗體,給它們分成幾個場景(如無資料/單表資料/主從表/多表關聯等),在不同的業務模型下

U盤大盜,Python檢測U插入、自動複製檔案並寫入新檔案!

  技術要點:                 學習Python中有不明白推薦加入交流群               &

C# Winform下一個熱的MIS/MRP/ERP框架(簡介)

  Programmer普弱哥們都喜歡玩自己的框架,我也不例外。   理想中,這個框架要易於理解、易於擴充套件、易於維護;最重要的,易於CODING。   系統是1主體框架+N模組的多個EXE/DLL組成的,在主體框架開啟的時候,編譯完模組EXE可以馬上響應需求,不用退系統,不用重登入。   大概的目標:來一

C# Winform下一個熱的MIS/MRP/ERP框架(通用控制元件)

一直對商業控制元件不感冒, 結合日常工作, 我寫了幾個常用控制元件. 一、下拉框控制元件(仿Access下拉框:F4下拉,自動輸入,支援單/多列顯示),可在Datagridview中使用。 1、常規: 2、Datagridview:  二、帶按鈕的文字框(可在Datagridview中使用): 1、常

C# Winform下一個熱的MIS/MRP/ERP框架12(資料處理基類)

/// <summary> /// 資料庫連線基類 /// </summary> public class DBContext { /// <summary> /// 預設的加密方法Key,用於使用者