Вверх ↑
Этот топик читают: Гость
Ответов: 31
Рейтинг: 0
#16: 2017-12-10 22:16:25 ЛС | профиль | цитата
flint2 писал(а):

Первый операнд я получаю из переменной var_Proc_ID.

О куда деньги берёшь - из тумбочки.
А кто в тумбочку кладёт?
...
Откуда в var_Proc_ID чего возьмётся, если в DoData 0 записан?
Зачем он там стоит? наверное его верхнюю точку надо соединить с нижней WinExec.
В схеме этого нет. Изначально надо по человечески оформлять вопросы.


Связь была, но "испарилась" в процессе моих дерганий с элементом сравнения.
А дергаться я начал по факту неправильного сравнения.


flint2 писал(а):
Чего не каснись - всё не правильно и вся топология тоже.
Надо схему делать заново и по кускам, а не сразу в трей прятать!


Я же предупреждал, что это первая моя схема.
И далась Вам эта скрытая форма. На ней ни чего нет и ни чего не будет.
Была бы возможность сделать фоновое, без формы, приложение с иконкой в трее, сделал бы вообще без формы.
Но, вопрос с неправильным сравнением остается открытым.
карма: 0

0
Ответов: 2059
Рейтинг: 132
#17: 2017-12-10 23:30:42 ЛС | профиль | цитата
И далась Вам эта скрытая форма. На ней ни чего нет и ни чего не будет.

Далась! А Ты так и не понял почему.
Это прежде всего культура общения!
Всё лишнее - отсекать, чтобы никто не разгребал Авгиевы конюшни.
Примерно так оформляется вопрос, как ниже.
Мне кажется, что так надо делать, а дальше всё остальное, что хочешь получить.

Add(WinExec,14874742,420,168)
{
FileName="notepad.exe"
Point(ProcessID)
link(onExec,8258297:doData,[(460,174)(460,223)])
}
Add(EnumProcess,6545238,658,203)
{
Point(onFind)
Point(onNotFind)
link(onProcess,4977417:doCompare,[(698,209)(698,328)])
}
Add(GlobalVar,15375690,525,147)
{
Name="var_Proc_ID"
Data=Integer(0)
link(onValue,6545238:doEnum,[(607,153)(607,209)])
}
Add(DoData,8258297,469,217)
{
Data=Integer(0)
link(onEventData,15375690:doValue,[(513,223)(513,153)])
link(Data,14874742:ProcessID,[(475,209)(426,209)])
}
Add(If_else,4977417,826,322)
{
link(onTrue,9542812:doData,[(870,328)(870,356)(646,356)(646,384)])
link(Op1,15375690:Var,[(832,242)(531,242)])
link(Op2,2271334:Var3,[(839,271)])
}
Add(Memo,10820739,798,378)
{
Left=5
Top=10
Width=335
Height=205
ScrollBars=2
}
Add(DoData,9542812,658,378)
{
link(onEventData,10820739:doAdd,[])
link(Data,2271334:Var2,[])
}
Add(Button,2805275,336,238)
{
Left=15
Top=230
link(onClick,14874742:doExec,[(394,244)(394,174)])
}
Add(GetDataEx,2271334,658,266)
{
link(Data,6545238:CurrentID,[])
}

Редактировалось 1 раз(а), последний 2017-12-10 23:33:40
карма: 6

0
Ответов: 31
Рейтинг: 0
#18: 2017-12-11 00:04:21 ЛС | профиль | цитата
flint2 писал(а):


Мне кажется, что так надо делать, а дальше всё остальное, что хочешь получить.


Спасибо за предложенную схему. Проверил, работает, но не подходит.
Мне надо сравнивать ID процесса полученный не от EnumProcess, а от WinEnum.
А вот в случае с WinEnum сравнение ID нормально не получается. И именно на этот момент я неоднократно указывал.
Так, что вопрос остается открытым.

P.S. WinEnum мне нужен что бы получить хендл и другие параметры окна стороннего процесса, что бы этим окном управлять.

Редактировалось 1 раз(а), последний 2017-12-11 00:17:48
карма: 0

0
Ответов: 2059
Рейтинг: 132
#19: 2017-12-11 12:23:11 ЛС | профиль | цитата
А это ничего, что ты сравниваешь разные понятия?
Понятно-же, что совпадений не будет!
карма: 6

0
Ответов: 31
Рейтинг: 0
#20: 2017-12-11 16:14:06 ЛС | профиль | цитата
flint2 писал(а):
А это ничего, что ты сравниваешь разные понятия?
...


