2014-09-11 71 views
4

这里(在本地剪贴板复制)是什么,我需要做的:编程方式获取文件内容数据在远程桌面会话

  1. 用户打开一个远程桌面会话(RD Web访问/远程应用程序)
  2. 用户本地PC上我们的应用程序的按钮
  3. 用户点击副本从资源管理器(Ctrl + C)文件(在RD会话中运行)和文件复制(粘贴)到一个已知的目录服务器上

复制/通行证te操作在远程文件资源管理器中手动完成时完美工作,但以编程方式从远程会话访问剪贴板内容时,我可以通过“FileGroupDescriptorW”格式获得文件列表(不含本地路径)。

我知道这是正常的,并已阅读MSN“RDP - 剪贴板虚拟通道扩展”文档。

我认为唯一的解决方案是从剪贴板虚拟通道使用“Format Contents Request PDU”和“Format Contents Response PDU”来请求文件内容。

问题是我不知道如何在Delphi实现这个(或我一直无法找到任何代码示例为此在网络上的任何其他语言)

那么,如何可以编程方式访问剪贴板虚拟来自RD会话的频道并传输文件内容?代码示例将不胜感激(甚至更多,如果有帕斯卡尔/德尔福)

谢谢!

+1

我个人认为你会更好地保持这种语言中立,并使其成为一个纯粹的winapi问题,从而吸引更广泛的受众 – 2014-09-11 07:54:39

+0

我已更改标签以遵循您的建议。谢谢。 – Vincent 2014-09-11 08:16:56

回答

0

我用一个小的vb脚本解决了这个问题(并解决了这个问题)。

此脚本可以由您的Delphi应用程序生成并启动。

My_Destination \文件夹是目标文件夹,文件夹打开和复制...是进度条显示的窗口,而复制文件名的目标窗口的名称。

Set objshell = Wscript.CreateObject("WScript.Shell") 

objshell.Run "cmd.exe /C start " & "My_Destination\Folder" 


success = objshell.AppActivate("My_Destination\Folder") 
WScript.Sleep 500 

objshell.Sendkeys "%HV" 

Set oShell = CreateObject("WScript.Shell") 
WScript.Sleep 3000 
Do 
    If (oShell.AppActivate("Copying...") = False) Then 
     If oShell.AppActivate("Folder") Then 
     WScript.Sleep 500 
     oShell.SendKeys "%{F4}" 
     End If 
     WScript.Sleep 3000 
     Exit Do 
    Else 
     WScript.Sleep 3000 
    End If 
Loop 

第一行打开目标文件夹的资源管理器窗口。 一旦窗口被激活,您可以发送模拟粘贴操作的按键(粘贴:%HV)。

最后一部分等待复制操作的终止,然后关闭打开的窗口。

注意:复制...窗口名称和击键序列(%HV)与语言相关。