以编程方式获取远程桌面会话中的文件内容数据(在本地剪贴板中复制)

时间:2014-09-11 07:52:50

标签: winapi clipboard rdp

以下是我需要做的事情:

  1. 用户打开远程桌面会话(RD Web访问/远程应用程序)
  2. 用户从本地PC上的资源管理器(CTRL + C)复制文件
  3. 用户点击我们应用中的按钮(在RD会话中运行),文件被复制(粘贴)到服务器上的已知目录
  4. 当在远程文件资源管理器中手动完成时,复制/粘贴操作可以完美地工作,但是当我从远程会话以编程方式访问剪贴板内容时,我只能通过" FileGroupDescriptorW"来获取文件列表(没有本地路径)。格式。

    我知道这是正常的,已经阅读了MSN" RDP - 剪贴板虚拟频道扩展"文件。

    我认为唯一的解决方案是使用"格式内容请求PDU"来请求文件内容。和"格式内容响应PDU"来自剪贴板虚拟频道。

    问题是我不知道如何在Delphi(或任何其他语言)中实现这一点,因为我无法在网上找到任何代码示例

    那么我如何以编程方式从RD会话访问剪贴板虚拟通道并流式传输文件内容?代码示例将非常受欢迎(如果有Pascal / Delphi则更多)

    谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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 )与语言有关。