Интересно.
Смотрим что же я сравниваю:

1)ProcessID, полученный от WinInfo

2)ProcessID, полученный от WinExec

И чем же ProcessID, полученный от WinInfo, отличается от ProcessID, полученный от WinExec???

Add(MainForm,2953706,77,28)
{
Visible=1
Icon=[]
link(onCreate,14060359:doEvent1,[(131,48)(131,34)])
}
Add(TrayIcon,9072061,126,154)
{
FormHook=0
ShowWORemoveIcon=0
Point(doAddTrayIcon)
Point(onAutoRecreate)
link(onClick,3305856:doBetween,[])
link(onDblClick,293167:doVisible,[(170,167)(170,293)])
}
Add(PopupMenuEx,14068898,315,154)
{
IconByIndex=0
Menu=#5:Выход|4:Вход|0:|
Bitmaps=[]
PictureLeft=[]
}
Add(WinExec,14874742,294,35)
{
FileName="ProxHTTPSProxy.exe"
Mode=0
Point(ProcessID)
link(onExec,8258297:doData,[(334,41)(334,90)])
}
Add(EnumProcess,6545238,455,70)
{
Point(onFind)
Point(onNotFind)
link(ID,3806134:Var2,[(461,62)(405,62)])
link(onFind,3421579:doBeep,[])
link(onNotFind,5000367:doEvent2,[(494,90)(494,122)(258,122)(258,48)])
}
Add(GlobalVar,15375690,399,14)
{
Name="var_Proc_ID"
Data=Integer(0)
link(onValue,3684219:doEvent1,[(495,20)(495,41)])
}
Add(DoData,8258297,343,84)
{
link(onEventData,15375690:doValue,[(387,90)(387,20)])
link(Data,14874742:ProcessID,[(349,76)(300,76)])
}
Add(Hub,14060359,154,28)
{
link(onEvent1,4893606:doStart,[])
link(onEvent2,9072061:doAddTrayIcon,[(180,41)(180,143)(114,143)(114,181)])
}
Add(Hub,5000367,266,35)
{
InCount=2
OutCount=1
link(onEvent1,14874742:doExec,[])
}
Add(Hub,13933911,420,77)
{
InCount=2
OutCount=1
link(onEvent1,6545238:doFindID,[])
}
Add(Beep,3421579,504,77)
{
Freq=0
Duration=10000
link(onBeep,13933911:doEvent2,[(544,83)(544,116)(411,116)(411,90)])
}
Add(WinTools,293167,266,287)
{
Point(FileName)
Point(doNormal)
Point(isVisible)
link(Handle,264553:Var,[(272,270)(922,270)(922,175)(797,175)])
}
Add(FindWindow,10012660,770,350)
{
ClassName="ConsoleWindowClass"
Caption="ProxHTTPSProxyMII"
link(onFind,10012660:doFindChild,[(814,356)(814,395)(758,395)(758,363)])
}
Add(GlobalVar,1216680,798,189)
{
Name="var____Win_Caption"
Data=String()
}
Add(Thread,4893606,217,28)
{
link(onExec,5000367:doEvent1,[(258,34)(258,41)])
}
Add(Between,3305856,238,154)
{
Left=Integer(1)
Right=Integer(1)
link(onTrue,14068898:doPopupHere,[(292,167)(292,160)])
}
Add(WinInfo,6953584,574,126)
{
Point(ProcessID)
link(onWinInfo,4977417:doCompare,[(622,132)(622,188)])
link(Handle,5159531:Var2,[])
}
Add(WinEnum,704221,574,35)
{
VisibleOnly=1
Point(ClassName)
link(onFindWindow,6953584:doWinInfo,[(653,41)(653,87)(562,87)(562,132)])
}
Add(GlobalVar,7513859,798,231)
{
Name="var_Win_ClassName"
Data=String()
}
Add(DoData,14488710,749,189)
{
Data=String()
link(onEventData,1216680:doValue,[])
link(Data,6953584:Caption,[(755,170)(587,170)])
}
Add(DoData,2647657,749,231)
{
Data=String()
link(onEventData,7513859:doValue,[])
link(Data,6953584:ClassName,[(755,224)(580,224)])
}
Add(Hub,3684219,511,35)
{
link(onEvent1,704221:doEnum,[])
link(onEvent2,13933911:doEvent1,[(540,48)(540,65)(408,65)(408,83)])
}
Add(If_else,4977417,637,182)
{
link(onTrue,8424737:doEvent1,[])
link(Op1,3806134:Var3,[(643,174)(443,174)(443,54)])
link(Op2,6953584:ProcessID,[(650,164)(594,164)])
}
Add(Hub,8424737,679,182)
{
OutCount=3
link(onEvent1,8667035:doData,[(722,188)(722,139)(702,139)(702,90)])
link(onEvent2,14488710:doData,[])
link(onEvent3,3915968:doEvent1,[(705,202)(705,217)(680,217)(680,237)])
}
Add(GlobalVar,264553,791,147)
{
Name="var____Win_Handle"
Data=Integer(0)
}
Add(GetDataEx,5159531,574,70)
{
link(Data,704221:Handle,[])
}
Add(DoData,8667035,714,84)
{
link(onEventData,264553:doValue,[(768,90)(768,153)])
link(Data,5159531:Var3,[(720,75)])
}
Add(GetDataEx,3806134,399,49)
{
link(Data,15375690:Var,[])
}
Add(Hub,3915968,693,231)
{
link(onEvent1,2647657:doData,[])
link(onEvent2,704221:doStop,[(719,244)(719,258)(553,258)(553,55)])
}


