Форум: "Основная";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
ВнизКак сделать чтобы через определённый промежуток времени Найти похожие ветки
← →
Кен (2003-10-01 04:33) [0]программа переключала на себя фокус ?
Советуют использовать :
SetActiveWindow()
SetForeGroundWindow()
Но, что долно быть в скобках ?
Пробовал следующее :
SetForegroundWindow(Application.Handle);
SetForegroundWindow(Form1.Handle);
SetActiveWindow(Application.Handle);
SetActiveWindow(Form1.Handl);
Windows.SetFocus(Application.Handle);
Windows.SetFocus(Form1.Handle);
BringWindowToTop(Application.Handle);
BringWindowToTop(Form1.Handle);
ShowWindow(Form1.Handle, SW_SHOWNA);
Не помогло. Максимум, что получается, так это в панеле задач программа начинает мигать, но фокус на неё не переключается.
Как же правильно сделать ?
← →
Tumcoat (2003-10-01 04:47) [1]А таймером пользоваться не пытался?
← →
KSergey (2003-10-01 05:31) [2]Application.BringToFront?
← →
Кен (2003-10-02 05:02) [3]
> KSergey © (01.10.03 05:31) [2]
> Application.BringToFront?
Гениально !
← →
Кен (2003-10-07 02:48) [4]
> KSergey © (01.10.03 05:31) [2]
> Application.BringToFront?
Нет. Не гениально. Почему то в первый раз срабатывает, а во второй уже нет, только опять мигает программа в панели задач и всё. В чём дело непойму.
> Tumcoat © (01.10.03 04:47) [1]
> А таймером пользоваться не пытался?
Каким образом ?
← →
Developerr (2003-10-07 12:11) [5]
> Каким образом ?
Задаешь интервал в таймере. 60000 - это = 1 мин.
Щелкаешь на таймере 2 раза и в событии OnTimer пишешь:
a:=a+1; //предварительно присвоив a:=0; только не в этой процедуре.
if a=10 then
SetActiveWindow()
//Через десять минут должно стать активным.
← →
Кен (2003-10-08 01:48) [6]
> Developerr © (07.10.03 12:11) [5]
> Задаешь интервал в таймере. 60000 - это = 1 мин.
> Щелкаешь на таймере 2 раза и в событии OnTimer пишешь:
> a:=a+1; //предварительно присвоив a:=0; только не в этой
> процедуре.
> if a=10 then
> SetActiveWindow()
> //Через десять минут должно стать активным.
SetActiveWindow() - Что в скобках ?
Так не работает SetActiveWindow(Application.Handle);
Так тоже не работает SetActiveWindow(Form1.Handl);
Просто мигает окошко, в панеле задач, а переключения не происходит.
Вот я и спрашиваю, а как правильно ?
← →
Tumcoat (2003-10-08 08:48) [7]Как и было сказано выше:
1. Задаешь интервал в таймере (допустим в событии OnActivate).
Timer1.Interval:=1000;
это примерно 1 сек.
2. Щелкаешь на таймере 2 раза и в событии OnTimer пишешь:
Timer1.Interval:=1000;
(можно ShowModal)
Form2.Show;
3. И все. :-)) Каждый раз при активации формы, через 1 сек. будет появляться вторая форма.
← →
Tumcoat (2003-10-08 08:51) [8]Ой извини, во втором пункте
Timer1.Interval:=0;
:-)))
← →
don-do (2003-10-08 09:30) [9]Ой, а ведь бить за это больно будут.:-)
← →
Кен (2003-10-09 01:27) [10]Для экспериментов проще кинуть на форму TClipboardViewer из RXLib и в его ClipboardViewer1Change прописывать появление формы.
Запускаете программу. Переключаетесь на другое окно и копируете из него что-нибудь. При этом программа должна появиться поверх всех окон и переключить на себя фокус.
procedure TForm1.ClipboardViewer1Change(Sender: TObject);
begin
if Form1.Enabled then begin // Чтобы при запуске программы не получать ошибку установки фокуса.
Form1.Show;
// Или пишете сюда что угодно из приведённых выше вариантов.
// Кто найдёт правильный код - тот здесь самый умный.
end;
end;
Form1.Show; переключает на себя фокус только одни раз ! Второй раз уже не срабатывает. Почему неизвестно. Возможно на Form1 надо послать какое то сообщение о потере фокуса.
← →
Кен (2003-10-11 04:06) [11]Как, товарищи ?
← →
mike.dld (2003-10-11 04:14) [12]не знаю, какого хрена у тебя не получается, я в OnTimer пишу просто
SetForegroundWindow(Handle);
и всё работает. У меня WinXP, D6
← →
Anatoly Podgoretsky (2003-10-11 11:41) [13]don-do © (08.10.03 09:30) [9]
Ой не то слово
← →
alexta (2003-10-12 01:45) [14]Не все так просто. У меня тоже не работает под ХР, 2000. Спрашивал у умных людей - сказали что дяди из Microsoft лавочку в 2000 и ХР прикрыли. Теперь ни одна программа без вмешательства пользователя активной не становится.
Насколько ето правда - не знаю.
← →
Anatoly Podgoretsky (2003-10-12 07:41) [15]Это правда, что бы плохии дяди не портили работу пользователя.
← →
Кен (2003-10-14 02:16) [16]
> Anatoly Podgoretsky © (12.10.03 07:41) [15]
> Это правда, что бы плохии дяди не портили работу пользователя.
А откуда это известно ? Какой источник информации ?
← →
Германн (2003-10-14 03:35) [17]Очень все это верно сказано.
Но у меня недавно произошло все как раз наоборот. Уже давно, некий забытый уже мной заказчик попросил, чтобы моя программа всегда была поверх всех прочих и не давала человеку сидящему за компом никаких возможностей нормально пользоваться любыми другими приложениями. Я, конечно, пытался его переубедить, говоря, что Windows все-таки разрабатывался как раз для противополжных целей, но...
А вот недавно, приехав к одному из пользователей данной программы, где она стояла в "пробном" режиме, я попробовал переключиться в WindowsCommander, чтобы либо прочитать свои исходники, либо запустить Дельфи, чтобы уточнить некие вопросы. У этого пользователя стоит WinXP. Никто, кроме... (см. П.Энтони) не может там ничего сделать, кроме как посмотреть на экран. Но увы - никаких нормальных способов переключиться в любое другое приложение я не нашел. Происходило некое "моргание", возможно видимое из-за того, что монитор TFT и более ничего! Единственным способом работы в другом приложении, типа WC было - "Оттащить" мышкой окно моей программы в сторону. Причем видимый кусок ее так и оставался всега видимым, несмотря на то, что работа шла в другом приложении!
Дык вот как такое произошло! И как такое сделать самому? Ей богу - не понимаю!
← →
Кен (2003-10-15 03:34) [18]
> Германн © (14.10.03 03:35) [17]
А сама программа есть ? Может в коде её поглядеть ?
← →
Германн (2003-10-16 03:30) [19]2 Кен © (15.10.03 03:34) [18]
Ес-сно есть. Это же моя собственная программа. И в коде можно поглядеть. Но вот только в коде нет ничего особенного!
Есть вызываемая по таймеру каждую секунду(это минимальный интервал) процедура SetAct.
procedure SetAct;
begin
SetWindowPos(Application.Handle,HWND_TOP,1,1,0,0,SWP_NOSIZE);
SetForegroundWindow(Application.Handle);
end;
И все! Но, во-первых, раз в секунду - это заметно на глаз. Во-вторых, вышеописанный случай - единственный из множества. Во всех прочих случаях - работа моей программы не сопровождается такими эфФектами!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.018 c