/*
*	SimpleFP - простой plug-in к Far-у. (С) 2000 Phoenix, Moscow
*/

#include <stdio.h>	// для вызова sprintf
#include <windows.h>	// для функций Windows
#include "plugin.hpp"	// для функций Far

#define PLUGIN_NAME "Open windows" // Название plug-in-а #define WINDOW_HEAD "Open windows list" // Заголовок меню, которое мы сделаем

// // Описываем функции Far, которые с которыми мы работаем. //

extern "C" { void WINAPI _export SetStartupInfo(struct PluginStartupInfo *Info); HANDLE WINAPI _export OpenPlugin(int OpenFrom,int Item); void WINAPI _export GetPluginInfo(struct PluginInfo *Info); }; static struct PluginStartupInfo Info; // Информация о нашем plug-in-е

// // Информация о модуле определена нами в структуре Info //

void WINAPI _export SetStartupInfo(struct PluginStartupInfo *Info) { ::Info=*Info; } // Эта функция вызывается для получения информации о plug-in. // Мы должны заполнить поля структуры Info. //

void WINAPI _export GetPluginInfo(struct PluginInfo *Info) { Info->StructSize=sizeof(*Info); // Размер структуры Info Info->Flags=0; // Это нам не нужно Info->DiskMenuStringsNumber=0; // Это нам тоже не нужно // Определяем строку с названием модуля static char *PluginMenuStrings[1]; PluginMenuStrings[0]= PLUGIN_NAME; // Определяем название plug-in модуля Info->PluginMenuStrings=PluginMenuStrings; Info->PluginMenuStringsNumber=sizeof(PluginMenuStrings)/sizeof(PluginMenuStrings[0]); Info->PluginConfigStringsNumber=0; // Это нам не нужно }

// Эта функция вызывается при запуске plug-in модуля. // HANDLE WINAPI _export OpenPlugin(int OpenFrom,int Item) { HWND hwnd; // Используем для получения handle char p[128], o[128]; // Для создания строк меню int i=0; // Счетчик

struct FarMenuItem MenuItems[64]; // Описание меню, которое создаст для нас Far memset(MenuItems,0,sizeof(MenuItems)); // Инициализируем наше меню MenuItems[0].Selected=TRUE;

hwnd = GetDesktopWindow(); // Получаем handle для desktop hwnd = GetWindow(hwnd, GW_CHILD); // Получаем его handle while (hwnd !=0) // Пока оно не последнее { hwnd = GetWindow(hwnd, GW_HWNDNEXT); // получим handle окна GetWindowText(hwnd,p,128); // и его заголовок if (strlen(p)>0) // если заголовок есть { sprintf(o,"%0.8xld %s", hwnd, p); // сделаем строчку strcpy(MenuItems[i++].Text, o); // скопируем эту строчку в массив MenuItems } }

// вызываем созданное нами меню, получаем номер выбранного пункта - MenuCode // int MenuCode=Info.Menu(Info.ModuleNumber, -1,-1,0, FMENU_AUTOHIGHLIGHT|FMENU_WRAPMODE, WINDOW_HEAD, NULL, "Menu content", NULL, NULL, MenuItems, i);

return(INVALID_HANDLE_VALUE); }