Application_SetFocus

13 отговора 259 прегледа
#1

Application_SetFocus

Имам програма P1 която чака появяване на събитие - например запис на файл F в определена директория.
След това събитие правя обработка на същия този файл F и извиквам
програма P2 която работи с параметър файла F.
P2 извиквам с CreateProcces.
P2 издава диалог за потвърждение ShowMessageDlg.

Проблема:
на фокус е друга програма P3.

Ако програмата P1 си работи и не е на фокус то при извикване на P2 и след това на диалога искам фокуса на активната програма в Windows да е върху P2 или поне P1....

Правих опити с Application na P1 и P2 но на фокус си остава P3 и трябва да натисна поне ALT-TAB за да сменя фокуса.

Отговор
в отговор на EFEX #2

Re: Application_SetFocus

Опитвал ли си P2 да прави Application.BringToFront;?
Или в краен случай SetForegroundWindow(Application.Mainform.Handle);

Отговор
в отговор на Formal #3

Re: Application_SetFocus

И двата метода активират "банера" на програмата в TaskBar-а но така и не активират приложението на фокус...:((((

Преместих събщението в P1 но това мисля няма значение... Въпроса е принципен - как коя да е програма да стане "Top" на екрана и без никакви допълнитени движения да се фокусира.... така че ако те пита нещо си Да или Не да мога само с Enter или ESC да отговоря .....

P.S. P1 не е минимизирана но и това май не влияе в случая....

Отговор
в отговор на Formal #4

Re: Application_SetFocus

Средата е XP... така че е възможно горното за 98 да бачка но на мен ми трябва за всичкото Win да върви....
...сигурно ше да е някое API на Win-а .....

Отговор
в отговор на EFEX #5

Re: Application_SetFocus

Доколкото си спомням при CreateProcess можеше да задаваш window state на създавания процес (SW_xxxx константите). Как го създаваш в твоя случай?
При WinXP имаше един такъв момент, че ако потребителят работи с едно приложение, фокуса остава в него, освен ако потребителят не превключи изрично (като се замислиш - има смисъл, аз много мразя докато пиша, посредата на думата да ми изкочи някое друго приложение и да си довърша думата там). Та ако не стане, виж дали не можеш да направиш на P2 прозореца да е 'stay on top', или да потърсиш нещо от рода на 'system-wide modal window'

Отговор
в отговор на Formal #6

Re: Application_SetFocus

Не било толкова лесно....
[линк]

Отговор
в отговор на EFEX #7

Re: Application_SetFocus

Много много не се зачетох просто копирах последната от функциите ForceForegrount от страницата, добавих я в проекта и бачка п'ирфектно....сигурно и за 98 и за 2000 върви без проблем....




Невольо...невольооооооууууу... са ше видиш Windows що за чеп е........

Отговор
в отговор на EFEX #8

Re: Application_SetFocus

Даже като гледам може и да се върне фокуса към P3.... но засегя няма да я пипам функцията щото много не ме бива по тия API-та...

Ако някой по напреднал му се занимава все пак ще съм му благодарен ако пейстне код за връщане на фокуса....


Very 10x for all...

Отговор
в отговор на EFEX #9

Re: Application_SetFocus

Мога, но на С/С++ щото Делфи не разбирам

Отговор
в отговор на Beco #10

Re: Application_SetFocus

Давай де....:)

Отговор
в отговор на EFEX #11

Re: Application_SetFocus

ок. ама по късно, като се прибера у дома. малко съм зает сега

Отговор
в отговор на EFEX #12

Re: Application_SetFocus

За да възтановиш минимизирана програма напиши следното:
ShowWindow(Form1->Handle,SW_RESTORE);
Използва се хендъла на формата, която трябва да стане активна, а не на Application-а.

За да изведеш съобщение от минимизирана програма:
Application->MessageBoxA("ala bala","MyExe",MB_OK|MB_ICONINFORMATION|MB_SYSTEMMODAL);
Програмата ти остава минимизирана.

Ако ще изпълняваш горните редове от събитие генерирано от таймер, първо спри таймера и след това покажи съобщението/възтанови състоянието на програмата.

За да възтановиш нормалното състояние на др. програма трябва да се направи следното:
- С FindWindow(NULL,"AppCaption") намираш хендъла на другата програма
- С PostMessage(хендъла-на-др-програма,SW_RESTORE,0,0) възтановяваш състоянието и преди да е минимизирана.

Отговор
в отговор на Beco #13

Re: Application_SetFocus

Ok...:)))
for ( int exclam = 1; exclam < 10; exclam++ )
ShowMessage("Very 10x");

Отговор