Редактировалось 2 раз(а), последний 2017-12-11 16:26:31
карма: 0

0
Ответов: 201
Рейтинг: 2
#21: 2017-12-11 16:27:53 ЛС | профиль | цитата
вообще не пойму что должна делать схема))
карма: 0

0
Ответов: 31
Рейтинг: 0
#22: 2017-12-11 16:37:17 ЛС | профиль | цитата
zhorik5 писал(а):
вообще не пойму что должна делать схема))


Схема должна:

1) запустится и работать в фоне, имея значок в трее
2) запускать некую программу, скрыв ее окно
3) следить за наличием процесса запущенной программы
4) при пропадании процесса запущенной программы, перезапустить ее и следить за нее далее
5) управлять процессом и окном запущенной программы через значок в трее, обрабатывая клики мышью на значке в трее и выборах пунктов его меню.
карма: 0

0
Ответов: 201
Рейтинг: 2
#23: 2017-12-11 16:56:59 ЛС | профиль | цитата
вот это примерно надо?
Add(MainForm,10623783,56,119){
Width=397
Height=114
Visible=1
BorderStyle=0
TaskBar=1
link(onCreate,14060359:doEvent1,[(110,139)(110,125)])
}
Add(TrayIcon,9072061,105,245)
{
FormHook=0
MinimizeInTray=1
ShowWORemoveIcon=0
Point(doAddTrayIcon)
link(onClick,3305856:doBetween,[])
link(onDblClick,293167:doVisible,[(149,258)(149,384)])
}
Add(PopupMenuEx,14068898,210,252)
{
IconByIndex=0
Menu=#5:Выход|4:Вход|0:|
Bitmaps=[]
link(MenuItemIdx,618039:doEvent,[])
}
Add(WinExec,14874742,266,42)
{
FileName="notepad.exe"
Point(ProcessID)
link(onExec,13603882:doEvent1,[(303,48)(303,132)])
}
Add(EnumProcess,6545238,511,161)
{
Point(onFind)
Point(onNotFind)
link(ID,12103357:Var3,[(517,125)])
link(onFind,3421579:doBeep,[])
link(onNotFind,5000367:doEvent2,[(555,181)(555,202)(216,202)(216,139)])
}
Add(GlobalVar,15375690,511,56)
{
Name="var_Proc_ID"
Data=Integer(0)
link(onValue,3684219:doEvent1,[(617,62)(617,132)])
}
Add(DoData,8258297,392,154)
{
Data=Integer(0)
link(onEventData,15375690:doValue,[(457,160)(457,62)])
link(Data,12103357:Var2,[(398,142)(419,142)])
}
Add(Hub,14060359,133,119)
{
link(onEvent1,4893606:doStart,[])
link(onEvent2,9072061:doAddTrayIcon,[(159,132)(159,234)(93,234)(93,272)])
}
Add(Hub,5000367,231,126)
{
InCount=2
OutCount=1
link(onEvent1,14874742:doExec,[(256,132)(256,48)])
}
Add(Hub,13933911,469,161)
{
InCount=2
link(onEvent1,6545238:doEnum,[])
link(onEvent2,6545238:doFindID,[])
}
Add(Beep,3421579,567,168)
{
Freq=0
Duration=10000
link(onBeep,13933911:doEvent2,[(607,174)(607,207)(453,207)(453,174)])
}
Add(WinTools,293167,245,378)
{
Point(FileName)
Point(doNormal)
Point(isVisible)
link(Handle,264553:Var,[(251,361)(901,361)(901,266)(860,266)])
}
Add(FindWindow,10012660,749,441)
{
ClassName="ConsoleWindowClass"
Caption="notepad"
link(onFind,10012660:doFindChild,[(793,447)(795,451)(795,502)(737,502)(737,454)])
}
Add(GlobalVar,1216680,854,273)
{
Name="var____Win_Caption"
Data=String()
}
Add(Thread,4893606,175,119)
{
link(onExec,5000367:doEvent1,[(223,125)(223,132)])
}
Add(Between,3305856,161,245)
{
Left=Integer(1)
Right=Integer(1)
link(onTrue,14068898:doPopupHere,[])
}
Add(WinInfo,6953584,637,217)
{
Point(ProcessID)
link(onWinInfo,4977417:doCompare,[(685,223)(685,279)])
link(Handle,5159531:Var2,[])
}
Add(WinEnum,704221,707,126)
{
VisibleOnly=1
Point(ClassName)
link(onFindWindow,6953584:doWinInfo,[(755,132)(755,175)(625,175)(625,223)])
}
Add(GlobalVar,7513859,854,322)
{
Name="var_Win_ClassName"
Data=String()
}
Add(DoData,14488710,798,273)
{
Data=String()
link(onEventData,1216680:doValue,[])
link(Data,6953584:Caption,[(804,261)(650,261)])
}
Add(DoData,2647657,798,322)
{
Data=String()
link(onEventData,7513859:doValue,[])
link(Data,6953584:ClassName,[(804,311)(643,311)])
}
Add(Hub,3684219,644,126)
{
link(onEvent1,704221:doEnum,[])
link(onEvent2,13933911:doEvent1,[(670,139)(670,153)(457,153)(457,167)])
}
Add(If_else,4977417,700,273)
{
link(onTrue,8424737:doEvent1,[])
link(Op1,15375690:Var,[(706,266)(502,266)(502,110)(517,110)])
link(Op2,6953584:ProcessID,[(713,255)(657,255)])
}
Add(Hub,8424737,763,273)
{
OutCount=4
link(onEvent1,704221:doStop,[(784,279)(784,211)(618,211)(618,146)])
link(onEvent2,14488710:doData,[(789,286)(789,279)])
link(onEvent3,2647657:doData,[(794,293)(794,328)])
link(onEvent4,8667035:doData,[(787,300)(787,240)(765,240)(765,181)])
}
Add(GlobalVar,264553,854,238)
{
Name="var____Win_Handle"
Data=Integer(0)
}
Add(GetDataEx,5159531,637,161)
{
link(Data,704221:Handle,[(643,159)(713,159)])
}
Add(DoData,8667035,777,175)
{
Data=Integer(0)
link(onEventData,264553:doValue,[(831,181)(831,244)])
link(Data,5159531:Var3,[(783,166)])
}
Add(Hub,13603882,343,126)
{
link(onEvent2,8258297:doData,[(371,139)(371,160)])
}
Add(IndexToChanel,618039,266,252)
{
link(onEvent1,10623783:doClose,[(401,258)(401,219)(44,219)(44,146)])
}
Add(GetDataEx,10167957,315,81)
{
Angle=3
link(Data,14874742:ProcessID,[(272,86)])
}
Add(GetDataEx,12103357,413,120)
{
Angle=3
link(Data,10167957:Var2,[(321,125)])
}


