1、如果使用visual c++ 或是MFC 程式語言來與HID Device溝通則必須先安裝WDK,因為必須包含(Include)HID 相關的標頭檔
(header file)。
2、安裝WDK後在工具->選項->專案和方案->Visual C++目錄中設定下列資料:
Setting Include File:(1) \inc\ddk (2) \inc\api
Setting Library File:(1) lib\wlh\i386
3、使用Visual C#則不需要先安裝WDK,因為相關的Structure和vairable 必須使用者自行宣告。
EX:
Structure Setting:
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi)]
public struct DeviceInterfaceData
{
public int Size;
public Guid InterfaceClaseGuid;
public int Flags;
public int Reserved;
}
Vairable Setting :
public const uint GENERIC_READ = 0x80000000;
public const uint FILE_SHARE_WRITE = 0x2;
4、使用DLLImport來Include hid.dll 、setupapi.dll和其他的Windows API library。
EX:
using System.Runtime.InteropServices;
[DllImport("setupapi.dll",SetLastError = true)]
protected static extern int SetupDiDestroyDeviceInfoList(IntPtr lpInfoSet);
[DllImport("hid.dll", CharSet = CharSet.Auto)]
protected static extern bool HidD_FreePreparedData(ref IntPtr PreparedData);
5 、HID 主要分下列三種不同的Report分別使用相應的函式(function)進行溝通:
Feature Report: HidD_GetFeature 、 HidD_SetFeature
Output Report: WriteFile (Interrupt Transfer) 、HidD_SetOutputReport (Control Transfer)
Intput Report: ReadFile (Interrupt Transfer)、H idD_SetInputReport(Control Transfer)
6、對於滑鼠、鍵盤此類獨占性的設備只能進行查詢的動作。
7、在C#中如果要擷取視窗訊息則必須要override WndProc function來取得系統訊息。
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_DEVICECHANGE&&mWParam.ToInt32() == DBT_DEVNODES_CHANGED)
{ Program Context ……… }
}
Download : UseHIDSample.zip UseHIDSample.exe
Result :

謝謝您的分享 不好意思 我想請問一下 為什麼我執行Debug卻無法像你一樣可以按Read Data呢 三個按鍵都是反白 無法點選??
你有插入有宣告read或write report的HID device嗎?如果沒有的話,反白是正常的!
抱歉~ 我不太懂您的意思 你的意思是指插入HID裝置嗎? 我是有插滑鼠 想要讀取滑鼠的資料 不知道用你所提供的是否可以讀到??
我的那個程式是專門讀consumer device,不能讀mouse device,要另外用其他的API來讀!
嗯嗯 我知道了 謝謝 不知道您有其他的聯絡方式嗎? 我目前也剛好在研究USB的傳輸 希望能和您請教一下 我的mail是jewelz38@gmail.com 因為目前在研究HID和Mass Storage Device 但卻都卡在取得Handle後 無法順利進行ReadFile和WriteFile 不知道哪裡出錯 所以想跟您請教一下 謝謝
您好,感謝您的分享 我最近在研究visual C#,因為在找如何與dll溝通的方式因而來到您的blog^^ 雖然我沒看出來要如何做溝通 不過還是很高興認識您^^
哈!!謝謝您的回覆~~
請問: 1. SN: 0x100... 這是啥參數? 2. Device Type: Usage Page.... <= 這是? 我自己設計一個 USB device... 控制台能看到,我自己的程式也能讀寫...但用你的 utility 確動不了,尚請指教....
您好 其實我參考你的這個TOOL改成了LCD及刷卡機及印表機測試工具,韌體更新工具,目前遇到需要透過網路對一台標籤機做控制,請問該如何透過網路列出有連接的裝置呢?? 你太強了!!!
你好,我想要同時read / write,但是我卡在createfile的flag部分,只要下FILE_FLAG_OVERLAPPED 的話write就有問題,但是給0換成read有問題!!有什麼方法可以達到??
你好, 我在windows 10 x64, visual studio 2010跑 UseHIDSample 時看到些問題 大致上是目標平台為x64會無法正常執行, 需要做些修正 1. private static extern void HidD_GetHidGuid(ref Guid HID_GUID); 輸入參數缺了ref , 沒加會導致無法正確取得GUID , 2. DeviceInterfaceData.Reserved 型別由int 改成 intPtr 3. oDetail.Size = 5; 改成 oDetail.Size = (IntPtr.Size == 4) ? (4 + Marshal.SystemDefaultCharSize) : 8;
您好, 請問我改成x64平台後,為何會出現傳送資料失敗? "1 FALSE 0xFD 0x75"
無法下載.... 可以確認一下嗎? 謝謝
Download : UseHIDSample.zip UseHIDSample.exe 無法下載
Dear 板主, 最近小弟也想要write read ㄧ個HID 裝置 在您的網站上看到程式碼,是否可以可以 跟您要source code,拜托,我這突然的要求 chiaminghuang@gmail.com
Dear 板主,麻煩也要一份 ak49ak49949@gmail.com
Dear 板主, 也請寄給我一份, 十二萬分的感謝. e mail: solan_twpolo@yahoo.com.tw
Dear 板主, 也請寄給我一份, 十二萬分的感謝. e mail: solan_twpolo@yahoo.com.tw
Dear 版主, ˋ可以寄UseHIDSample.zip給我嗎? 我也正在研究HID相關的API, 謝謝! sokaku.hsieh@gmail.com