따로 빼서 unit으로 할까 하다가 귀찮아서 그냥 추가하였습니다.
(물론 그냥 추가하면 dcu때문에 빌드가 안됩니다. 그래서 복사해서 필요한 프로젝트에 사용하였습니다)
환경은 Delphi 10 Seattle입니다.
-----------------------------------------
unit Macapi.IOKit
...
const
kIOMasterPortDefault: mach_port_t = 0;
kIOPlatformUUIDKey = 'IOPlatformUUID';
// add
kIOPMAssertionLevelOff = 0;
kIOPMAssertionLevelOn = 255;
kIOPMAssertionTypeNoDisplaySleep = 'NoDisplaySleepAssertion';
...
type
...
function ...
...
function IOObjectRelease(anObject: io_object_t): kern_return_t; cdecl; external libIOKit name _PU + 'IOObjectRelease';
// add // AssertionID는 Uint32의 포인터형
function IOPMAssertionCreateWithName(AssertionType : CFStringRef; AssertLevel : uint32_t;
AssertionName : CFStringRef; AssertionID : Pointer) : uint32_t; cdecl; external libIOKit name _PU + 'IOPMAssertionCreateWithName';
function IOPMAssertionRelease(AssertionID : uint32_t) : uint32_t; cdecl; external libIOKit name _PU + 'IOPMAssertionRelease';
---------------------------
example.
TForm1 = class(TForm)
procedure BtnDisableClick(Sender: TObject);
procedure BtnEnableClick(Sender: TObject);
private
FSleepAssert : UInt32;
public
end;
implementation
uses
Macapi.IOKit, Macapi.CoreFoundation;
............
procedure TForm1.BtnDisableClick(Sender: TObject);
begin
FSleepAssert := 0;
IOPMAssertionCreateWithName(CFSTR(kIOPMAssertionTypeNoDisplaySleep), kIOPMAssertionLevelOn, CFSTR('MyProject is Good'), @FSleepAssert);
if FSleepAssert = 0 then
ShowMessage('Disable Failed!!');
end;
procedure TForm1.BtnEnableClick(Sender: TObject);
begin
if FSleepAssert > 0 then
IOPMAssertionRelease(FSleepAssert);
end;
|