сворачивание и скрытие сам настроишь! а меню по образу и подобию...
Редактировалось 2 раз(а), последний 2017-12-11 17:28:21
карма: 0

0
Ответов: 31
Рейтинг: 0
#24: 2017-12-11 17:45:36 ЛС | профиль | цитата
zhorik5 писал(а):
вот это примерно надо?
...


Спасибо большое за участие, но Ваши доработки схемы не решили вопрос темы - схема некорректно сравнивает ProcessID, полученный от WinInfo с ProcessID, полученный от WinExec.

Согласно схемы окно Блокнота должно, при двойном клике мышью на значке в трее, скрываться/становится видимым.

Редактировалось 1 раз(а), последний 2017-12-11 17:46:55
карма: 0

0
Ответов: 4638
Рейтинг: 755
#25: 2017-12-11 18:12:24 ЛС | профиль | цитата
Что, нельзя было накидать маленькую схемку и проверить, что сравнивает корректно:


Add(MainForm,10623783,399,343)
{
Width=374
Height=263
}
Add(Button,1566307,497,511)
{
Left=20
Top=5
Width=80
Caption="1) Запустить"
link(onClick,12004781:doExec,[])
}
Add(Memo,9143625,791,322)
{
Left=20
Top=40
Width=325
Height=170
ScrollBars=2
}
Add(WinExec,12004781,602,511)
{
FileName="notepad.exe"
Point(ProcessID)
link(onExec,6226847:doStrCat,[])
}
Add(LineBreakEx,6999316,791,511)
{
Caption="log"
}
Add(LineBreakEx,14378329,714,322)
{
Caption="log"
Type=1
link(OnEvent,9143625:doAdd,[])
}
Add(StrCat,6226847,742,511)
{
Str1="Программа запущена. ProcessID="
link(onStrCat,6999316:doWork,[])
link(Str2,15650714:getVar,[])
}
Add(LineBreakEx,13490202,602,560)
{
Caption="PID1"
Type=3
link(_Data,12004781:ProcessID,[])
}
Add(LineBreakEx,15650714,749,476)
{
Caption="PID1"
Type=2
}
Add(Button,16415230,504,700)
{
Left=120
Top=5
Width=90
Caption="2) Найти окно"
link(onClick,1869417:doEnum,[])
}
Add(WinEnum,1869417,581,700)
{
VisibleOnly=1
Point(ClassName)
link(onFindWindow,601793:doWinInfo,[])
}
Add(WinInfo,601793,658,700)
{
Point(ProcessID)
link(onWinInfo,14654414:doCompare,[])
link(Handle,1869417:Handle,[(664,688)(626,688)(626,744)(587,744)])
}
Add(If_else,14654414,749,700)
{
link(onTrue,13621504:doStrCat,[])
link(Op1,3070410:getVar,[])
link(Op2,9304673:getVar,[])
}
Add(LineBreakEx,16432563,672,749)
{
Caption="PID2"
Type=3
link(_Data,601793:ProcessID,[])
}
Add(LineBreakEx,9304673,756,651)
{
Caption="PID2"
Type=2
}
Add(LineBreakEx,3070410,749,630)
{
Caption="PID1"
Type=2
}
Add(LineBreakEx,16299757,868,700)
{
Caption="log"
}
Add(StrCat,13621504,819,700)
{
Str1="Окно найдено. Заголовок: "
link(onStrCat,16299757:doWork,[])
link(Str2,601793:Caption,[(832,688)(813,688)(813,780)(671,780)])
}
Значит, проблема в другом. Например, в компоненте Thread стоит FastStop=False, что значит, что он постоянно генерирует событие onExec. В которм происходит постоянный запуск новой копии программы (со сменой WinExec.ProcessID) и перебора процессов и окон. А по логике задачи, программа должна запускаться только когда не найдена.

