编辑 - 请参阅最后更新
这适用于Delphi 7.0 Build 4.453
摘要
我需要能够从TMonitor对象(TScreen组件中的Monitors数组中的一个元素)获取Handle属性,该对象是一个HMONITOR,并将其转换为您在调用EnumDisplaySettings时用作lpszDeviceName参数的字符串.
(我的最终目标是通过将已解析的lpszDeviceName传递给EnumDisplaySettings的调用,从给定的HMONITOR值获取设备设置列表).
详细资料
如上所述,Screen.Monitors [x] .Handle属性的类型为HMONITOR,通常用于传入GetMonitorInfo函数,该函数返回几何信息,但不返回lpszDeviceName.(注意:有一个TMonitorInfoEx结构有一个szDevice字段,但它似乎没有填入我的系统,即使我将cbSize字段设置为适当的大小).
或者,如果我可以使用szDeviceName来获取等效的HMONITOR值,我可以将它插入到以下函数中,该函数将在比较中使用它(我在下面的代码中插入了对名为hMonitorFromDeviceName的虚构函数的调用)以指示如何它会被使用.
function GetMonitorDeviceName(hmon : HMONITOR) : string;
var
DispDev : TDisplayDevice;
deviceName : string;
nDeviceIndex : integer;
begin
Result := '';
FillChar(DispDev, sizeof(DispDev),0);
DispDev.cb := sizeof(DispDev);
nDeviceIndex := 0;
while (EnumDisplayDevices(nil, nDeviceIndex, DispDev, 0)) do
begin
if ( hMonitorFromDeviceName(DispDev.DeviceString) = hmon ) then
begin
Result := StrPas(DispDev.DeviceString);
exit;
end;
inc(nDeviceIndex);
end;
end;
Run Code Online (Sandbox Code Playgroud)
更新
感谢David Heffernan,我测试了他的解决方案,这是一个示例函数,用于从给定句柄获取监视器名称:
function GetMonitorName(hmon …Run Code Online (Sandbox Code Playgroud) 我正在使用AVAssetReader读取ipod库资产音频数据并渲染波形图像.这是使用我在回答这个问题时所描述的代码进行的
这有时会发生在AVAudioPlayer实例播放音频的时候.
无论播放的音频是否与正在阅读的资产相同,我点击的那一刻
[reader startReading];
Run Code Online (Sandbox Code Playgroud)
播放的音频"淡出".(好像AVAudioPlayer已被告知停止播放).这很奇怪,因为我实际上并没有播放音频,只是阅读它.
我在SO上搜索并找到了这个可能的解决方案但是我发现这似乎没有解决问题.
注意 - 我能够播放几个AVAudioPlayer实例,并且启动这些实例似乎并没有相互干扰 - 但是
[reader startReading];
Run Code Online (Sandbox Code Playgroud)
甚至会杀死AVAudioPlayer的多个同时实例,导致它们全部同步淡出.
有任何想法吗?
请注意:这适用于在Mac OSX上运行的Cocoa命令行应用程序,而不是iOS应用程序
我在尝试理解Apple为CISpotColor过滤器提供的有限文档时遇到了一些麻烦(使用CIFilter).
1)是否有更多关于CIFilter遗漏的文档,特别是CISpotColor?
2)考虑到我想要实现的目标(如下图所示,但简要说明:用白色替换所有不"看起来红"的东西,并将"看起来很红(ish)"的所有东西强制为纯红色或简单的黑色) ,CISpotColor是我应该使用的正确过滤器吗?
3)如果没有,你建议使用什么过滤器(或者我应该尝试编写自定义过滤器?)
4)如果CISSpotColor是正确的过滤器,我应该使用什么参数来实现我想要实现的目标.如果我需要使用CISpotColor CIFilter的几个通道,那很好,我不指望你为我编码,只是指出我正确的方向.
上面的链接给出了一个参数列表,一些默认值,以及图片之前和之后的示例,但没有在图像之后生成样本的示例代码,也没有解释参数实际意味着什么,或者它们的有效范围是什么.
说实话,我不完全确定CISpotColor是否是我所追求的过滤器,除了它的名称,以及句子" 用专色替换一个或多个颜色范围 ",没有解释它是如何做的. .
因为它似乎描述了我所追求的过滤器,所以我选择它作为一个起点,让我以这种方式处理过滤器.
输入图片(视频中的帧)

期望的输出(选项1 - 纯红色 - 使用GIMP创建)

期望的输出(选项2 - 纯黑色 - 也使用GIMP创建)

我的代码得到了什么(见下面的列表)

