zoukankan      html  css  js  c++  java
  • Delphi监听USB

    --------------

    请先下载HID控件

    ------DelphiXE测试可行------

    本程序的DBgrid显示无用处,因为没有对其做什么处理,本例子仅作为监听USB参考

    ----------Unit---开始--------

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, DB, ADODB, ExtCtrls, DBGridEhGrouping, Grids, RzGrids,
    StdCtrls, JvComponentBase, JvHidControllerClass, Buttons, DBTables,
    Menus, PropFilerEh, PropStorageEh, DBGrids;

    type
    TForm1 = class(TForm)
    Panel1: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    ADOCommand1: TADOCommand;
    Memo1: TMemo;
    Splitter1: TSplitter;
    DataSource1: TDataSource;
    Splitter2: TSplitter;
    Splitter3: TSplitter;
    ADOQuery1Test_DateTime: TDateTimeField;
    ADOQuery1Test_Command: TStringField;
    HidCtrl_01: TJvHidDeviceController;
    PopupMenu1: TPopupMenu;
    N0001: TMenuItem;
    Edit3: TEdit;
    DevListBox: TListBox;
    DBGrid1: TDBGrid;
    function HidCtrl_01Enumerate(HidDev: TJvHidDevice;
    const Idx: Integer): Boolean;
    procedure HidCtrl_01DeviceChange(Sender: TObject);
    procedure HidCtrl_01DeviceData(HidDev: TJvHidDevice; ReportID: Byte;
    const Data: Pointer; Size: Word);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    //procedure DBGridEh1CellClick(Column: TColumnEh);
    procedure ADOQuery1AfterScroll(DataSet: TDataSet);
    procedure N0001Click(Sender: TObject);
    procedure HidCtrl_01Arrival(HidDev: TJvHidDevice);
    procedure DevListBoxClick(Sender: TObject);
    private
    { Private declarations }
    public
    CurrentDevice: TJvHidDevice;
    CurrFiledvalue:string;
    { Public declarations }
    end;
    TMyWriteDataToDataBase=class(TThread)
    private
    FMyStringList:TStringList;
    procedure SetStringList(vstrList:TStringList );
    protected
    procedure Execute; override ;
    public
    constructor Create; overload;
    constructor Create(CreateSuspended: Boolean); overload;
    property MyStringList:TStringList read FMyStringList write SetStringList;
    end;
    var
    Form1: TForm1;
    MyWriteDataToDataBase:TMyWriteDataToDataBase;
    implementation

    {$R *.dfm}
    //延迟函数:方法一
    {procedure delay(msecs:integer);
    var
    Tick: DWord;
    Event: THandle;
    begin
    Event := CreateEvent(nil, False, False, nil);
    try
    Tick := GetTickCount + DWord(msecs);
    while (msecs > 0) and (MsgWaitForMultipleObjects(1, Event, False, msecs, QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
    Application.ProcessMessages;
    msecs := Tick - GetTickcount;
    end;
    finally
    CloseHandle(Event);
    end;

    end; }
    {用Delay代替Sleep}
    procedure Delay(dwMilliseconds:DWORD);stdcall;//Longint
    var
    iStart,iStop:DWORD;
    begin
    iStart := GetTickCount;
    repeat
    iStop := GetTickCount;
    Application.ProcessMessages;
    until (iStop - iStart) >= dwMilliseconds;
    end;
    procedure AddDatato(v:Tstringlist); stdcall;
    begin
    if v.Count >0 then // Form1.ListBox1.items.Count >0
    begin
    //Form1.ADOCommand1.commandtext:=Format('insert into CommandParser(Test_DateTime,Test_Command) Values (%f,''%s'')',[SysUtils.now(),Form1.ListBox1.items.Strings[0]]);
    {Form1.Edit2.Text :=FormatDateTime('yyyymmdd hh:mm:ss zzz',now);
    Form1.ADOCommand1.commandtext:=Format('insert into CommandParser(Test_DateTime,Test_Command) Values (%.6f,''%s'')',[now,Form1.ListBox1.items.Strings[0]]);
    Form1.ADOCommand1.Execute ;
    Form1.ListBox1.items.Delete(0); }
    //Form1.Edit2.Text :=FormatDateTime('yyyymmdd hh:mm:ss zzz',now);
    ///Form1.ADOCommand1.commandtext:=Format('insert into CommandParser(Test_DateTime,Test_Command) Values (%.10f,''%s'')',[now,v.Strings[0]]); //用这个,数据库中的日期会多两天
    Form1.ADOCommand1.commandtext:=Format('insert into CommandParser(Test_DateTime,Test_Command) Values (''%s'',''%s'')',[FormatDateTime('yyyy/mm/dd hh:mm:ss.zzz',now),v.Strings[0]]);
    Form1.ADOCommand1.Execute ;
    v.Delete(0);
    end;
    end;
    procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
    begin
    Memo1.Lines.Text :=ADOQuery1.FieldByName ('Test_Command').AsString ;
    end;


    {procedure TForm1.DBGridEh1CellClick(Column: TColumnEh);
    var
    p:Tpoint;
    begin
    CurrFiledvalue:=Column.Field.AsString ;
    GetCursorPos(p);
    PopupMenu1.Popup(p.X,p.y) ;
    end; }

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    MyWriteDataToDataBase.Suspend;
    end;

    procedure TForm1.FormShow(Sender: TObject);
    //var
    //v:TStringList ;
    begin
    MyWriteDataToDataBase:=TMyWriteDataToDataBase.Create(True );
    // v:= TStringList.Create ;
    //MyWriteDataToDataBase.MyStringList :=v;
    end;


    procedure TForm1.HidCtrl_01Arrival(HidDev: TJvHidDevice);
    begin
    //ShowMessage(HidDev.ProductName);
    end;

    procedure TForm1.HidCtrl_01DeviceChange(Sender: TObject);

    var
    Dev: TJvHidDevice;
    I: Integer;
    begin
    DevListBox.Items.Clear;
    HidCtrl_01.Enumerate;
    if Assigned(DevListBox) then
    begin
    for I := 0 to DevListBox.Items.Count - 1 do
    begin
    Dev := TJvHidDevice(DevListBox.Items.Objects[I]);
    Dev.Free;
    end;
    DevListBox.Clear;
    //HistoryListBox.Clear;
    HidCtrl_01.Enumerate;
    if DevListBox.Items.Count > 0 then
    begin
    DevListBox.ItemIndex := 0;
    DevListBoxclick (Self);
    end;
    end;
    end;

    procedure TForm1.HidCtrl_01DeviceData(HidDev: TJvHidDevice; ReportID: Byte;
    const Data: Pointer; Size: Word);
    var
    I: Integer;
    Str: string;
    begin
    Str := Format('R %.2x :', [ReportID]);
    for I := 0 to Size - 1 do
    Str := Str + Format('%.2x ', [Cardinal(PAnsiChar(Data)[I])]);
    MyWriteDataToDataBase.MyStringList.Add(Str) ; //MyWriteDataToDataBase.MyStringList.Add(Str) ;
    //ListBox1.ItemIndex := ListBox1.Items.Add(Str);
    end;

    function TForm1.HidCtrl_01Enumerate(HidDev: TJvHidDevice;
    const Idx: Integer): Boolean;
    var
    N: Integer;
    Dev: TJvHidDevice;
    begin
    if Assigned(DevListBox) then
    begin
    if HidDev.ProductName <> '' then
    N := DevListBox.Items.Add(HidDev.ProductName)
    else
    N := DevListBox.Items.Add(Format('Device VID=%.4x PID=%.4x',
    [HidDev.Attributes.VendorID, HidDev.Attributes.ProductID]));
    HidCtrl_01.CheckOutByIndex(Dev, Idx);
    DevListBox.Items.Objects[N] := Dev;
    end;
    //Timer1.Enabled :=True;
    if MyWriteDataToDataBase.Suspended then
    MyWriteDataToDataBase.Resume;
    Result := True;
    end;

    procedure TForm1.DevListBoxClick(Sender: TObject);
    var
    I: Integer;
    Dev: TJvHidDevice;
    begin
    //SpeedButton1.Down := False;
    //SpeedButton1Click(Self);
    end;

    procedure TForm1.N0001Click(Sender: TObject);
    begin
    ShowMessage(CurrFiledvalue);
    end;

    { TMyWriteDataToDataBase }

    constructor TMyWriteDataToDataBase.Create;
    var
    v:TStringList ;
    begin
    inherited ;
    v:= TStringList.Create ;
    FMyStringList :=v;
    end;


    constructor TMyWriteDataToDataBase.Create(CreateSuspended: Boolean);
    var
    v:TStringList ;
    begin
    inherited ;
    v:= TStringList.Create ;
    FMyStringList :=v;
    end;

    procedure TMyWriteDataToDataBase.Execute;
    begin
    while Terminated=false do
    begin
    AddDatato(MyStringList ) ;
    Delay(10);//延时10毫秒
    end;

    end;

    procedure TMyWriteDataToDataBase.SetStringList(vstrList: TStringList);
    begin
    FMyStringList:=vstrList;
    end;

    end.


    {//延迟函数:方法一
    procedure delay(msecs:integer);
    var
    Tick: DWord;
    Event: THandle;
    begin
    Event := CreateEvent(nil, False, False, nil);
    try
    Tick := GetTickCount + DWord(msecs);
    while (msecs > 0) and (MsgWaitForMultipleObjects(1, Event, False, msecs, QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
    Application.ProcessMessages;
    msecs := Tick - GetTickcount;
    end;
    finally
    CloseHandle(Event);
    end;

    //延迟函数:方法二
    procedure Delay(dwMilliseconds:DWORD);//Longint
    var
    iStart,iStop:DWORD;
    begin
    iStart := GetTickCount;
    repeat
    iStop := GetTickCount;
    Application.ProcessMessages;
    until (iStop - iStart) >= dwMilliseconds;
    End;}

    ------------------------Unit-结束----------

    -----------Form开始--

    object Form1: TForm1
    Left = 0
    Top = 0
    Caption = 'Form1'
    ClientHeight = 496
    ClientWidth = 1046
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'Tahoma'
    Font.Style = []
    OldCreateOrder = False
    OnClose = FormClose
    OnShow = FormShow
    PixelsPerInch = 96
    TextHeight = 13
    object Panel1: TPanel
    Left = 0
    Top = 0
    Width = 1046
    Height = 496
    Align = alClient
    Caption = 'Panel1'
    TabOrder = 0
    object Splitter2: TSplitter
    Left = 1
    Top = 1
    Height = 494
    ExplicitLeft = 360
    ExplicitTop = 144
    ExplicitHeight = 100
    end
    object Splitter3: TSplitter
    Left = 209
    Top = 1
    Height = 494
    ExplicitLeft = 656
    ExplicitTop = 120
    ExplicitHeight = 100
    end
    object Panel3: TPanel
    Left = 4
    Top = 1
    Width = 205
    Height = 494
    Align = alLeft
    Caption = 'Panel3'
    TabOrder = 0
    object Edit3: TEdit
    Left = 48
    Top = 456
    Width = 121
    Height = 21
    ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861
    TabOrder = 0
    Text = 'Edit3'
    end
    object DevListBox: TListBox
    Left = 6
    Top = 1
    Width = 171
    Height = 56
    ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861
    ItemHeight = 13
    TabOrder = 1
    OnClick = DevListBoxClick
    end
    end
    object Panel4: TPanel
    Left = 212
    Top = 1
    Width = 833
    Height = 494
    Align = alClient
    Caption = 'Panel4'
    TabOrder = 1
    object Splitter1: TSplitter
    Left = 1
    Top = 373
    Width = 831
    Height = 3
    Cursor = crVSplit
    Align = alBottom
    ExplicitTop = 1
    ExplicitWidth = 375
    end
    object Memo1: TMemo
    Left = 1
    Top = 376
    Width = 831
    Height = 117
    Align = alBottom
    ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861
    Lines.Strings = (
    'Memo1')
    TabOrder = 0
    end
    object DBGrid1: TDBGrid
    Left = 1
    Top = 1
    Width = 831
    Height = 372
    Align = alClient
    DataSource = DataSource1
    ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861
    TabOrder = 1
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
    end
    end
    end
    object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
    'Provider=SQLOLEDB.1;Password=sa123456;Persist Security Info=True' +
    ';User ID=sa;Initial Catalog=HJP;Data Source=.SQLEXPRESS'
    LoginPrompt = False
    Provider = 'SQLOLEDB.1'
    Left = 504
    Top = 64
    end
    object ADOQuery1: TADOQuery
    Connection = ADOConnection1
    CursorType = ctStatic
    AfterScroll = ADOQuery1AfterScroll
    EnableBCD = False
    Parameters = <>
    SQL.Strings = (
    'select * from CommandParser')
    Left = 832
    Top = 112
    object ADOQuery1Test_DateTime: TDateTimeField
    DisplayLabel = #27979#35797#26102#38388
    DisplayWidth = 22
    FieldName = 'Test_DateTime'
    DisplayFormat = 'yyyy-mm-dd hh:mm:ss zzz'
    end
    object ADOQuery1Test_Command: TStringField
    DisplayLabel = #27979#35797#25351#20196
    DisplayWidth = 66
    FieldName = 'Test_Command'
    Size = 500
    end
    end
    object ADOCommand1: TADOCommand
    Connection = ADOConnection1
    Parameters = <>
    Left = 504
    Top = 120
    end
    object DataSource1: TDataSource
    AutoEdit = False
    DataSet = ADOQuery1
    Left = 832
    Top = 184
    end
    object HidCtrl_01: TJvHidDeviceController
    DevThreadSleepTime = 10000
    OnArrival = HidCtrl_01Arrival
    OnEnumerate = HidCtrl_01Enumerate
    OnDeviceChange = HidCtrl_01DeviceChange
    OnDeviceData = HidCtrl_01DeviceData
    Left = 80
    Top = 16
    end
    object PopupMenu1: TPopupMenu
    Left = 608
    Top = 208
    object N0001: TMenuItem
    Caption = '000'
    OnClick = N0001Click
    end
    end
    end

    -----------Form结束-------

  • 相关阅读:
    转载:USB1.1与USB2.0接口区别及识别
    漏洞利用
    ftp命令及登录
    转贴:厉害的BHO
    ip地址祥解
    windows xp最基本启动项目
    转载:小小技巧
    光驱能否刻录的查看方式
    转载:鲜为人知的Windows“插件”MSI
    转载:日常保健
  • 原文地址:https://www.cnblogs.com/dmqhjp/p/14155419.html
Copyright © 2011-2022 走看看