В общем, слежение за программой можно организовать значительно проще.


Add(MainForm,2953706,21,105)
{
Position=1
}
Add(Button,1566307,238,224)
{
Left=20
Top=5
Width=120
Caption="Запустить и следить"
link(onClick,14589106:doStart,[])
}
Add(WinExec,12004781,476,224)
{
FileName="notepad.exe"
RunEvent=1
Point(ProcessID)
link(onExec,320100:doSynchronize,[])
}
Add(Button,1320274,273,231)
{
Left=145
Top=5
Width=100
Caption="Прекратить"
link(onClick,14589106:doStopFlag,[])
}
Add(Thread,14589106,350,224)
{
link(onExec,12004781:doExec,[])
}
Add(Memo,9143625,343,105)
{
Left=20
Top=40
Width=325
Height=170
ScrollBars=2
}
Add(LineBreakEx,14378329,266,105)
{
Caption="log"
Type=1
link(OnEvent,9143625:doAdd,[])
}
Add(Synchronize,320100,553,224)
{
link(onSync,9126657:doData,[])
}
Add(LineBreakEx,6999316,658,224)
{
Caption="log"
}
Add(DoData,9126657,609,224)
{
Data=String(Завершилась - повторяем запуск)
link(onEventData,6999316:doWork,[])
}


Редактировалось 2 раз(а), последний 2017-12-11 18:22:29
карма: 26

