2015-08-08 3 views
0

В настоящее время я проверяю, является ли HWND консолью EnumWindows и проверяет ClassName.Проверьте, является ли Handle (HWND) консолью

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) «лучше»?

+0

Вы пытаетесь найти окно консоли, связанное с текущим процессом, или другое? –

+0

@ 500-InternalServerError просто в общем. Для собственного текущего процесса можно использовать: function GetConsoleWindow: HWND; STDCALL; внешний 'kernel32.dll'; – MRSNAPS

+0

Вам нужно определить, что вы подразумеваете под * console *, прежде чем мы сможем рассказать вам, как его идентифицировать. –

ответ

0

Вы можете использовать AttachConsole и FreeConsole обнаружить, если другие процессы предоставляют консоль. Еще одна вещь, на которую нужно обратить внимание: есть процессы без окон консоли, которые allo 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; 

Кредиты:

Смежные вопросы