Я хочу представить простой мульти-экран эмулятор, написанный на 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. |
- Назад
- Вперёд >>
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!