小编tha*_*alm的帖子

获取Delphi(DirectX)中所有显示器的当前/本机屏幕分辨率

我们的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)

delphi directx multiple-monitors screen-resolution

4
推荐指数
1
解决办法
7568
查看次数

如何使用Thread.Sleep与Task.Run而不阻止主踏板

是否可以确保任务在主线程之外的另一个线程上运行?所以这段代码不会打扰调用线程?

var task = Task.Run(() =>
{
    //third party code i don't have access to
    Thread.Sleep(3000);
});
Run Code Online (Sandbox Code Playgroud)

我知道有,Task.Delay但我想确保该任务将在另一个线程上运行.

.net c# multithreading asynchronous

4
推荐指数
2
解决办法
3190
查看次数

您能想到.NET中具有同步上下文的事件模式吗?

主要问题是,从一个线程引发事件可以调用仅在某个线程上下文中调用的委托.在对这个问题进行一些研究后,我想,也许它可以传递某种同步上下文以及每个订阅事件:

SomeClass.SmartSyncEvent += (myDelegate, someReferenceToAThread);
Run Code Online (Sandbox Code Playgroud)

然后提出事件,它以某种方式:

foreach(subscriber)
{
    someReferenceToAThread.Invoke(myDelegate);
}
Run Code Online (Sandbox Code Playgroud)

这是超伪代码,但也许有人已经做过这样的事情,或者知道任何可以设置这种模式的.NET类.谢谢!

.net c# events multithreading

2
推荐指数
1
解决办法
1263
查看次数

奇数一:如果数组大小大于4136,@ myRecordArray [0]返回无效指针

这真的很奇怪,我在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)

c# arrays delphi com pointers

1
推荐指数
1
解决办法
211
查看次数