这接近我所需要的,但它似乎没有考虑到原始图像中灰色或"白色"的区域具有相似数量的红色,绿色和蓝色,而不是主要是红色的事实.这将使它"看起来红".如果它过滤掉你在右下角看到的区域,我可以使用它,这显然只是包括在内,因为那里有一些红色像素(以及一些绿色和蓝色,使其在原始时通常为灰色) .
这是cocoa命令行应用程序(Mac OSX)的完整"main.m"
#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <AppKit/AppKit.h>
#import <QuartzCore/QuartzCore.h>
@interface NSImage(saveAsJpegWithName)
- (void) saveAsPNGWithName:(NSString*) fileName;
- (NSImage*) filterEverythingButRed ;
@end
@implementation NSImage(saveAsJpegWithName)
- (void) saveAsPNGWithName:(NSString*) fileName
{
NSData *imageData = [self TIFFRepresentation];
NSBitmapImageRep *imageRep = [NSBitmapImageRep …Run Code Online (Sandbox Code Playgroud) 我对OS X开发相对较新(使用XCode)
我最近测试了一个我一直在朋友MacBook上工作的应用程序,并遇到了一个问题.
我在运行Snow Leopard 10.6.5的MacBook上构建了应用程序,而我朋友的Mac运行的是早期版本(我认为Leopard 10.5.x).该应用程序没有启动,只是显示一条消息,说操作系统对于应用程序而言太旧了.
应用程序本身非常基础,不需要任何第三方库或API.
确保可以使用相同安装程序的最佳方法是什么?我不需要能够处理比10.4更早的任何东西.
我需要能够得到以下内容:
#define MY_MACRO(PARAM1,PARAM2) \
MY_OTHER_MACRO(TYPENAME_OF(PARAM1),PARAMNAME_OF(PARAM1));\
MY_OTHER_MACRO(TYPENAME_OF(PARAM2),PARAMNAME_OF(PARAM2));\
Run Code Online (Sandbox Code Playgroud)
引起
MY_MACRO(int x,char *z)
Run Code Online (Sandbox Code Playgroud)
编译为
MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char*,z);
Run Code Online (Sandbox Code Playgroud)
如果它编译为:它不会是世界末日:
MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char,*z);
Run Code Online (Sandbox Code Playgroud)
或者甚至这也可以:(我可以编码MY_OTHER_MACRO来处理任何一个结果)
MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char,z);
Run Code Online (Sandbox Code Playgroud)
或者,如果有一些方法来计算由空格分隔的标记(并假设"*"是单独的标记,我也可以使用它 - 例如2对3)通常,标记用逗号分隔,至我知道.有没有办法使用另一个角色?
在关于窑堆栈交换网站的这个问题的答案中,有一条评论提到"如果你从图书馆的一个消费者那里提交,其他图书馆消费者不会立即看到这些变更集.你必须明确地在其他消费者的图书馆回购."
我已经将一些文件添加到项目.hgsub和.hgsubstate文件中引用的存储库中,但是它们没有显示在项目子库中(因为项目非常正确地使用之前更改的先前更改集) )
我想知道如何编辑subrepo使用的变更集.我只是编辑.hgsubstate文件(看起来有点"hackish")或者是否有我可以使用的命令/窑网站选项?
更新 - 解决和回答,违规行已被注释掉
简要描述;简介
即使我使用(GENERIC_WRITE或GENERIC_WRITE)用于CreateFile,使用PAGE_READWRITE进行CreateFileMapping,我也遇到了将CreateFile与CreateFileMapping链接的问题
详细说明
我正在使用CreateFileMapping在进程之间共享内存.假设我没有映射到物理文件而是使用INVALID_HANDLE_VALUE作为CreateFileMapping的第一个参数,那么它的实际机制工作正常.这很好,但我想要实现的是主进程创建此映射以使用基于磁盘的文件,并定期将其刷新到驱动器,当它关闭时,数据会自动保存.
代码如下... (当我运行它时,我得到"错误5:访问被拒绝"作为ShowMessage)
const MaximumMapSize = 256 * 1024;
var virtualMemoryPath : string = '';
function getFileHandle(mapname : string; maxSize : dword) :THandle;
var diskfilename : string;
lpFileName: PChar;
dwDesiredAccess: DWORD;
dwShareMode: DWORD;
lpSecurityAttributes: PSecurityAttributes;
dwCreationDisposition : dword;
dwFlagsAndAttributes: DWORD;
hTemplateFile : THandle ;
temp : pointer;
begin
Result := INVALID_HANDLE_VALUE;
if (maxSize <= MaximumMapSize) and (Length(virtualMemoryPath) > 0) then
begin
diskfilename := virtualMemoryPath+mapname+'.bin';
if FileExists(diskfilename) then
Sysutils.DeleteFile(diskfilename);
lpFileName := PChar(diskfilename);
//dwDesiredAccess := GENERIC_WRITE …Run Code Online (Sandbox Code Playgroud)