Пирчем тут хайасм ?
А притом, что я в нем по быстрому накидал утилитку "захватчик-ретранслятор графики" причем даже с псевдо "веб-сервером" ... (Само собой это я просто модифицировал один из примеров с использованием информации с форума )
Проблем довольно много (например я пока не понял как узнать есть ли у процесса отрисовка окна или нет заранее и не сделал прямую трансляцию по http запросу минуя файл, что должно резко ускорить чистоту кадров в приемнике и т.д. )
Но скотинка довольно забавная уже сейчас ...
*Управление окнами Windows
*(Расширенная версия: добавлены функции захвата графики )
Make(delphi)
ver(4.05 build 186)
Add(MainForm,18141,81,105)
{
Left=310
Top=283
Width=683
Height=284
Caption=""
Point(Close)
link(onCreate,18378:doEvent2,[(125,125)(125,97)(97,97)(97,69)])
link(Close,2526734:GetData,[(87,72)(68,72)])
}
Add(ChildPanel,18876,11,56)
{
link(onEvent1,18378:doEvent1,[])
link(onEvent2,87406:doEvent,[(69,81)(69,167)])
link(onEvent3,7361912:doSwitch,[(61,84)(61,345)])
}
BEGIN_SDK
Add(EditMulti,73583,3,3)
{
EventCount=3
WorkCount=1
VarCount=3
Width=393
Height=277
link(doWork1,16249923:doText,[(16,33)(16,188)])
link(Var1,16249923:Text,[(9,247)(32,247)])
link(Var2,1511723:Checked,[(16,267)(71,267)])
link(Var3,5759222:Checked,[(23,268)(153,268)])
}
Add(Panel,68008,28,127)
{
Width=667
Height=30
Align=2
Font=[Arial,8,0,0,1]
Point(doColor)
}
Add(ChanelToIndex,32148,147,49)
{
Count=5
link(onIndex,73583:onEvent2,[(182,55)(182,16)])
}
Add(Button,41799,70,56)
{
Left=110
Top=5
Width=75
Font=[Arial,8,0,0,1]
Caption="Hide"
link(onClick,32148:doWork2,[])
}
Add(Button,60593,24,16)
{
Left=5
Top=5
Width=20
Font=[Arial,8,0,0,1]
Caption="->"
link(onClick,73583:onEvent1,[(83,15)(83,9)])
}
Add(Button,13483,70,91)
{
Left=190
Top=5
Width=75
Font=[Arial,8,0,0,1]
Caption="Show"
link(onClick,32148:doWork3,[(121,97)(121,69)])
}
Add(Button,69494,70,21)
{
Left=30
Top=5
Width=75
Font=[Arial,8,0,0,1]
Caption="Close"
link(onClick,32148:doWork1,[(121,27)(121,55)])
}
Add(Button,9237645,70,133)
{
Left=265
Top=5
Caption="Capture"
link(onClick,32148:doWork4,[(131,139)(131,76)])
}
Add(Button,9149992,91,224)
{
Left=325
Top=5
Caption="Found"
link(onClick,32148:doWork5,[(139,230)(139,83)])
}
Add(Edit,16249923,26,182)
{
Left=390
Top=5
Width=110
Text="WMR Str"
}
Add(CheckBox,1511723,70,182)
{
Left=505
Top=5
Caption="Auto"
link(onCheck,73583:onEvent3,[(189,188)(189,23)])
}
Add(CheckBox,5759222,147,238)
{
Left=560
Top=5
Width=35
Caption="FS"
}
Add(FormatStr,12898161,770,70)
{
DataCount=1
Mask="HTTP/1.1 200 OK\r\nContent-Type: image/jpeg\r\nContent-Length: %1\r\nConnection: close\r\n\r\n"
Point(FString)
link(onFString,3322281:doWork,[])
link(Str1,9512716:Size,[(776,61)(672,61)(672,156)(636,156)])
}
Add(StreamConvertor,3708782,770,140)
{
Mode=6
link(onResult,7108863:doWork,[])
}
Add(FileStream,9512716,623,105)
{
FileName="1.jpg"
link(onLoad,1388064:doEvent1,[])
}
Add(TCP_Server,9120016,539,105)
{
Port=178
Point(doCloseAll)
link(onRead,9459175:doEvent1,[])
}
Add(Hub,1388064,693,105)
{
OutCount=3
link(onEvent1,12898161:doString,[(736,111)(736,76)])
link(onEvent2,3708782:doConvert,[(740,118)(740,146)])
link(onEvent3,9120016:doCloseAll,[(718,125)(718,167)(529,167)(529,132)])
}
Add(LineBreakEx,3322281,826,70)
{
Caption="send"
}
Add(LineBreakEx,14280256,476,119)
{
Caption="send"
Type=1
link(OnEvent,9120016:doSend,[])
}
Add(LineBreakEx,7108863,826,140)
{
Caption="send"
}
Add(Hub,9459175,581,105)
{
link(onEvent1,9512716:doOpen,[])
link(onEvent2,9512716:doClose,[])
}
Add(CheckBox,11302169,210,238)
{
Left=608
Top=5
Caption="HTTP"
link(onCheck,15474801:doSwitch,[(317,244)(317,104)])
}
Add(Switch,15474801,329,98)
{
Point(onOn)
Point(onOff)
link(onOn,9120016:doOpen,[])
link(onOff,9120016:doClose,[])
}
END_SDK
Add(IndexToChanel,87406,266,161)
{
Count=5
Point(Index)
link(onEvent1,5901:doClose,[(352,167)(352,205)(403,205)(403,195)])
link(onEvent2,50041:doWork1,[])
link(onEvent3,50041:doWork2,[])
link(onEvent4,12678596:doData,[(344,207)(344,230)])
link(onEvent5,11925794:doEnum,[(330,223)(330,275)(268,275)(268,356)])
}
Add(MultiElementEx,494139,224,70)
{
link(onEventData,52907:doAdd,[(334,76)(334,13)])
link(onFString,14833197:doAdd,[(292,83)(292,111)])
}
BEGIN_SDK
Add(EditMultiEx,7556502,21,21)
{
WorkCount=#6:doEnum|
EventCount=#11:onEventData|9:onFString|
link(doEnum,7059:doEnum,[(35,27)(35,55)])
}
Add(FormatStr,8535,175,49)
{
Mask="%1 - %2"
link(onFString,7556502:onFString,[(264,55)(264,34)])
link(Str2,7059:ClassName,[(188,39)(160,39)(160,90)(62,90)])
}
Add(WinEnum,7059,49,49)
{
VisibleOnly=1
Point(ClassName)
link(onFindWindow,2077:doEvent1,[])
}
Add(Hub,2077,91,49)
{
link(onEvent1,8535:doString,[])
link(onEvent2,5568525:doData,[])
}
Add(DoData,5568525,119,56)
{
link(onEventData,7556502:onEventData,[(241,62)(241,27)])
link(Data,7059:Handle,[(125,44)(95,44)(95,93)(55,93)])
}
END_SDK
Add(LineBreak,2308260,101,413)
{
Caption="+Sheld"
link(Out,14094907:doWork3,[(155,419)])
Primary=[8699763,3,-406]
}
Add(StrList,52907,413,7)
{
}
Add(Hub,18378,109,56)
{
InCount=2
OutCount=3
link(onEvent1,52907:doClear,[(251,62)(251,20)])
link(onEvent2,14833197:doClear,[(186,69)(186,118)])
link(onEvent3,494139:doEnum,[])
}
Add(WinTools,5901,413,168)
{
link(Handle,6804028:Var2,[])
}
Add(ChanelToIndex,50041,364,168)
{
Count=4
link(onIndex,5901:doVisible,[])
}
Add(ChildPanelEx,14833197,329,105)
{
link(onClick,5977427:doEvent1,[(369,111)(369,97)])
}
BEGIN_SDK
Add(EditMultiEx,8602565,21,21)
{
WorkCount=#5:doAdd|7:doClear|
EventCount=#7:onClick|
VarCount=#6:String|5:Array|
link(doAdd,74780:doAdd,[(35,27)(35,55)])
link(doClear,74780:doClear,[(35,34)(35,62)])
link(String,74780:String,[(27,165)(76,165)])
link(Array,74780:Array,[(44,192)(69,192)])
}
Add(Panel,656075,168,126)
{
Top=30
Width=240
Height=215
Align=1
}
Add(ListBox,74780,49,49)
{
Top=30
Width=274
Height=217
Align=5
Font=[Arial,8,0,0,1]
Point(String)
link(onClick,8602565:onClick,[(201,62)(201,27)])
}
END_SDK
Add(ArrayRW,26538,413,98)
{
link(Array,15923548:Var2,[])
}
Add(HubEx,14094907,151,371)
{
link(onEvent,9989187:doStop,[])
}
Add(Image,13631593,595,105)
{
Left=240
Top=30
Width=427
Height=215
Align=5
link(onClick,3211863:doWork2,[(636,111)(636,167)])
}
Add(ScreenShort,47616,487,210)
{
link(onCapture,8492355:doWork3,[(527,216)])
}
Add(GetDataEx,6804028,413,140)
{
link(Data,26538:Item,[])
}
Add(Position,273378,427,350)
{
link(onSearch,14700487:doCompare,[])
link(Str,12753063:Item,[(433,338)(401,338)(401,394)(356,394)])
link(Target,9314218:Var,[(440,337)(461,337)])
}
Add(LineBreak,8843240,11,168)
{
Caption="FS+"
Type=1
link(Data,18876:Var1,[])
Primary=[9314218,444,147]
}
Add(If_else,14700487,469,350)
{
Op2=Integer(1)
link(onTrue,16531488:doData,[(520,356)(520,426)])
}
Add(ArrayEnum,11925794,280,350)
{
link(onItem,12753063:doRead,[])
link(Array,9912768:Var,[])
}
Add(GetDataEx,15923548,413,70)
{
link(Data,52907:Array,[(419,61)(433,61)])
}
Add(LineBreak,3196951,483,63)
{
Caption="AH"
Type=1
link(Data,15923548:Var3,[(489,51)(455,51)(455,75)])
Primary=[9912768,-203,259]
}
Add(ScreenShort,1702941,637,273)
{
link(onCapture,8492355:doWork1,[(685,279)(685,237)(563,195)])
link(Handle,5616459:Value,[(643,261)(608,261)(608,394)(580,394)])
}
Add(HubEx,8492355,523,189)
{
Angle=3
link(onEvent,13631593:doLoad,[(527,111)])
}
Add(ArrayRW,12753063,350,350)
{
link(onRead,273378:doSearch,[])
link(Array,9292654:Var,[])
link(Index,11925794:Index,[(363,338)(328,338)(328,394)(293,394)])
}
Add(LineBreak,14330807,336,147)
{
Caption="AS"
Type=1
link(Data,14833197:Array,[])
Primary=[9292654,14,154]
}
Add(Timer,9989187,168,364)
{
Interval=50
Enable=1
link(onTimer,11872925:doEvent1,[])
}
Add(Switch,7361912,98,357)
{
Point(onOn)
Point(onOff)
link(onOn,9989187:doTimer,[])
link(onOff,14094907:doWork2,[])
}
Add(Hub,11872925,217,364)
{
link(onEvent1,12808415:In,[(243,370)(243,342)(198,342)(198,244)])
link(onEvent2,1563683:doWork,[(243,377)(243,437)(198,437)(198,496)])
}
Add(LineBreak,9192279,588,175)
{
Caption="CF"
link(Out,3211863:doWork3,[(659,181)])
Primary=[15237827,-238,280]
}
Add(Memory,5616459,574,350)
{
Point(Data)
link(onData,12814096:doWork3,[(620,356)])
}
Add(LineBreak,6096140,546,273)
{
Caption="A"
link(Out,12814096:doWork2,[])
Primary=[12808415,-329,-35]
}
Add(HubEx,12814096,616,273)
{
link(onEvent,1702941:doCapture,[])
}
Add(Check,1563683,210,490)
{
link(onEvent,6960274:doCompare,[(277,496)(277,461)])
}
Add(DoData,12678596,392,224)
{
link(onEventData,3437152:doEvent1,[(429,230)(429,230)])
link(Data,6804028:Var3,[(398,211)(461,211)(461,145)])
}
Add(Hub,3437152,436,224)
{
link(onEvent1,47616:doCapture,[(468,230)(468,216)])
link(onEvent2,290405:doWork2,[(536,289)(536,377)])
}
Add(DoData,16531488,525,420)
{
link(onEventData,290405:doWork3,[(566,426)])
link(Data,11925794:Item,[(531,401)(286,401)])
}
Add(HubEx,290405,562,371)
{
Angle=3
link(onEvent,5616459:doValue,[(566,356)])
}
Add(Hub,5977427,378,91)
{
link(onEvent1,14337503:doData,[(398,97)(398,55)])
link(onEvent2,26538:doRead,[])
}
Add(DoData,14337503,343,49)
{
link(onEventData,18876:doWork1,[(4,55)(4,62)])
link(Data,14833197:String,[(349,34)(314,34)(314,149)(335,149)])
}
Add(EventFromData,2526734,62,7)
{
link(onEvent,8699763:In,[])
}
Add(PictureStream,6814538,700,126)
{
FileName="1.jpg"
link(Bitmap,13631593:ImageBitmap,[(713,114)(641,114)(641,153)(601,153)])
}
Add(HubEx,3211863,655,161)
{
Angle=3
link(onEvent,6814538:doSave,[(659,139)])
}
Add(If_else,6960274,287,455)
{
Op2=Integer(1)
link(onTrue,15237827:In,[])
link(Op1,176617:Var,[])
}
Add(LineBreak,12916603,28,105)
{
Caption="FF"
Type=1
link(Data,18876:Var3,[(34,97)(31,97)])
Primary=[176617,259,322]
}
"Описание программы "
Cap5.exe - пятая стадия разработки захватчика-ретранслятора графики из окон OS Windows
Список в левой части окна программы это заголовки все окон и других объектов приравненных к ним.
(Анализа объектов пока нет так что выбирайте внимательно - ничего страшного не будет но прогу может аварийно закрыть )
Кнопка "->" - обновление списка (При запуске/Закрытии новых программ список автоматически не обновляется!)
Кнопка "Close" - пытается закрыть выбранное в списке окно
Кнопка "Hide" - пытается спрятать выбранное в списке окно
Кнопка "Show" - пытается показать спрятанное окно
Кнопка "Capture" - пытается захватить графику из окна выбранного в списке
(Интересный эффект: если не выбрано ничего(сразу после запуска утилиты ) захватывает весь десктоп )
Кнопка "Found" аналог "Capture" но с поиском по начальным буквам заголовка окна.
("По умолчанию" "WMR Str" для поиска окна WMRViewer )
Галка "Auto" включает динамический захват
Галка "FS" включает сброс динамического захвата в файл "1.Jpg" в текущем каталоге .
Галка "HTTP" включает сервер передачи файла "1.Jpg" по протоколу TCP/IP
(Да получилось малость тупое подобие "веб-интерфейса" по адресу http://127.0.0.1:178
что нужно для более стабильной работы с захваченным изображением для "главной программы - Truba_DS" из проекта "Цифровая оптика" )
Зачем вообще нужна такая докука ?
Просто есть написанная на "жестоких Сях ++" прога WMRViewer переписать быстро ее на паскале не представляется возможным, вот пришлось изобретать очередной "костыль" ... но как результат теперь можно обрабатывать изображение на моей "тяжелой базовой кибер-платформе" Truba_DS из проекта "Цифровая оптика"
.