.NET框架是否具有低级多媒体和鼠标支持?

时间:2011-04-20 16:51:09

标签: .net windows-7 mono

我正处于为Windows编写的新应用程序的规划阶段(如果可能的话,至少包括Win 7,Vista和Win XP)。此外,如果可以安排,我希望该应用程序可以在OS X(Snow Leopard)上运行,但这不是必需的。

无论如何,关于这个问题。该应用程序需要API功能才能执行以下任务:

  • 捕获屏幕的任意部分(每秒最多几帧)(如果可能,还显示鼠标指针)
  • 捕获声卡生成的所有音频输出
  • 以编程方式操作鼠标(移动并单击)

.NET是否具有满足这些要求的API功能?如果没有,那么什么是一个好的选择呢?


(注意:根据我的要求,似乎应用程序可能是恶意软件。但是,我向你保证它不是 - 它将是一种用于简化媒体消费的宏记录器/回放机制)。感谢大家! :)

4 个答案:

答案 0 :(得分:1)

没有。你可以用P / Invokes做这些。

答案 1 :(得分:1)

自从我完成它已经有一段时间了,但我认为你可以将鼠标光标移动到一个位置:

Cursor.Position = Drawing.Point(x, y)

你可以肯定地捕捉屏幕(假设你的意思是截图)。这有点像复制/粘贴,但是:

public class ScreenCapture : IDisposable
{
private string filePath = "";
private Attachment attachment;
private Bitmap bitmap = new Bitmap(1, 1);
private MemoryStream imageStream = new MemoryStream();

public ScreenCapture() { }

void IDisposable.Dispose()
{
  Dispose();
}
public void Dispose()
{
  if (bitmap != null)
    bitmap.Dispose();
  if (imageStream != null)
    imageStream.Close();
}

# region Property Methods
public string FilePath
{
  get { return filePath; }
}
# endregion  // Property Methods

# region Private Methods
/// <summary>
/// Capture the specified region into a bitmap object.
/// </summary>
/// <param name="sourcePoint">The point at the upper-left corner of the source rectangle.</param>
/// <param name="destinationPoint">The point at the upper-left corner of the destination rectangle.</param>
/// <param name="selectionRectangle">The size of the area to be transferred.</param>
private void CaptureRegionToBitmap(Point sourcePoint, Point destinationPoint, Rectangle selectionRectangle)
{
  if (bitmap != null)
    bitmap.Dispose();

  bitmap = new Bitmap(selectionRectangle.Width, selectionRectangle.Height);
  using (Graphics g = Graphics.FromImage(bitmap))
    g.CopyFromScreen(sourcePoint, destinationPoint, selectionRectangle.Size);
}
# endregion  // Private Methods

# region Public Methods
/// <summary>
/// Create an attachment to append to an email message.
/// </summary>
/// <returns>Returns an email attachment.</returns>
public Attachment GenerateAttachment()
{
  return GenerateAttachment("");
}
/// <summary>
/// Create an attachment from the generated bitmap to append to an email message.
/// </summary>
/// <param name="imageName">Provide a name for the attachment.</param>
/// <returns>Returns email attachment.</returns>
public Attachment GenerateAttachment(string imageName)
{
  if (attachment != null)
    attachment.Dispose();

  if (imageName == null || imageName.Trim() == "")
    imageName = Core.LoginUserName.ToLower() + "_image.png";

  bitmap.Save(imageStream, ImageFormat.Png);
  imageStream.Position = 0;
  attachment = new Attachment(imageStream, imageName, "image/png");
  return attachment;
}
/// <summary>
/// Capture the entire screen to a Bitmap object stored in memory.
/// </summary>
public void CaptureFullScreen()
{
  CaptureRegionToBitmap(new Point(0, 0), new Point(0, 0), SystemInformation.VirtualScreen);
}
/// <summary>
/// Save the generated bitmap to a physical file on disk.
/// </summary>
/// <param name="filePath"></param>
/// <returns>Returns True if save was successful; otherwise False.</returns>
public bool SaveToDisk(string filePath)
{
  bool saveSuccessful = false;
  try
  {
    bitmap.Save(filePath, ImageFormat.Png);
    this.filePath = filePath;
    saveSuccessful = true;
  }
  catch { }
  return saveSuccessful;
}
# endregion  // Public Methods
}

我忘记了该工具的名称,但微软有一个与任何Windows应用程序交互的UI测试/自动化工具,他们可以利用Windows辅助功能(对于残疾人/残障用户)以编程方式与所有内容进行交互。

这也可能是有趣的:UI Automation Fundamentals (MSDN)

答案 2 :(得分:1)

据我所知,没有这样的API。除此之外,拉力赛的回答似乎表明存在。

在我看来,使用Win32的API可能会熟悉这种行为,或者自己开发一个C / C ++库,您可以在其中完成任何您喜欢的任务,因为您不会受到.NET资源访问限制的限制,如果我可以说。

答案 3 :(得分:1)

.NET框架没有此功能的低级包装器。您可以通过一点创造力,pinvoke和directsound实现低级功能。我在过去的C#应用​​程序中完成了所有这些工作。这些链接可以让你快速到达那里(注意DirectSound第一次通过时有点挑战)......

http://msdn.microsoft.com/en-us/library/ee416960%28v=vs.85%29.aspx

http://www.pinvoke.net/default.aspx/user32/mouse_event.html

http://www.pinvoke.net/default.aspx/user32/sendinput.html