Вверх ↑
Этот топик читают: Гость
Ответов: 2415
Рейтинг: 691
#31: 2025-05-13 08:52:15 ЛС | профиль | цитата
По итогу внес следующие изменения:
1. В элемент ScreenShort добавил проверку на "пустоту" (согласен с tom-it). На совместимость не повлияет, событие onCapture выдаст изображение с размером 0x0 что и логично. Но самое главное что BitBlt не будет приводить к таким падениям и глюкам, что очень важно.
2. В элемент WinEnum изменил\добавил в свойство VisibleOnly:
@VisibleOnly=Visible - перечислять все видимые окна, All - перечислять все окна, AppWindow - перечесляет все окна рабочего стола, Show - перечесляет все окна имеющие ширину и высоту не равную нулю|4|0|Visible,All,AppWindow,Show
True - превратилось в Visible, а False в All. На совместимость это не повлияет. Также "особачил" это свойство.

Архив с исправлениями в посте ниже.

Редактировалось 2 раз(а), последний 2025-05-14 11:52:37
карма: 11

1
Голосовали:tom-it
Ответов: 1946
Рейтинг: 174
#32: 2025-05-14 09:13:14 ЛС | профиль | цитата
А как насчёт обновления на SVN? Именно чтобы не было несовместимостей с другими людьми при передаче схем.
карма: 9
0
Ответов: 2415
Рейтинг: 691
#33: 2025-05-14 09:51:37 ЛС | профиль | цитата
3042, надо бы протестировать. Если у ScreenShort правка минимальная, то в WinEnum внесены изменения которые нужно бы хорошенько протестировать.
карма: 11

0
Ответов: 2415
Рейтинг: 691
#34: 2025-05-14 12:38:37 ЛС | профиль | цитата
Ну вот и ошибка, скорее недочет с моей стороны. Так как свойство VisibleOnly используется не только в doEnum (все окна), но и в doEnumChildWindows (дочерние окна) были добавлены изменения и туда. Но при поиске дочерних форм нет смысла в свойстве VisibleOnly = AppWindow (окна рабочего стола). И как с этим быть? На данный момент перенес свойство AppWindow в конец списка. И добавил описание к doEnumChildWindows что в AppWindow нет смысла.

Есть идеи как это дело организовать по другому или так как мной реализовано оставить?

Архив файлов с правками и примером

Редактировалось 2 раз(а), последний 2025-05-14 14:26:10
карма: 11

0
Ответов: 1946
Рейтинг: 174
#35: 2025-05-14 12:51:51 ЛС | профиль | цитата
Может быть, имеет смысл:
- оставить VisibleOnly=True/False
- добавить св-во AppWindow=True/False
- добавить св-во SizeNoZero=True/False
Таким образом, св-ва можно будет комбинировать, AppWindow просто не учитывать при doEnumChildWindows, да и наглядней будет. Я бы сделал так.
карма: 9
0
Ответов: 2415
Рейтинг: 691
#36: 2025-05-14 13:25:55 ЛС | профиль | цитата
3042, а что в таком случае должно выдавать doEnum при: VisibleOnly=False и AppWindow=True? Первое свойство говорит о том что нужно все окна, а второе что только окна рабочего стола. У какого свойства приоритет? В коде организовать не проблема, но не запутает ли это пользователя.
карма: 11

0
Ответов: 1946
Рейтинг: 174
#37: 2025-05-14 13:46:05 ЛС | профиль | цитата
sla8a, ну, наверное, все (а не только видимые) окна рабочего стола
Или AppWindow=True автоматически подразумевает, что окно видимое? Тогда указать в этом св-ве, что используется только при VisibleOnly=True.
карма: 9
0
Ответов: 2415
Рейтинг: 691
#38: 2025-05-14 14:26:51 ЛС | профиль | цитата
3042, при том способе что я предложил, достаточно предупредить что AppWindow при поиске дочерних окон нет смысла использовать. При твоем способе придется давать описание к каждому свойству и что в результате получится. Как по мне это запутает. Вот к примеру можно легко переключить одно свойство:

