본문 바로가기
Delphi Tip/하드웨어

델파이 마우스 아래의 윈도우 핸들 구하기

by MonoSoft 2021. 8. 15.
728x90
반응형

델파이 마우스 아래의 윈도우 핸들 구하기

 

// 아래처럼 타이머를 사용하지 않고 마우스 후킹을 사용하면 좀더 간결한 프로그램을 만들 수 있습니다

// SetWindowsHookEx(WH_MOUSE,...) 를 찾아보세요

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls;

 

type

  TForm1 = class(TForm)

    Timer1: TTimer;

    Memo1: TMemo;

    procedure Button1Click(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

const

  PROCESS_MURDER = $0001;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

function ForceForegroundWindow(hwnd: THandle): boolean;

const

  SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;

  SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;

var

  ForegroundThreadID: DWORD;

  ThisThreadID: DWORD;

  timeout: DWORD;

begin

  if IsIconic(hwnd) then

    ShowWindow(hwnd, SW_RESTORE);

  if GetForegroundWindow = hwnd then

    Result := true

  else

  begin

    {Windows 98/2000 doesn't want to foreground a window when some

    other window has keyboard focus}

    if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4))

       or ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and ((Win32MajorVersion > 4)

       or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)))) then

    begin

      {Code from Karl E. Peterson, www.mvps.org/vb/sample.htm

      Converted to Delphi by Ray Lischner

      Published in The Delphi Magazine 55, page 16}

      Result := false;

      ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow,nil);

      ThisThreadID := GetWindowThreadProcessId(hwnd,nil);

      if AttachThreadInput(ThisThreadID, ForegroundThreadID, true) then

      begin

        BringWindowToTop(hwnd);  {IE 5.5 related hack}

        SetForegroundWindow(hwnd);

        AttachThreadInput(ThisThreadID, ForegroundThreadID, false);

        Result := (GetForegroundWindow = hwnd);

      end;

      if not Result then

      begin

        {Code by Daniel P. Stasinski}

        SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);

        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),

                                                     SPIF_SENDCHANGE);

        BringWindowToTop(hwnd);  {IE 5.5 related hack}

        SetForegroundWindow(hWnd);

        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout),

                                                     SPIF_SENDCHANGE);

      end;

    end

    else

    begin

      BringWindowToTop(hwnd);  {IE 5.5 related hack}

      SetForegroundWindow(hwnd);

    end;

    Result := (GetForegroundWindow = hwnd);

  end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  ForceForegroundWindow(Self.Handle);

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

var

  APoint: TPoint;

  AHwnd: HWND;

  c, P: array[0..256] of Char; 

begin

  GetCursorPos(APoint);

  AHwnd := WindowFromPoint(APoint);

 

  P[0] := #0;

  GetWindowText(AHwnd, P, 255); {window's title bar를 알아낸다}

  if (P[0] <> #0) then

  begin

    Memo1.Lines.Add(P);

    if GetClassName(AHwnd, c, SizeOf(c)) > 0 Then

      Memo1.Lines.Add(c);

  end;

end;

end.

 

728x90
반응형

댓글