我有两个项目的解决方案。第一个是类库,第二个是Windows窗体应用程序。
我在类库项目的类中添加了一个变量,我不会在这里显示所有代码,因为它很长。
namespace Capture.Hook
{
public class DXHookD3D9: BaseDXHook
{
public DXHookD3D9(CaptureInterface ssInterface)
: base(ssInterface)
{
}
LocalHook Direct3DDevice_EndSceneHook = null;
LocalHook Direct3DDevice_ResetHook = null;
LocalHook Direct3DDevice_PresentHook = null;
LocalHook Direct3DDeviceEx_PresentExHook = null;
object _lockRenderTarget = new object();
Surface _renderTarget;
public static int framespersecondtodisplay = 0;
protected override string HookName
{
get
{
return "DXHookD3D9";
}
}
我添加的变量是:framespersecondtodisplay
。
我在此代码中使用此DXHooKD3D9类中的变量:
if (this.FPS.GetFPS() >= 1)
{
font.DrawText(null, String.Format("{0:N0} fps", this.FPS.GetFPS()), 5, 5, SharpDX.Color.Red);
}
if (this.TextDisplay != null && this.TextDisplay.Display)
{
font.DrawText(null, this.TextDisplay.Text, 5, 25, new SharpDX.ColorBGRA(255, 0, 0, (byte)Math.Round((Math.Abs(1.0f - TextDisplay.Remaining) * 255f))));
framespersecondtodisplay = (byte)Math.Round((Math.Abs(1.0f - TextDisplay.Remaining) * 255f));
}
然后在Windows窗体应用程序项目的form1
中,我使用如下变量:
txtDebugLog.Invoke(new MethodInvoker(delegate()
{
fps.Frame();
ggg = fps.GetFPS();
string s = ggg.ToString("R");
txtDebugLog.Text = String.Format("{0:00.0}\r\n{1}", ggg.ToString("N14"), txtDebugLog.Text);
txtDebugLog.Text = String.Format("{0}\r\n{1}", DXHookD3D9.framespersecondtodisplay.ToString(), txtDebugLog.Text);
})
);
txtDebugLog
是TextBox
然后我正在做的是运行Windows窗体应用程序项目,然后在visual studio菜单中选择' Debug' > '附加到流程'并添加两个断点:一行在此行的库类项目的DXHooKD3D9类中:
framespersecondtodisplay = (byte)Math.Round((Math.Abs(1.0f - TextDisplay.Remaining) * 255f));
它将首先停在此行上,然后我跨过该行,我在framespersecontodisplay
中看到值为24。
我继续执行,然后在此行的form1断点处停止:
txtDebugLog.Text = String.Format("{0}\r\n{1}", DXHookD3D9.framespersecondtodisplay.ToString(), txtDebugLog.Text);
但是framespersecondtodisplay
的值始终为0.
如果在DXHooKD3D9类的第一个断点处,那里的值总是24,48,244或100 - 那么为什么在form1中它是awlays 0?
由于它没有工作,我试图将类库项目代码更改为:
public static byte framespersecondtodisplay = 0;
但我得到了同样的结果。所以我也尝试将其从static
更改为public
:
public byte framespersecondtodisplay = 0;
然后在form1
中为DXHookD3D9
创建实例:
CaptureInterface ci;
DXHookD3D9 dxd9;
在构造函数中:
ci = new CaptureInterface();
dxd9 = new DXHookD3D9(ci);
然后:
txtDebugLog.Text = String.Format("{0}\r\n{1}", dxd9.framespersecondtodisplay, txtDebugLog.Text);
但framespersecondtodisplay
仍然显示为0。
答案 0 :(得分:-1)
您有两个不同的DXHooKD3D9类实例。调用表单构造函数时,必须将DXHooKD3D9类实例传递给表单,并将其另存为内部变量。或者您可以在任何方法调用中传递实例。您可能正在使用表单中的“new”创建该类的第二个实例。