Add(MainForm,14047676,63,231)
{
Width=842
Height=761
link(onCreate,1905618:doDeferredEvent,[])
}
Add(WinEnum,4438343,252,280)
{
VisibleOnly=3
Point(doVisibleOnly)
Point(doEnumChildWindows)
Point(onEnumChildWindows)
Point(ParentHandle)
link(onFindWindow,1191528:doData,[])
link(onEndEnum,1829594:doEvent,[(296,293)(296,405)])
link(onEnumChildWindows,11581316:doSeparateMT,[])
link(ParentHandle,11373653:Var,[])
}
Add(DeferredEvent,1905618,112,245)
{
Delay=1000
link(onDeferredEvent,1321535:doEvent1,[])
}
Add(WinInfo,12732599,448,280)
{
Point(Left)
Point(Top)
Point(Width)
Point(Height)
Point(IsZoomed)
Point(IsEnabled)
link(onWinInfo,3935752:doOperation,[])
}
Add(StringTable,14023005,686,343)
{
Left=5
Width=810
Height=215
Font=[MS Sans Serif,12,0,0,1]
Columns=#4:№=40|6:Handle|9:ClassName|11:Caption=200|7:Left=60|8:Right=60|8:Width=60|9:Height=60|9:Zoomer=60|9:Enable=60|
Grid=0
Point(doSelect)
Point(onSelect)
Point(Strings)
link(onSelect,3921252:doRead,[(731,356)(731,383)(688,383)(688,398)])
}
Add(FormatStr,1037894,434,343)
{
DataCount=10
Mask="%1;%2;%3;%4;%5;%6;%7;%8;%9;%10"
link(onFString,5145947:doEvent,[])
link(Str1,5438494:Var1,[(440,327)])
link(Str3,12732599:ClassName,[])
link(Str4,12732599:Caption,[])
link(Str5,12732599:Left,[])
link(Str6,12732599:Top,[])
link(Str7,12732599:Width,[])
link(Str8,12732599:Height,[])
link(Str9,12732599:IsZoomed,[])
link(Str10,12732599:IsEnabled,[])
}
Add(Hub,1321535,161,245)
{
OutCount=4
link(onEvent1,350050:In,[])
link(onEvent2,2077792:doWork2,[])
link(onEvent3,3616204:In,[])
link(onEvent4,4438343:doEnum,[(183,272)(183,286)])
}
Add(Math,3935752,532,280)
{
Op2=1
Point(doClear)
link(Op1,5438494:Var3,[(538,268)(572,268)(572,327)])
}
Add(LineBreak,4274213,644,350)
{
Caption="cl"
link(Out,14023005:doClear,[])
Primary=[350050,-455,-105]
}
Add(ArrayRW,3921252,700,392)
{
link(onRead,1465603:doEvent1,[])
link(Array,14023005:Strings,[])
}
Add(MultiStrPart,2770466,833,392)
{
From=1
Count=1
}
Add(StringTable,16112192,644,441)
{
Top=510
Width=820
Height=205
Font=[MS Sans Serif,12,0,0,1]
Columns=#4:№=40|6:Handle|9:ClassName|11:Caption=200|7:Left=60|8:Right=60|8:Width=60|9:Height=60|9:Zoomer=60|9:Enable=60|
Grid=0
Point(doSelect)
Point(onSelect)
Point(Strings)
}
Add(IndexToChanel,5145947,595,343)
{
Point(Index)
link(onEvent1,14023005:doAdd,[])
link(onEvent2,16112192:doAdd,[(634,356)(634,447)])
link(Index,7512963:Var2,[])
}
Add(Hub,1465603,742,392)
{
link(onEvent1,2770466:doSplit,[])
link(onEvent2,13803493:doDeferredEvent,[(776,405)(776,535)(97,535)(97,307)])
}
Add(LineBreak,12527530,595,448)
{
Caption="cl"
link(Out,16112192:doClear,[])
Primary=[3249323,-406,-133]
}
Add(ChanelToIndex,4679386,553,196)
{
link(onIndex,916844:doValue,[])
}
Add(Memory,916844,595,196)
{
}
Add(DoData,7050091,574,399)
{
Data=Integer(0)
link(onEventData,14023005:doSelect,[(669,405)(669,370)])
AddHint(1,-20,21,13,Data)
}
Add(Hub,7612201,154,301)
{
OutCount=5
link(onEvent1,2251218:In,[])
link(onEvent2,2077792:doWork3,[(228,314)])
link(onEvent3,3249323:In,[])
link(onEvent4,13990997:doData,[(178,328)(178,377)])
link(onEvent5,4438343:doEnumChildWindows,[(246,335)(246,314)])
}
Add(LineBreak,6613382,511,196)
{
Caption="0"
link(Out,4679386:doWork1,[])
Primary=[3616204,-322,63]
}
Add(LineBreak,2435114,511,210)
{
Caption="1"
link(Out,4679386:doWork2,[(547,216)(547,209)])
Primary=[2251218,-322,91]
}
Add(DoData,1191528,350,280)
{
link(onEventData,10596749:doEvent1,[])
link(Data,4438343:Handle,[(356,270)(338,270)(338,334)(258,334)])
}
Add(MT_MultiData,11581316,308,294)
{
From=1
Count=1
link(onData1,10596749:doEvent2,[(391,300)(391,293)])
}
Add(Hub,10596749,399,280)
{
InCount=2
link(onEvent1,12732599:doWinInfo,[])
link(onEvent2,1037894:doString,[(420,293)(420,349)])
}
Add(GetDataEx,5438494,532,322)
{
link(Data,3935752:Result,[])
}
Add(DeferredEvent,13803493,112,301)
{
link(onDeferredEvent,7612201:doEvent1,[])
}
Add(StrCat,9250914,637,490)
{
Str1="Дочерних окон: "
link(onStrCat,9514022:doText,[])
link(Str2,16112192:Count,[])
}
Add(Label,9514022,686,490)
{
Left=5
Top=475
Width=814
Height=24
Color=-16777196
Font=[MS Sans Serif,12,0,0,1]
Caption=""
AutoSize=1
Alignment=2
}
Add(IndexToChanel,1829594,518,399)
{
Point(Index)
link(onEvent1,7050091:doData,[])
link(onEvent2,9250914:doStrCat,[(568,412)(568,496)])
link(Index,7512963:Var1,[(524,334)])
}
Add(GetDataEx,7512963,595,329)
{
link(Data,916844:Value,[])
}
Add(LineBreak,9894912,924,462)
{
Caption="parent"
Type=1
link(Data,13991947:Var3,[(930,439)])
Primary=[11373653,-665,-210]
}
Add(DoData,13990997,189,371)
{
Data=Integer(0)
link(onEventData,4438343:doVisibleOnly,[(237,377)(237,307)])
AddHint(1,-22,21,13,Data)
}
Add(GetDataEx,13991947,833,434)
{
link(Data,2770466:Part1,[])
}
Add(ScreenShort,6248627,833,455)
{
link(onCapture,12279222:doLoad,[])
link(Handle,13991947:Var2,[])
}
Add(Timer,15710297,784,455)
{
Interval=300
link(onTimer,6248627:doCapture,[])
}
Add(Image,12279222,882,455)
{
Left=190
Top=245
Width=407
Height=227
Color=-16777212
}
Add(HubEx,2077792,224,252)
{
link(onEvent,3935752:doClear,[(518,258)(518,293)])
}

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

