亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ioirmain.pas

?? 通過delphi USB控件讀寫數據
?? PAS
字號:
unit IOIRMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, Buttons, StdCtrls, ComCtrls,
  JvHidControllerClass;

const
  cCodeMercenariesVID = $07C0;
  cIOWarriorPID1      = $1500;
  cIOWarriorPID2      = $1501;
  cIRCommand          = $0C;
  cIRReportID         = $0C;
  cIROff              = $00;
  cIROn               = $01;

  // translation of RC5-Address to device names
  AddressNames: array [0..31] of PChar =
   (
    'TV1',
    'TV2',
    'Teletext',
    'Video',
    'LV1',
    'VCR1',
    'VCR2',
    'Experimental',
    'Sat1',
    'Camera',
    'Sat2',
    '11',
    'CDV',
    'Camcorder',
    '14',
    '15',
    'Pre-amp1',
    'Tuner',
    'Recorder1',
    'Pre-amp2',
    'CD Player',
    'Phono',
    'SatA',
    'Recorder2',
    '24',
    '25',
    'CDR',
    '27',
    '28',
    'Lighting1',
    'Lighting2',
    'Phone'
   );

type
  // data structure received from IO-Warrior 24
  PIOWarriorIRInputReport = ^TIOWarriorIRInputReport;
  TIOWarriorIRInputReport = packed record
    Command: Byte;  // data part 0..63 of IR RC5 code
    Address: Byte;  // device ID part 0..31 of IR RC5 code
    Empty: array [1..5] of Byte;  // 5 bytes containing 0
  end;

  // data structure to send to IO-Warrior 24
  PIOWarriorIROutputReport = ^TIOWarriorIROutputReport;
  TIOWarriorIROutputReport = packed record
    ReportID: Byte;  // needed for output
    IOData: array [0..6] of Byte;  // 7 Bytes for IO-Warrior
  end;

  // RC5 data and assigned key combination
  PKeyData = ^TKeyData;
  TKeyData = record
    Command: Byte;        // decoded RC5-Command
    Address: Byte;        // decoded RC5-Address
    Toggle: Boolean;      // toggles with each RC5 keypress
    Key: Word;            // assigned key
    Shift: TShiftState;   // assigned modifier keys
    ExtendedKey: Boolean; // numpad key or not
  end;

  TMainForm = class(TForm)
    HidCtl: TJvHidDeviceController;
    IOWarriorDetected: TLabel;
    CodeList: TListView;
    Description: TLabel;
    Clear: TButton;
    procedure HidCtlDeviceChange(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure HidCtlDeviceData(HidDev: TJvHidDevice;
      ReportID: Byte; const Data: Pointer; Size: Word);
    procedure CodeListDblClick(Sender: TObject);
    procedure ClearClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  public
    IOWarrior: TJvHidDevice;
    procedure UpdateControls;
  end;

var
  MainForm: TMainForm;

implementation

uses
  KeyEdit;

{$R *.dfm}

// untangle the RC5 data

procedure DecodeRC5Data(const Report: TIOWarriorIRInputReport;
  var KeyData: TKeyData);
begin
  // only 6 bits meaningful
  KeyData.Command := Report.Command and $3F;
  // move the inverted /C6 bit from Address to Command
  KeyData.Command := KeyData.Command or
    ((not Report.Address) and $40);
  // only 5 bits are address
  KeyData.Address := Report.Address and $1F;
  KeyData.Toggle  := (Report.Address and $20) <> 0;
end;

// send the assigned key combination as if
// coming from keyboard

procedure SendKeycodes(KeyData: PKeyData);
var
  ExtKey: DWORD;
begin
  if KeyData.Key = 0 then
    Exit;

  // the modifier keys go down
  if ssShift in KeyData^.Shift then
    keybd_event(VK_SHIFT, 0, 0, 0);
  if ssCtrl in KeyData^.Shift then
    keybd_event(VK_CONTROL, 0, 0, 0);
  if ssAlt in KeyData^.Shift then
    keybd_event(VK_MENU, 0, 0, 0);

  // add the extended bit as flag
  if KeyData^.ExtendedKey then
    ExtKey := KEYEVENTF_EXTENDEDKEY
  else
    ExtKey := 0;
  // the key goes down and up
  keybd_event(KeyData^.Key, 0, ExtKey, 0);
  keybd_event(KeyData^.Key, 0, ExtKey or KEYEVENTF_KEYUP, 0);

  // the modifier keys go up (reverse order)
  if ssAlt in KeyData^.Shift then
    keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
  if ssCtrl in KeyData^.Shift then
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
  if ssShift in KeyData^.Shift then
    keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end;

procedure TMainForm.FormActivate(Sender: TObject);
begin
  // the first OnDeviceChange could not access
  // the controls so it is repeated here
  UpdateControls;
end;

procedure TMainForm.UpdateControls;
const
  cIOWMessage = 'IO-Warrior with IR is plugged in';
begin
  if Assigned(IOWarriorDetected) then
  begin
    Description.Enabled := Assigned(IOWarrior);
    if Assigned(IOWarrior) then
      IOWarriorDetected.Caption := cIOWMessage
    else
      IOWarriorDetected.Caption := 'No ' + cIOWMessage;
  end;
end;

// callback function to search for the IO-Warrior

function FindIOWarrior(HidDev: TJvHidDevice): Boolean; stdcall;
begin
  // the IO-Warrior shows up as two devices
  // we want access to the IO-Warrior device for the IR command
  // the other one with a InputReportByteLength of 2 is for
  // access to the IO pins
  Result :=
    (HidDev.Attributes.VendorID = cCodeMercenariesVID) and
    (HidDev.Attributes.ProductID = cIOWarriorPID2) and
    (HidDev.Caps.InputReportByteLength = 8);
end;

// check if the IO-Warrior was plugged or unplugged

procedure TMainForm.HidCtlDeviceChange(Sender: TObject);
var
  BytesWritten: Cardinal;
  IOWarriorOutputReport: TIOWarriorIROutputReport;
begin
  // Free the device object if it has been unplugged
  if Assigned(IOWarrior) and not IOWarrior.IsPluggedIn then
    FreeAndNil(IOWarrior);

  // if no IO-Warrior in use yet then search for one
  if not Assigned(IOWarrior) then
    if HidCtl.CheckOutByCallback(IOWarrior, FindIOWarrior) then
    begin
      // enable IR mode
      FillChar(IOWarriorOutputReport,
        SizeOf(IOWarriorOutputReport), #0);
      IOWarriorOutputReport.ReportID  := cIRCommand;
      IOWarriorOutputReport.IOData[0] := cIROn;
      IOWarrior.WriteFile(IOWarriorOutputReport,
        SizeOf(IOWarriorOutputReport), BytesWritten);
    end;
  UpdateControls;
end;

// IR data arrived from the device

procedure TMainForm.HidCtlDeviceData(HidDev: TJvHidDevice;
  ReportID: Byte; const Data: Pointer; Size: Word);
var
  I: Integer;
  KeyData: TKeyData;
  PData: PKeyData;
  FoundAt: Integer;
  Item: TListItem;
  IOWarriorInputReport: TIOWarriorIRInputReport;
begin
  IOWarriorInputReport := PIOWarriorIRInputReport(Data)^;
  if ReportID = cIRReportID then
  begin
    // extract data payload from report
    FillChar(KeyData, SizeOf(KeyData), #0);
    DecodeRC5Data(IOWarriorInputReport, KeyData);

    // search if RC5 data is already in list
    FoundAt := -1;
    for I := 0 to CodeList.Items.Count-1 do
    begin
      PData := PKeyData(CodeList.Items[I].Data);
      if (KeyData.Command = PData^.Command) and
        (KeyData.Address = PData^.Address) then
      begin
        FoundAt := I;
        Break;
      end;
    end;

    if FoundAt = -1 then
    begin
      // RC5 data not found so add it to list
      Item := CodeList.Items.Add;
      Item.Caption := AddressNames[KeyData.Address];
      Item.SubItems.Add(Format('%d', [KeyData.Command]));
      Item.SubItems.Add('--');  // no name yet
      Item.SubItems.Add('');    // no key assigned yet
      // store KeyData in Data of Item
      GetMem(PData, SizeOf(TKeyData));
      PData^ := KeyData;
      Item.Data := PData;
    end
    else
    begin
      // code found so send the assigned key combination
      Item := CodeList.Items[FoundAt];
      CodeList.ItemIndex := FoundAt;
      SendKeycodes(Item.Data);
    end;
  end;
end;

// edit an entry of the CodeList

procedure TMainForm.CodeListDblClick(Sender: TObject);
var
  Item: TListItem;
  PData: PKeyData;
begin
  // see if an item is selected
  Item := nil;
  if CodeList.ItemIndex >= 0 then
    Item := CodeList.Items[CodeList.ItemIndex];
  if Assigned(Item) then
    // create edit form
    with TKeyEditForm.Create(Self) do
    begin
      // initialize controls
      PData := Item.Data;
      KeyData := PData^;
      Address.Caption := Item.Caption;
      Value.Caption   := Item.SubItems[0];
      Name.Text       := Item.SubItems[1];
      Keys.Text       := Item.SubItems[2];
      ExtKey.Checked  := KeyData.ExtendedKey;
      if ShowModal = mrOk then
      begin
         // get back edited values
         Item.SubItems[1] := Name.Text;
         Item.SubItems[2] := Keys.Text;
         PData^ := KeyData;
      end;
      Free;
    end;
end;

// clear all assignments

procedure TMainForm.ClearClick(Sender: TObject);
var
  I: Integer;
begin
  CodeList.Items.BeginUpdate;
  for I := CodeList.Items.Count-1 downto 0 do
  begin
    FreeMem(CodeList.Items[I].Data);
    CodeList.Items.Delete(I);
  end;
  CodeList.Items.EndUpdate;
end;

// always clean up properly

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  ClearClick(Self);
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本午夜一区二区| 制服丝袜中文字幕一区| 欧美蜜桃一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 亚洲一区二区综合| 丁香啪啪综合成人亚洲小说 | 日韩1区2区3区| 91香蕉视频污| 中文字幕精品一区二区精品绿巨人| 日本欧美久久久久免费播放网| 91免费视频观看| 国产精品国产自产拍高清av王其| 精品综合免费视频观看| 欧美人伦禁忌dvd放荡欲情| 亚洲日本在线视频观看| av电影在线观看完整版一区二区| 国产午夜精品福利| 国内精品免费**视频| 91精品国产欧美一区二区成人| 亚洲猫色日本管| 91麻豆精品秘密| 亚洲日本乱码在线观看| av在线不卡观看免费观看| 欧美国产日产图区| 国产成人综合精品三级| 国产日韩欧美不卡在线| 国产在线播放一区三区四| 日韩欧美国产综合| 久久精品国产精品亚洲精品| 91精品婷婷国产综合久久竹菊| 一区二区三区成人| 欧美最猛性xxxxx直播| 一区二区三区在线免费播放| 91成人免费电影| 午夜精品久久一牛影视| 91精品国产综合久久小美女| 日韩国产一区二| 日韩色在线观看| 激情综合亚洲精品| 国产网站一区二区三区| 99视频精品免费视频| 亚洲精品v日韩精品| 欧美伊人久久久久久久久影院| 亚洲国产综合视频在线观看| 欧美一区二区三区在线观看视频| 麻豆精品国产91久久久久久 | 4438x亚洲最大成人网| 偷偷要91色婷婷| 精品久久久久av影院 | 亚洲成人免费视频| 在线91免费看| 国产一区二区三区四区五区入口| 国产网站一区二区三区| 色天使色偷偷av一区二区| 污片在线观看一区二区| 久久久精品中文字幕麻豆发布| 成人国产亚洲欧美成人综合网| 亚洲尤物视频在线| 精品成人免费观看| 91视频xxxx| 日本中文字幕一区二区视频| 久久久久久久久久美女| 欧美性生活影院| 成人动漫一区二区三区| 亚洲精选免费视频| wwww国产精品欧美| 99视频一区二区| 久久99精品国产麻豆婷婷| 中文字幕色av一区二区三区| 欧美一区二区二区| 91在线观看高清| 国产在线一区二区| 亚洲大尺度视频在线观看| 日本一区二区三区dvd视频在线| 欧美日免费三级在线| 成人午夜视频免费看| 欧美96一区二区免费视频| 国产精品视频免费看| 日韩欧美国产一区二区在线播放 | 欧美高清视频一二三区| 不卡的av电影| 狠狠色丁香婷婷综合| 亚洲国产精品嫩草影院| 国产精品美女久久久久aⅴ| 日韩一区二区高清| 91久久精品午夜一区二区| 国产精品自产自拍| 麻豆成人久久精品二区三区小说| 亚洲一区在线看| 日韩美女视频一区二区| 精品国产三级电影在线观看| 欧美电影一区二区三区| 在线观看成人免费视频| 不卡视频一二三| 国内成+人亚洲+欧美+综合在线| 亚洲成人久久影院| 亚洲一区在线观看免费观看电影高清| 国产视频一区在线播放| 久久亚洲一级片| 欧美精品一区二区久久婷婷| 3d成人h动漫网站入口| 欧美日韩aaa| 精品视频999| 欧美三级欧美一级| 欧美日高清视频| 欧美精品久久久久久久多人混战 | 国产精品国产三级国产普通话99| 欧美精品一区二区三区视频| 日韩视频免费直播| 精品久久久久久久久久久院品网| 精品欧美黑人一区二区三区| 久久精品在这里| 国产欧美日韩视频在线观看| 久久久久久久久岛国免费| 欧美精品一区二区三区很污很色的| 日韩一区二区视频在线观看| 日韩一区二区在线观看| 精品剧情在线观看| 久久精品无码一区二区三区| 精品国精品国产尤物美女| 日韩一卡二卡三卡四卡| 精品久久久影院| 亚洲国产精品传媒在线观看| 国产精品短视频| 亚洲专区一二三| 蜜乳av一区二区三区| 国产一区二区毛片| 99精品视频在线观看免费| 91在线免费看| 欧美丰满嫩嫩电影| 精品少妇一区二区三区视频免付费| 久久精品夜夜夜夜久久| 日韩美女视频19| 日韩av高清在线观看| 国产精一区二区三区| 91亚洲国产成人精品一区二区三 | 亚洲欧美乱综合| 亚洲午夜精品网| 狠狠色综合日日| 波多野结衣中文字幕一区二区三区| 99国产精品99久久久久久| 欧美日韩1区2区| 久久久精品国产99久久精品芒果| 亚洲日本欧美天堂| 日日噜噜夜夜狠狠视频欧美人| 狠狠色狠狠色综合| 91福利精品视频| 亚洲精品一区二区三区福利| 亚洲精品免费看| 蜜桃视频一区二区三区在线观看| 处破女av一区二区| 欧美精品v日韩精品v韩国精品v| 久久精品一区二区三区四区| 亚洲综合免费观看高清完整版 | 亚洲欧洲韩国日本视频| 日韩一区精品视频| 91在线码无精品| 精品少妇一区二区三区在线播放 | 欧美性一区二区| 精品少妇一区二区三区在线播放| 亚洲欧洲在线观看av| 精品一区二区三区免费播放| 色综合久久88色综合天天| 2020国产精品| 日韩精品欧美成人高清一区二区| av网站一区二区三区| 日韩欧美123| 污片在线观看一区二区 | 国产精品一二三四区| 7777精品久久久大香线蕉| 1区2区3区国产精品| 国内精品免费在线观看| 91精品综合久久久久久| 亚洲综合一区在线| av高清不卡在线| 久久精品视频在线看| 麻豆精品国产91久久久久久| 欧美日韩国产a| 亚洲一区二区三区四区在线观看 | 亚洲日本va在线观看| 国产成人av自拍| 精品日本一线二线三线不卡| 日韩制服丝袜先锋影音| 在线观看日韩电影| 亚洲免费av在线| 99久久婷婷国产综合精品| 国产欧美一区二区精品性| 狠狠狠色丁香婷婷综合激情| 日韩女优电影在线观看| 蜜桃av一区二区在线观看| 69堂成人精品免费视频| 水蜜桃久久夜色精品一区的特点| 在线中文字幕一区二区| 一区二区高清视频在线观看| 91亚洲男人天堂| 亚洲精品日韩一| 欧美日韩一区三区四区| 一区二区三区在线观看欧美| 欧美视频第二页| 日韩av网站免费在线|