0
Ответов: 31
Рейтинг: 0
#26: 2017-12-11 19:12:13 ЛС | профиль | цитата
Netspirit мне непонятно в Вашей схеме запуска и контроля процесса:

1) как осуществлять регулировку задержки между итерациями???

2) какую роль играет в ней элемент Synchronize???

P.S. большое спасибо за советы. Переделаю схему с их учетом. По результатам отпишусь.
карма: 0

0
Ответов: 4638
Рейтинг: 755
#27: 2017-12-12 17:56:35 ЛС | профиль | цитата
kichrot писал(а):
1) как осуществлять регулировку задержки между итерациями???
В данном случае это не имеет значения. Событие Thread.onExec не закончится до тех пор, пока не отработает метод WinExec.doExec. А в режиме WinExec.RunEvent=Wait метод doExec не возвратит управление до завершения работы запущеной программы. Когда запущенная программа завершится, произойдёт событие onExec, затем метод doExec завершится и компонент Thread пойдёт на следующую итерацию (после задержки, указанной в свойстве Delay - в данном использовании она влияет только на паузу между завершением программы и следующим запуском).
kichrot писал(а):
2) какую роль играет в ней элемент Synchronize???
По WinExec.onExec я обращаюсь к оконному элементу (вывожу строку в Memo). А само событие происходит в том потоке исполнения, в котором оно вызвано, а именно, в параллельном потоке, созданном компонентом Thread. При обращении к визуальным компонентам из параллельных потоков следует использовать компонент Synchronize, чтобы избежать ошибок конкуренции потоков. Если в цепочке события Thread.onExec ты не обращаешься ни к каким оконным элементам, то в компоненте Synchronize нету необходимости. Правильное управление параллельными потоками в приложении - это отдельная тема.
карма: 26

0
Ответов: 31
Рейтинг: 0
#28: 2017-12-12 23:40:22 ЛС | профиль | цитата
Netspirit большое спасибо за дополнительные разъяснения

kichrot писал(а):

... большое спасибо за советы. Переделаю схему с их учетом. По результатам отпишусь.


Отписываюсь по итогам экспериментов.
У меня два результата хороший и плохой.
Начну с плохого.
Предложенный Вами способ запуска и контроля за работой процесса:

Netspirit писал(а):
...
В общем, слежение за программой можно организовать значительно проще.


Add(MainForm,2953706,21,105)
{
Position=1
}
Add(Button,1566307,238,224)
{
Left=20
Top=5
Width=120
Caption="Запустить и следить"
link(onClick,14589106:doStart,[])
}
Add(WinExec,12004781,476,224)
{
FileName="notepad.exe"
RunEvent=1
Point(ProcessID)
link(onExec,320100:doSynchronize,[])
}
Add(Button,1320274,273,231)
{
Left=145
Top=5
Width=100
Caption="Прекратить"
link(onClick,14589106:doStopFlag,[])
}
Add(Thread,14589106,350,224)
{
link(onExec,12004781:doExec,[])
}
Add(Memo,9143625,343,105)
{
Left=20
Top=40
Width=325
Height=170
ScrollBars=2
}
Add(LineBreakEx,14378329,266,105)
{
Caption="log"
Type=1
link(OnEvent,9143625:doAdd,[])
}
Add(Synchronize,320100,553,224)
{
link(onSync,9126657:doData,[])
}
Add(LineBreakEx,6999316,658,224)
{
Caption="log"
}
Add(DoData,9126657,609,224)
{
Data=String(Завершилась - повторяем запуск)
link(onEventData,6999316:doWork,[])
}




для меня оказался неприемлем.

Объясняю почему.
Судя по всему элемент WinExec содержит ошибки в реализации. По крайней мере его функционал расходится с заявленным в справке. Конкретно в справке написано: "onExec - Событие происходит в случае успешного запуска программы методом doExec". По факту:

1) если выставить значение свойства RunEvent равное
Wait то событие onExec наступает не при каждом запуске процесса элементом WinExec, а после прекращения всего цикла итераций в элементе WinExec.

2) событие onExec наступает не по факту запуска процесса, а по факту прекращения его существования.

3) корректно событие onExec наступает только при RunEvent равном Async


В связи с указанным, для моих целей невозможно использовать предложенную Вами схему.

Я вернулся к своей схеме контроля за запущенным процессом, выставив в элементе Thread значение свойства FastStop равное True, а в элементе WinExec значение свойства RunEvent равном Async.
Слежение за наличием запущенного процесса организовано вне элемента WinExec.

