Сейчас на форуме: tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Активное окно
Посл.ответ Сообщение


Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 17:52
· Личное сообщение · #1

Есть прога, написана на delphi (моя), в общем при запуске прога не показывает главную форму, а при нажатии на сочетание клавиш показывает главную форму, так вот форма активна но ввод установлен на другое окно!? Но если хотя бы раз моё окно получало ввод, то после его скрытия оно появляеться с установленным вводом...
Так вот как этот самый ввод установить для случая, когда окно ещё не получало ни нажатий клавой ни мышкой... и в чём вообще дело?
ЗЫ SetForegroundWindow, SetFocus, SetActiveWindow не помогают... методы в delphi типа Activate, SetFocus, BringToFront тоже не помогают...



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 14 марта 2008 18:05
· Личное сообщение · #2

multiarc обясни поподробнее проблему
а вообще посмотри в свойствах формы activecontrol

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 18:13
· Личное сообщение · #3

А что должно быть в activecontrol в свойствах формы?
В общем есть хук, обрабатывающий нажатие на клавиатуру, в общем когда нажимаеться сочетание клавишь, то мы вызываем Form1.Show, Form1.Activate, Form1.Listbox1.SetFocus...
пробовал это делать в хуке, а пробовал в потоке формы, ну тоесть через посылку сообщения результат идентичный... форма появляеться, активируеться!! но ввод не утсановлен, тоесть мы нажимаем на клавиатуру и жмём получаеться в другом приложении, а именно там где был до этого фокус... И ещё ... у формы свойство fsTopMost, пробовал менять, результата не добился...



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 14 марта 2008 18:15
· Личное сообщение · #4

multiarc пишет:
А что должно быть в activecontrol в свойствах формы?

Listbox1

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 18:20
· Личное сообщение · #5

Stack пишет:
Listbox1

Так это чтобы не делать SetFocus на listbox... поставил, ессно ничё не изменилось...



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 14 марта 2008 19:10
· Личное сообщение · #6

Не заморачивайся, просто пошли этому своему ЛистБоксу сообщения WM_LBUTTONDOWN и WM_LBUTTONUP



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 14 марта 2008 19:21
· Личное сообщение · #7

я както в одной своей проге использовал чтото подобное скрывал главную форму из onshow при помощи cooltryicon и все титоп

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74





Ранг: 279.1 (наставник)
Активность: 0.160
Статус: Участник
wizard

Создано: 14 марта 2008 19:30
· Личное сообщение · #8

multiarc а как насчёт ActiveControl в главной форме ?

-----
Что один человек сделал , другой всегда сломать может...





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 19:43
· Личное сообщение · #9

MACKLIA пишет:
multiarc а как насчёт ActiveControl в главной форме ?

Я выше уже ответил, что проблема не разрешилась, да и вообще причём тут ActiveControl?
tihiy_grom пишет:
Не заморачивайся, просто пошли этому своему ЛистБоксу сообщения WM_LBUTTONDOWN и WM_LBUTTONUP

А не срабатывает ))
Show;
Activate;
SendMessage(listbox1.Handle,WM_LBUTTONDOWN,0,MakeLParam(form1.Left+lis tbox1.Left+5{1},Form1.Top+listbox1.Top+5{1}));
SendMessage(listbox1.Handle,WM_LBUTTONUP,0,MakeLParam(form1.Left+listb ox1.Left+5{1},Form1.Top+listbox1.Top+5{1}));

Stack пишет:
я както в одной своей проге использовал чтото подобное скрывал главную форму из onshow при помощи cooltryicon и все титоп

Так мне не скрыть надо )
cooltryicon??? и что это такое?



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 14 марта 2008 19:47
· Личное сообщение · #10

multiarc пишет:
SendMessage(listbox1.Handle,WM_LBUTTONDOWN,0,MakeLParam(form1.Left+lis tbox1.Left+5{1},Form1.Top+listbox1.Top+5{1}));
SendMessage(listbox1.Handle,WM_LBUTTONUP,0,MakeLParam(form1.Left+listb ox1.Left+5{1},Form1.Top+listbox1.Top+5{1}));

