WIN_POWERBROADCAST 메시지는 WM_POWERBROADCAST 메시지와 관련이 있으며, 

이 메시지는 시스템 전원 상태가 변경될 때 운영 체제에서 애플리케이션으로 브로드캐스트됩니다.

 

const
  WM_POWERBROADCAST = $0218;

 

 

WM_POWERBROADCAST는 Windows API에서 정의된 상수로, 

시스템 전원 이벤트가 발생할 때 애플리케이션의 WndProc 메서드로 전달됩니다.

파라미터
wParam: 이 파라미터는 전원 관리 이벤트의 종류를 나타냅니다. 아래는 주요한 값들입니다:
	- PBT_APMSUSPEND: 시스템이 절전 모드로 들어가려 할 때.
	- PBT_APMRESUMEAUTOMATIC: 시스템이 절전 모드에서 자동으로 복구될 때.
	- PBT_APMRESUMESUSPEND: 시스템이 절전 모드에서 사용자 입력으로 복구될 때.
	- PBT_POWERSETTINGCHANGE: 전원 설정이 변경될 때.
	
lParam: 이 파라미터는 추가적인 정보를 포함하며, 이벤트에 따라 다른 구조체로 해석될 수 있습니다.

 

procedure TForm1.WndProc(var Msg: TMessage);
begin
  if Msg.Msg = WM_POWERBROADCAST then
  begin
    case Msg.WParam of
      PBT_APMSUSPEND:
        ShowMessage('System is going to suspend.');
      PBT_APMRESUMEAUTOMATIC:
        ShowMessage('System resumed automatically.');
      PBT_APMRESUMESUSPEND:
        ShowMessage('System resumed from suspend.');
      PBT_POWERSETTINGCHANGE:
        ShowMessage('Power setting changed.');
    end;
  end;
  inherited WndProc(Msg);
end;

 

procedure WMPowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST;

procedure TForm1.WMPowerBroadcast(var Msg: TMessage);
begin
  case Msg.WParam of
    PBT_APMQUERYSUSPEND:
      begin
        // 절전 모드로 들어가기 전 처리
        ShowMessage('System is about to enter sleep mode.');
        Msg.Result := BROADCAST_QUERY_DENY;  // 이 값을 반환하면 절전 모드를 거부할 수 있음
      end;
    PBT_APMSUSPEND:
      begin
        // 절전 모드로 들어갔을 때 처리
        ShowMessage('System is in sleep mode.');
      end;
    PBT_APMRESUMESUSPEND:
      begin
        // 절전 모드에서 깨어났을 때 처리
        ShowMessage('System resumed from sleep mode.');
      end;
  end;
end;

 

 

- 출처 : 우리의 친구 chatGPT

1. dummy 테이블을 이용해서, 데이터 체크 후 Insert / Update

MERGE INTO Employees AS E
USING (SELECT 1 AS employee_id, 'PARK' AS name, 'Developer' AS position from SYSIBM.SYSDUMMY1) 
--USING (SELECT :PARAM1 AS employee_id, :PARAM2 AS name, :PARAM3 AS position from SYSIBM.SYSDUMMY1) 
   AS S ON E.employee_id = S.employee_id
WHEN MATCHED THEN 
    UPDATE SET E.name = S.name, E.position = S.position
WHEN NOT MATCHED THEN 
    INSERT (employee_id, name, position)
    VALUES (S.employee_id, S.name, S.position);

 

- 델파이 FireDac으로 파라미터로 데이터 설정 시 에러 발생

- 쿼리로는 정상 실행

 

2. Values를 이용해서, 데이터 체크 후 Insert / Update

MERGE INTO Employees AS E
USING (VALUES (1, 'PARK', 'Developer')) AS S(employee_id, name, position)
--USING (VALUES (:PARAM1, :PARAM2, :PARAM3)) AS S(employee_id, name, position)
ON E.employee_id = S.employee_id
WHEN MATCHED THEN 
    UPDATE SET E.name = S.name, E.position = S.position
WHEN NOT MATCHED THEN 
    INSERT (employee_id, name, position)
    VALUES (S.employee_id, S.name, S.position);

 

- 델파이 FireDac으로 파라미터로 데이터 설정 시 에러 발생

- 쿼리로는 정상 실행

 

3. 테이블의 데이터 건수로 Insert / Update

MERGE INTO Employees AS E
USING (SELECT COUNT(*) AS CNT FROM Employees WHERE employee_id = '1') 
--USING (SELECT COUNT(*) AS CNT FROM Employees WHERE employee_id = :PARAM1) 
   AS S
   ON S.CNT > 0
WHEN MATCHED THEN 
    UPDATE SET E.name = 'PARK', E.position = 'Developer'
--    UPDATE SET E.name = :PARAM2, E.position = :PARAM3  
WHEN NOT MATCHED THEN 
    INSERT (employee_id, name, position)
    VALUES (1, 'PARK', 'Developer');
--    VALUES (:PARAM1, :PARAM2, :PARAM3);

 

- 델파이 FireDac으로 파라미터로 호출해도 정상처리~

 

※ 사용환경에 맞게 쓰면 될 듯!

 

- 출처 : 우리의 친구 ChatGPT 등등

use!

 uses
  Windows, TlHelp32;

 

function 정의!

function GetThreadCount(ProcessID: DWORD): Integer;
var
  Snapshot: THandle;
  ThreadEntry: TThreadEntry32;
begin
  Result := 0;
  Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  if Snapshot <> INVALID_HANDLE_VALUE then
  try
    ThreadEntry.dwSize := SizeOf(ThreadEntry);
    if Thread32First(Snapshot, ThreadEntry) then
    repeat
      if ThreadEntry.th32OwnerProcessID = ProcessID then
        Inc(Result);
    until not Thread32Next(Snapshot, ThreadEntry);
  finally
    CloseHandle(Snapshot);
  end;
end;

 

호출 예시!

var
  ProcessID: DWORD;
  ThreadCount: Integer;
begin
  ProcessID := GetCurrentProcessId; // 현재 프로세스 ID를 얻습니다.
  ThreadCount := GetThreadCount(ProcessID);
  // 이제 ThreadCount 변수에 특정 프로세스의 스레드 수가 저장됩니다.
end;

 

 

출처 : 우리의 친구 chatGPT

+ Recent posts