Я сделал простое приложение C # WinForms, которое делает снимок экрана
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SlimDX.Direct3D9;
using SlimDX;
namespace KMPP
{
public class DxScreenCapture
{
Device d;
public DxScreenCapture()
{
PresentParameters present_params = new PresentParameters();
present_params.Windowed = true;
present_params.SwapEffect = SwapEffect.Discard;
d = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.SoftwareVertexProcessing, present_params);
}
public Surface CaptureScreen()
{
Surface s = Surface.CreateOffscreenPlain(d, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Format.A8R8G8B8, Pool.Scratch);
d.GetFrontBufferData(0, s);
return s;
}
}
}
Теперь, чтобы назвать это:
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using SlimDX.Direct3D9;
using SlimDX;
using KMPP;
using System.Diagnostics;
using System.Threading;
namespace dxcapture
{
public partial class Form1 : Form
{
DxScreenCapture sc = new DxScreenCapture();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Stopwatch stopwatch = new Stopwatch();
DateTime current = DateTime.Now;
string n = string.Format(@"text-{0:yyyy-MM-dd_hh-mm-ss-tt}.bmp",DateTime.Now);
string directory = (@"C:\temp\");
string name = (".bmp");
string filename = String.Format("{0:hh-mm-ss}{1}", DateTime.Now, name);
string path = Path.Combine(directory, filename);
stopwatch.Start();
Thread.Sleep(1000);
Surface s = sc.CaptureScreen();
Surface.ToFile(s, path, ImageFileFormat.Bmp);
stopwatch.Stop();
s.Dispose();
textBox1.Text = ("Elapsed:" + stopwatch.Elapsed.TotalMilliseconds);
}
private void button2_Click(object sender, EventArgs e)
{
}
}
}
Все работает нормально, когда я запускаю это приложение на Windows 7 x64 (оно было скомпилировано здесь)
К сожалению, когда я пытаюсь запустить это приложение на компьютере с Windows XP x86 - я получаю следующую ошибку:
Как я пытался это исправить?
установлен новейший DX на WinXP
установил последнюю версию SlimDX на WinXP (кстати, этот шаг решил мою предыдущую проблему)
установил последнюю версию .Net Framework v.4 на WinXP
скомпилировал это приложение как x86 и использовал SlimDX.dll x86 по той же причине
Я также положил slimdx.dll в ту же папку, где находится dxcapture.exe (имя приложения)
В чем может быть проблема? WinXP поддерживает захват экрана Directx9?
edit: Я пытался закомментировать различные строки кода, и похоже, что проблема заключается в "создании устройства". Я имею в виду эту строку:
d = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.SoftwareVertexProcessing, present_params);
Машина WinXP имеет встроенную графику ATI, так что я не знаю ... может быть, в этом проблема, а может и нет, но я не могу проверить свою программу на другом компьютере.