Вот поменять название с Show, на SizeNoZero идея хорошая (show менее информативное).

Давай подождем, может кто поддержит один из наших подходов или предложит свой.
карма: 11

0
Ответов: 1946
Рейтинг: 174
#39: 2025-05-14 14:33:46 ЛС | профиль | цитата
sla8a, ну, мне, в общем, без особой разницы, главное, что проблема не в таймере, а проверить размеры окон я мог бы и на стандартных компонентах
А так - смотри сам, как считаешь, что удобнее.
карма: 9
0
Ответов: 2415
Рейтинг: 691
#40: 2025-05-14 21:58:58 ЛС | профиль | цитата
3042 писал(а):
проверить размеры окон я мог бы и на стандартных компонентах
Тоже не плохой вариант. Не трогать WinEnum вообще, размер можно и так проверить, а возможность определить окно как AppWindow можно WinInfo добавить (если это вообще нужно кому будет). Только вот в ScreenShort внести защиту, чтоб таймеры не останавливал.
карма: 11

0
Ответов: 1129
Рейтинг: 80
#41: 2025-05-15 07:25:44 ЛС | профиль | цитата
Сугубо моё личное, субъективное, мнение.
WinEnum, в основном, используется всего лишь как одно звено длинной цепочки алгоритма. Выдал окно и все, что там дальше происходит в последующих звеньях не важно.
Если и информировать пользователя о специфических окнах, то посредством var точки.
Касательно ScreenShort, то правки обязательны. И не просто втихаря ничего не делать, а предупредить пользователя о невалидных размерах.
карма: 2

0
41
Сообщение
...
Прикрепленные файлы
(файлы не залиты)