Схема заработала, в части запуска внешнего процесса, его контроля и получения параметров его окна, как мне надо. Наглядно можно посмотреть:

Add(MainForm,10623783,97,84)
{
Height=631
link(onCreate,14060359:doEvent1,[(137,104)(137,90)])
}
Add(TrayIcon,9072061,158,164)
{
FormHook=0
MinimizeInTray=1
ShowWORemoveIcon=0
Point(doAddTrayIcon)
link(onClick,3305856:doBetween,[])
}
Add(PopupMenuEx,14068898,246,171)
{
IconByIndex=0
Menu=#5:Выход|15:Показать/Скрыть|0:|
Bitmaps=[]
link(MenuItemIdx,618039:doEvent,[])
}
Add(WinExec,14874742,263,84)
{
FileName="notepad.exe"
Mode=0
Point(ProcessID)
Point(doConsoleExec)
link(onExec,8258297:doData,[])
}
Add(DoData,8258297,315,84)
{
link(onEventData,12963171:doValue,[(357,90)(357,48)])
link(Data,14874742:ProcessID,[(321,76)(301,76)(301,124)(269,124)])
}
Add(Hub,14060359,146,84)
{
link(onEvent1,14589106:doStart,[])
link(onEvent2,9072061:doAddTrayIcon,[(165,97)(165,111)(150,111)(150,191)])
}
Add(WinTools,293167,290,227)
{
Point(FileName)
Point(isVisible)
link(Handle,264553:Var,[(296,218)(376,218)(376,225)(746,225)])
}
Add(GlobalVar,1216680,740,238)
{
Name="var____Win_Caption"
link(onValue,12362436:doEvent4,[(870,244)(870,134)(746,134)(746,114)])
}
Add(Between,3305856,203,164)
{
Left=Integer(1)
Right=Integer(1)
link(onTrue,14068898:doPopupHere,[])
}
Add(WinInfo,6953584,532,161)
{
Point(ProcessID)
link(onWinInfo,4199406:doEvent1,[])
link(Handle,5159531:Var2,[])
}
Add(WinEnum,704221,602,98)
{
VisibleOnly=1
Point(ClassName)
link(onFindWindow,6953584:doWinInfo,[(643,104)(643,153)(525,153)(525,167)])
}
Add(GlobalVar,7513859,740,278)
{
Name="var_Win_ClassName"
link(onValue,12362436:doEvent5,[(874,284)(874,129)(751,129)(751,121)])
}
Add(DoData,14488710,693,238)
{
link(onEventData,1216680:doValue,[(737,244)(737,244)])
link(Data,6953584:Caption,[(699,217)(545,217)])
}
Add(DoData,2647657,693,278)
{
link(onEventData,7513859:doValue,[(737,284)(737,284)])
link(Data,6953584:ClassName,[(699,272)(538,272)])
}
Add(If_else,4977417,609,231)
{
link(onTrue,8424737:doEvent1,[])
link(Op1,3837332:Var2,[(615,220)(395,220)])
link(Op2,5633114:Var3,[(622,210)(639,210)(639,199)])
}
Add(Hub,8424737,654,231)
{
OutCount=4
link(onEvent1,704221:doStop,[(675,237)(675,158)(588,158)(588,118)])
link(onEvent2,8667035:doData,[(680,244)(680,188)])
link(onEvent3,14488710:doData,[(684,251)(684,244)])
link(onEvent4,2647657:doData,[(680,258)(680,284)])
}
Add(GlobalVar,264553,740,182)
{
Name="var____Win_Handle"
link(onValue,12362436:doEvent3,[(865,188)(865,139)(740,139)(740,107)])
}
Add(GetDataEx,5159531,532,140)
{
link(Data,704221:Handle,[(538,138)(608,138)])
}
Add(DoData,8667035,693,182)
{
link(onEventData,264553:doValue,[(734,188)(734,188)])
link(Data,5159531:Var3,[(699,145)])
}
Add(IndexToChanel,618039,291,171)
{
link(onEvent1,10623783:doClose,[(335,177)(335,154)(90,154)(90,111)])
link(onEvent2,293167:doVisible,[(335,184)(335,210)(258,210)(258,233)])
}
Add(Thread,14589106,176,84)
{
FastStop=0
Point(doStopFlag)
link(onExec,5000367:doEvent1,[])
}
Add(Hub,4199406,574,161)
{
OutCount=3
link(onEvent1,10571158:doData,[(649,167)(649,51)])
link(onEvent2,4333925:doData,[(654,174)(654,100)])
link(onEvent3,4977417:doCompare,[(592,181)(592,237)])
}
Add(EnumProcess,6545238,427,98)
{
Point(onFind)
Point(onNotFind)
link(ID,3806134:Var2,[(433,79)(377,79)])
link(onFind,3421579:doBeep,[])
link(onNotFind,5000367:doEvent2,[(471,118)(471,149)(220,149)(220,97)])
}
Add(GlobalVar,12963171,371,42)
{
Name="var_Proc_ID"
Data=Integer(0)
link(onValue,3684219:doEvent1,[(467,48)(467,69)])
}
Add(Hub,13933911,371,105)
{
InCount=2
OutCount=1
link(onEvent1,6545238:doFindID,[])
}
Add(Beep,3421579,476,105)
{
Freq=0
Duration=10000
link(onBeep,13933911:doEvent2,[(516,111)(516,144)(355,144)(355,118)])
}
Add(Hub,3684219,483,63)
{
link(onEvent1,704221:doEnum,[(549,69)(549,104)])
link(onEvent2,13933911:doEvent1,[(505,76)(505,86)(364,86)(364,111)])
}
Add(GetDataEx,3806134,371,63)
{
link(Data,12963171:Var,[])
}
Add(Hub,5000367,228,84)
{
InCount=2
OutCount=1
link(onEvent1,14874742:doExec,[])
}
Add(GetDataEx,3837332,389,210)
{
link(Data,3806134:Var1,[(395,68)])
}
Add(Memo,9143625,847,66)
{
Left=25
Top=30
Width=325
Height=525
ScrollBars=2
}
Add(DoData,10571158,693,45)
{
link(onEventData,12362436:doEvent1,[(748,51)(748,93)])
link(Data,3837332:Var3,[(699,25)(521,25)(521,215)])
}
Add(DoData,4333925,693,94)
{
link(onEventData,12362436:doEvent2,[])
link(Data,5633114:Var1,[(699,85)(667,85)(667,194)])
}
Add(Hub,12362436,763,87)
{
InCount=5
OutCount=1
link(onEvent1,5976496:doSynchronize,[])
}
Add(GetDataEx,5633114,623,194)
{
Angle=3
link(Data,6953584:ProcessID,[(552,199)])
}
Add(Synchronize,5976496,798,87)
{
link(onSync,9143625:doAdd,[(838,93)(838,72)])
}