Чтож ты вытворяешь
надо так
SendMessage(listbox1.Handle,WM_LBUTTONDOWN,0,0);
SendMessage(listbox1.Handle,WM_LBUTTONUP,0,0);
Ты же хэндлу окна сообщение посылаешь, а не его координатам




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 19:54
· Личное сообщение · #11

tihiy_grom пишет:
Чтож ты вытворяешь

Так я и так и так делал... и не работает...
ЗЫ в мсдн просто про хендл не сказано ничё... вот так и написал...



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 14 марта 2008 20:02
· Личное сообщение · #12

На тот момент, когда ЛистБоксу посылаются сообщения - у тебя форма уже показана на экране? Точнее, из какой процедуры ты посылаешь сообщения? Выложи листинг краткий




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 20:09
· Личное сообщение · #13


procedure TForm1.Activatemsg(var msg:TMessage); {тут типа принимаеться сообщение WM_USER+1}
begin
Show;
Activate;
SendMessage(listbox1.Handle,WM_LBUTTONDOWN,0,0);
SendMessage(listbox1.Handle,WM_LBUTTONUP,0,0);
end;
function hookproc...
...
PostMessage(Form1.Handle,WM_USER+$1,0,0);

А принимаю сообщения затем, чтобы поток выполнения всех действий был поток формы (обработки сообщений), потому что например как пишет мелкософт, SetFocus не работает из других потоков...
Если вставить Application.ProcessMessages то ничё не поменяется...




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 20:09
· Личное сообщение · #14

И ещё...
Application.ShowMainForm:=false;
это перед
Application.Run;
чтобы форму не показывало...



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 14 марта 2008 20:10 · Поправил: Stack
· Личное сообщение · #15

[временно недоступно]

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 20:16
· Личное сообщение · #16

ничё я не удалял я просто не отпостил )
program PrKiller;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3},
Unit4 in 'Unit4.pas' {Form4},
Unit5 in 'Unit5.pas' {Form5},
Funcs in 'Funcs.pas';

{$R *.res}

begin
Application.Initialize;
Application.Title := 'Wat's going on?';
Application.ShowMainForm:=false;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Application.CreateForm(TForm4, Form4);
Application.CreateForm(TForm5, Form5);
Application.Run;
end.




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 14 марта 2008 20:30
· Личное сообщение · #17

multiarc
У меня к тебе предложение, кинь в личку мне свои исходники, погляжу что там у тебя, заодно может и подправлю что-нибудь




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 20:38
· Личное сообщение · #18

Подправлять особо нечего, потому что прога сильно не дописана, пока что вот на этой проблеме застрял... я кину сюда кусо Unit1.pas'а

...
type
TForm1 = class(TForm)
...
ListBox1: TListBox;
private
procedure Activatemsg(var msg:TMessage);message WM_USER+$1;
...
procedure TForm1.Activatemsg(var msg:TMessage);
begin
Show;
Activate;
SendMessage(listbox1.Handle,WM_LBUTTONDOWN,0,0);
SendMessage(listbox1.Handle,WM_LBUTTONUP,0,0);
if Listbox1.Items.Count>0 then
ListBox1.ItemIndex:=0;
end;

function hookproc(code:integer;wparam:dword;lparam:dword):integer;stdcall;
type
keystruct = record
vkCode:dword;
scanCode:dword;
flags:dword;
time:dword;
dwExtraInfo:pointer;
end;
const
k_l_ctrl=162;
k_r_ctrl=163;
k_l_shift=160;
k_r_shift=161;
k_tile=192;{"~"}
var
str:^keystruct;
begin
if code<0 then
Result:=CallNextHookEx(hook,code,wparam,lparam)
else
begin
str:=pointer(lparam);
if (wparam=WM_KEYUP) or (wparam=WM_SYSKEYUP) then
begin
if (str.vkCode=k_l_ctrl) or (str.vkCode=k_r_ctrl) then
control:=false;
if (str.vkCode=k_l_shift) or (str.vkCode=k_r_shift) then
shift:=false;
if str.vkCode=k_tile then
tile:=false;
end;
if (wparam=WM_KEYDOWN) or (wparam=WM_SYSKEYDOWN) then
begin
if (str.vkCode=k_l_ctrl) or (str.vkCode=k_r_ctrl) then
control:=true;
if (str.vkCode=k_l_shift) or (str.vkCode=k_r_shift) then
shift:=true;
if str.vkCode=k_tile then
tile:=true;
end;
if control and shift and tile then
begin
control:=false;
shift:=false;
tile:=false;
PostMessage(Form1.Handle,WM_USER+$1,0,0);
end;
Result:=0;
end;
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
...
hook:=SetWindowsHookEx(13{WH_KEYBOARD_LL},@hookproc,HInstance,0);
...
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
...
UnhookWindowsHookEx(Hook);
...
end;




Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 14 марта 2008 20:54
· Личное сообщение · #19

