delphi7 导入RDP AcitveX 生成的MSTSCLib_TLB.pas
delphi真的好惨啊,资料都是其他语言的。用到都得自己转换,自身导入生成的还有问题。或者用法根本就不一样。
生成的是这样的: IMsRdpClientNonScriptable = interface(IMsTscNonScriptable) ['{2F079C4C-87B2-4AFD-97AB-20CDB43038AE}'] function NotifyRedirectDeviceChange(wParam: UINT_PTR; lParam: LONG_PTR): HResult; stdcall; function SendKeys(numKeys: Integer; var pbArrayKeyUp: WordBool; var plKeyData: Integer): HResult; stdcall; end; 通过导入生成的方法,是一次只能输入一个。不能多个一起输入。 根据微软的文档: https://learn.microsoft.com/vi-vn/windows/win32/termserv/imsrdpclientnonscriptable-sendkeys 这两个参数是数组才对,查阅资料后要改成下面这样 IMsRdpClientNonScriptable = interface(IMsTscNonScriptable) ['{2F079C4C-87B2-4AFD-97AB-20CDB43038AE}'] function NotifyRedirectDeviceChange(wParam: UINT_PTR; lParam: LONG_PTR): HResult; stdcall; function SendKeys(numKeys: Integer; pbArrayKeyUp: Pointer; plKeyData: Pointer): HResult; stdcall; 调用时也要注意: var keydatas: array[0..19] of integer; //一次最多发20个 keyupstate: array[0..19] of SmallInt; //c++中 VARIANT_BOOL 是COM 使用的布尔类型, 其实质上是 short 类型 不能使用boolen。c++的short对应的delphi的是SmallInt begin keydatas[0] := MapVirtualKey(65,0); keydatas[1] := MapVirtualKey(65,0); keydatas[2] := MapVirtualKey(66,0); keydatas[3] := MapVirtualKey(66,0); keydatas[4] := MapVirtualKey(67,0); keydatas[5] := MapVirtualKey(67,0); keyupstate[0] := 0; keyupstate[1] := 1; keyupstate[2] := 0; keyupstate[3] := 1; keyupstate[4] := 0; keyupstate[5] := 1; //注意状态要正确,不然会输入的结果。这里输入的是abc nonScriptable.SendKeys(6, @keyupda[0],@keydatas[0]); end
标签:function,MapVirtualKey,修正,keyupstate,TLB,stdcall,MSTSCLib,keydatas,PTR From: https://www.cnblogs.com/BTag/p/17298635.html