Таким образом подозрения на некорректную работу элемента If_else сняты, но выявлена некорректная работа элемента WinExec.
Помимо этого я подозреваю, что есть ошибка в работе элемента WinTools, конкретно метод doVisible благополучно делает скрытое окно видимым, но видимое окно скрывать не желает, хотя судя по подсказке к методу, и исходникам к элементу, он это должен делать.

Редактировалось 1 раз(а), последний 2017-12-12 23:45:41
карма: 0

0
Ответов: 2059
Рейтинг: 132
#29: 2017-12-13 00:37:41 ЛС | профиль | цитата
1. На doVisible нужно подавать "0", или "1", в зависимости нужно окно скрыть, или показать.
2. WinExec работает правильно, просто надо разобраться.
карма: 6

0
Ответов: 31
Рейтинг: 0
#30: 2017-12-13 00:49:59 ЛС | профиль | цитата
flint2 писал(а):
1. На doVisible нужно подавать "0", или "1", в зависимости нужно окно скрыть, или показать.
...


Спасибо, попробую. Справка по элементу очень куцая.

flint2 писал(а):
...
2. WinExec работает правильно, просто надо разобраться.


Правильно это как???
Справка об этом вообще ни чего не говорит. А согласно исходника элемента событие должно наступать именно при каждом запуске внешнего процесса, а не после его завершения:

procedure THIWinExec._work_doExec;
var Fn, Cmd, WD: string;
begin
Fn := ReadString(_Data,_data_FileName,_prop_FileName);
Cmd := ReadString(_Data,_data_Params,_prop_Param);
WD := ReadString(_Data,_data_WorkingDir,_prop_WorkingDir);
[b]
if RunProcess(Fn, Cmd, WD, Boolean(_prop_RunEvent)) then
_hi_CreateEvent(_Data, @_event_onExec);
end;

Редактировалось 3 раз(а), последний 2017-12-13 00:53:13
карма: 0

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