multiarc
hook надо устонавливать из dll
И может использовать registerhotkey вместо хука
час исходники накатаю

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 21:01
· Личное сообщение · #20

вообще-то такому типу хука абсолютно пох откуда он установлен ... так вроде даже в мсдн написано...
RegisterHotKey ну может и так... но вот вопрос что надёжнее и быстрее... на низком уровне клаву щупать, или надеяться на механизм винды? я попробую потом и без хуков, но ведь проблема то не в этом...



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 14 марта 2008 21:05
· Личное сообщение · #21

multiarc
Не поверишь, но у меня всё работает с твоим текстом

И точно так же всё работает, если убрать посылку сообщений ЛистБоксу и в обработчике FormShow написать ActiveControl:=ListBox1;




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 21:08
· Личное сообщение · #22

что значит работает? тоесть ты нажимаешь комбинацию, окно появляеться и если ты по нему мышкой не щёлкаешь, то типа фокус на форме?? потом когда закроешь, то оно то так, а сразу нет... ну у меня по крайней мере...



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 14 марта 2008 21:17 · Поправил: Stack
· Личное сообщение · #23

вот пример с registerhotkey
сворачиваешь окно направляешь мышь на какоето окно и нажимаешь ctrl+f1

f36f_14.03.2008_CRACKLAB.rU.tgz - Editor.exe

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 14 марта 2008 21:28
· Личное сообщение · #24

дошло в чём там дело ...
Ты когда нажимаешь кнопки на клаве, форма конечно появляется - это гуд. Но когда ты кнопки отпускаешь - они отпускаются именно в том окне, в котором ты их нажимал, поэтому оно снова становится активным.

Как самый простой вариант, можно сделать так - ставим таймер на форму с каким нибудь небольшим интервалом и пишем что-то типа такого

procedure TForm1.FormShow(Sender: TObject);
begin
timer1.enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ActiveControl:=ListBox1;
SendMessage(Form1.Handle,WM_LBUTTONDOWN,0,0);
SendMessage(Form1.Handle,WM_LBUTTONUP,0,0);
SendMessage(listbox1.Handle,WM_LBUTTONDOWN,0,0);
SendMessage(listbox1.Handle,WM_LBUTTONUP,0,0);
timer1.Enabled:=false;
end;





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 21:33
· Личное сообщение · #25

Ага... а почему тогда потом когда второй раз показываем окно, то оно нормально выделяеться? тут походу не в том дело... вот если например убрать Application.ShowMainForm:=false; и поставить скрывать окно в OnPaint например, то окно спрячеться и потом появиться нормально и фокус ввода будет именно там где надо... Короче прочитай ещё раз первый пост...



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 14 марта 2008 23:15
· Личное сообщение · #26

Я понял

Ну в общем, как-то так получилось
1. В FormCreate добавляем SetWindowPos(Form1.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE or SWP_HIDEWINDOW);
2. В TForm1.Activatemsg добавляем SetActiveWindow(Application.Handle);




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 марта 2008 23:52
· Личное сообщение · #27

И как ты дошёл до этого ??
фишка то в чём?



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 14 марта 2008 23:58
· Личное сообщение · #28

Фиг знает, но почему-то SetActiveWindow не активизирует окно, если у него HWND_TOPMOST не стоит




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 15 марта 2008 00:13
· Личное сообщение · #29

tihiy_grom пишет:
Фиг знает, но почему-то SetActiveWindow не активизирует окно, если у него HWND_TOPMOST не стоит

так а ты в свойствах формы поставь в свойстве FormStyle fsStayOnTop и всё равно надо эту строку дописывать... может народ чё подскажет?


 eXeL@B —› Программирование —› Активное окно
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати