2015-08-08 112 views
0

目前我通过EnumWindows检查HWND是否为控制台并检查ClassName。检查句柄(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

您可以使用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; 

现金