我们的delphi应用程序可以有多个DirectX窗口,通常在多个屏幕上.到目前为止,用户必须使用支持的分辨率的下拉列表指定全屏分辨率.如果他可以使用像'current'这样的设置,这将是窗口的屏幕分辨率,那将是非常好的.
我们正在使用带有clootie directX标头的delphi.有人可以给我一个提示,我将如何使用directX,winAPI或delphi方法编写一个方法来获得窗口所在的当前屏幕的分辨率?
亲切的问候,thalm
最终解决方案
好吧,delphi 2007 MultiMon.pas为GetMonitorInfo返回垃圾,所以我找到了这个方法,对我来说,直接使用winAPI:
function GetRectOfMonitorContainingRect(const R: TRect): TRect;
{ Returns bounding rectangle of monitor containing or nearest to R }
type
HMONITOR = type THandle;
TMonitorInfo = record
cbSize: DWORD;
rcMonitor: TRect;
rcWork: TRect;
dwFlags: DWORD;
end;
const
MONITOR_DEFAULTTONEAREST = $00000002;
var
Module: HMODULE;
MonitorFromRect: function(const lprc: TRect; dwFlags: DWORD): HMONITOR; stdcall;
GetMonitorInfo: function(hMonitor: HMONITOR; var lpmi: TMonitorInfo): BOOL; stdcall;
M: HMONITOR;
Info: TMonitorInfo;
begin
Module := GetModuleHandle(user32);
MonitorFromRect := GetProcAddress(Module, 'MonitorFromRect');
GetMonitorInfo …Run Code Online (Sandbox Code Playgroud) 是否可以确保任务在主线程之外的另一个线程上运行?所以这段代码不会打扰调用线程?
var task = Task.Run(() =>
{
//third party code i don't have access to
Thread.Sleep(3000);
});
Run Code Online (Sandbox Code Playgroud)
我知道有,Task.Delay但我想确保该任务将在另一个线程上运行.
主要问题是,从一个线程引发事件可以调用仅在某个线程上下文中调用的委托.在对这个问题进行一些研究后,我想,也许它可以传递某种同步上下文以及每个订阅事件:
SomeClass.SmartSyncEvent += (myDelegate, someReferenceToAThread);
Run Code Online (Sandbox Code Playgroud)
然后提出事件,它以某种方式:
foreach(subscriber)
{
someReferenceToAThread.Invoke(myDelegate);
}
Run Code Online (Sandbox Code Playgroud)
这是超伪代码,但也许有人已经做过这样的事情,或者知道任何可以设置这种模式的.NET类.谢谢!
这真的很奇怪,我在delphi中有一个数组并用directX矩阵填充它.然后我得到指向第一个元素的指针,并通过com将其传递给c#托管代码:
function TMPlugTransformInPin.GetMatrixPointer(out SliceCount: Integer; out
ValueP: Int64): HResult;
var
matrices: array of TD3DMatrix;
i: Integer;
begin
SliceCount := UserSliceCount;
//make a temp array of all matrices
SetLength(matrices, SliceCount);
for i := 0 to SliceCount - 1 do
matrices[i] := FTransformManager.ModelMatrix[i];
//return a pointer to the first matrices cell [0,0]
if SliceCount = 0 then
ValueP := 0
else
ValueP := Int64(@matrices[0]);
Result := S_OK;
end;
Run Code Online (Sandbox Code Playgroud)
在托管方面,代码如下所示:
if (IsChanged)
{
int sliceCount;
long source;
FTransformIn.GetMatrixPointer(out sliceCount, out source);
SliceCount = …Run Code Online (Sandbox Code Playgroud)