Содержание материала

 

 Я хочу представить простой мульти-экран эмулятор, написанный на Delphi.

Он состоит в небольшой форме размещения в правом нижнем углу экрана, прямо над треем, которая состоит из 5 кнопок.

В начале первая кнопка вниз; затем, когда я нажимаю другую кнопку,  открывается новый рабочий стол. В этом новом рабочем столе я могу открыть другие программы

и так далее с другими кнопками. Когда я вернусь к одной из кнопок,  Я буду видеть только программы, открытые в этом контексте, без других.

Фокус состоит в том, чтобы сделать следующие шаги непосредственно перед нажатием другой кнопки:

 

 1)сделать handles все видимые окна (за исключением рабочего стола, Панели задач, а само приложение)

 2) Скрытие всех окон обнаружения на шаге 1).

 

После нажатия кнопки мы должны:

 

 1)Показать все окна, handles которых мы получили, когда мы ушли сама кнопка при нажатии другой.

    Конечно, если кнопка нажата в первый раз, у нас нет ручки, так что мы будем иметь новый свежий рабочий стол.

 

 Я хочу получить handles всех видимых окон: ключ вызова "функция enumwindows" процедуры

передавая в качестве параметра функцию обратного вызова, вызываемую, например, "EnumWindowsProc".

Эта функция обратного вызова должна иметь следующий тип:

 

Code:

 

function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): Bool;

 

// The EnumWindows function is of type:

 

BOOL EnumWindows(

WNDENUMPROC lpEnumFunc, // pointer to callback function

    LPARAM lParam  // application-defined value

   );

 

{

I will call EnumWindows(@EnumWindowsProc, 0);

 

The "EnumWindows" function loop over all windows (visible or invisible):

for each window there is a call to the callback function

"EnumWindowsProc" wich must be implemented.

The first param "hWnd" is the handle of the current window.

A possible implementation of the "EnumWindowsProc" function may be the inserting

of every handle in a list.

According to our target we must insert in a list the handle of

the following windows:

 

 

1)Visible windows //(IsWindowVisible(hwnd) = True)

2)Not my application window

//var processed: DWORD;

//GetWindowThreadProcessID( hwnd, @processID );

//processID <> GetCurrentProcessID

3)Not the taskbar window //hWnd <> FindWindow('Shell_TrayWnd', Nil)

4)Not the desktop window //hWnd <> FindWindow('Progman', Nil)

}

 

// This is the code:

 

unit ProcessView;

 

interface

 

uses

Windows, Dialogs, SysUtils, Classes, ShellAPI, TLHelp32, Forms;

 

var

HandleList: TStringList;

 

function EnumWindowsProc(hWnd: HWND; lParam: lParam): Bool; stdcall;

procedure GetProcessList;

 

implementation

 

procedure GetProcessList;

var

i: integer;

begin

HandleList.Clear;

EnumWindows(@EnumWindowsProc, 0);

end;

 

function EnumWindowsProc(hWnd: HWND; lParam: lParam): Bool;

var

processID: DWORD;

begin

GetWindowThreadProcessID(hwnd, @processID);

if processID <> GetCurrentProcessID then

   if (hWnd <> FindWindow('Shell_TrayWnd', nil)) and

     (hWnd <> FindWindow('Progman', nil)) then

     if IsWindowVisible(hwnd) then

     begin

       HandleList.Add(IntToStr(HWnd));

       Result := True;

     end;

end;

 

initialization

HandleList := TStringList.Create;

 

finalization

HandleList.Free;

end.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить