检查Handle(HWND)是否为控制台

问题描述 投票:0回答:1

目前我通过EnumWindows检查HWND是否是控制台并检查ClassName。

function EnumWindows(AHandle: HWND; AParam: LPARAM): BOOL; stdcall;
var
  classname: array[0.. 255] of Char;
begin
  GetClassName(AHandle, classname, 255);

  if classname = 'ConsoleWindowClass' then
  begin
    // do something
    Result := False;
  end
  else
    Result := True;
end;

我想知道是否有更好的方法来完成这样的事情?

将样式(或/和ExStyle)检查为“更好”?

delphi
1个回答
0
投票

您可以使用AttachConsoleFreeConsole检测其他进程是否提供控制台。还有一件事需要考虑:有一些没有控制台窗口的流程,其中包括AttachConsole - 这里GetConsoleWindow返回0。在this github repository中有一个很好的解释这种行为。

声明:

function AttachConsole(dwProcessID: Integer): Boolean; stdcall; external 'kernel32.dll';
function FreeConsole(): Boolean; stdcall; external 'kernel32.dll';
function GetConsoleWindow: HWND; stdcall; external kernel32;

枚举进程:

procedure TForm2.FindConsoleWindows(AList: TListBox);
var
  LProcHandle: THandle;
  LResult, LNext: Boolean;
  LProc: TProcessEntry32;
begin
  aList.Items.Clear;

  LProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  LResult := LProcHandle <> INVALID_HANDLE_VALUE;
  if LResult then
    try
      LProc.dwSize := SizeOf(LProc);
      LNext := Process32First(LProcHandle, LProc);
      while LNext do begin
        if AttachConsole(LProc.th32ProcessID) then
          try
            AList.Items.Add(IntToStr(LProc.th32ProcessID) + ' has a console ' + IntToStr(GetConsoleWindow()))
          finally
            FreeConsole();
          end;
        LNext := Process32Next(LProcHandle, LPRoc);
      end;
    finally
      CloseHandle(LProcHandle);
    end;

积分:

© www.soinside.com 2019 - 2024. All rights reserved.