|
WinAPI. Получить handle элемента окна с фокусом ввода. | ☑ | ||
---|---|---|---|---|
0
H A D G E H O G s
27.06.13
✎
11:28
|
День добрый.
GetFocus() не предлагать, он отрабатывает для вызывающего приложения. Мне нужно получить дескриптор кнопки, которая обведена пунктирной линией и которая нажмется при нажатии ENTER. Есть события WM_SetFocus, WM_KillFocus. WM_GetFocus нет :-( Ben, i need help! |
|||
1
Кирпич
27.06.13
✎
11:31
|
подожди. щас в интернете поглядим. не уходи.
|
|||
2
HeroShima
27.06.13
✎
11:33
|
Я уже посмотрел
|
|||
3
Кирпич
27.06.13
✎
11:35
|
а я еще не понял чо он хочет
|
|||
4
Кирпич
27.06.13
✎
11:36
|
" получить дескриптор кнопки, которая обведена пунктирной линией " другого приложения?
|
|||
5
H A D G E H O G s
27.06.13
✎
11:38
|
(4) Другого.
|
|||
6
H A D G E H O G s
27.06.13
✎
11:39
|
CreateRemoteThread конечно есть, но чето я очкую.
|
|||
7
HeroShima
27.06.13
✎
11:39
|
Значит я правильно смотрел.
|
|||
8
Кирпич
27.06.13
✎
11:41
|
AttachThreadInput смотрел?
|
|||
9
HeroShima
27.06.13
✎
11:46
|
(8) а он там каким боком?
http://www.firststeps.ru/mfc/winapi/r.php?1 http://windowsapi.ru/вспомогательные-api-функции-работы-с-окн/ |
|||
10
Кирпич
27.06.13
✎
11:48
|
(9) я не знаю каким он там боком, но на нем написано "Attach Thread Input"
|
|||
11
H A D G E H O G s
27.06.13
✎
11:51
|
IsWindowEnabled() - чето похоже.
(10) Как то я не уверен, что если я объединю 2 потока на ввод - я смогу получить фокус ввода их объединения. |
|||
12
H A D G E H O G s
27.06.13
✎
11:51
|
Функция IsWindowEnabled
Описание: function IsWindowEnabled(Wnd: HWnd): Bool; Опpеделяет, является ли окно pазpешенным для ввода с мыши и с клавиатуpы. Мимо! |
|||
13
Jaap Vduul
27.06.13
✎
11:57
|
||||
14
Кирпич
27.06.13
✎
11:57
|
(11) ну я не сам выдумал. я в интернете прочитал. думаю стоит попробовать.
"Окна, созданные в разных потоках обычно обрабатывают ввод данных независимо друг от друга. То есть они имеют свои собственные состояния ввода данных (фокус, активность, окна захвата, состояние клавиши, состояние очереди и так далее), и они не синхронизированы с обработкой ввода данных других потоков. При помощи использования функции AttachThreadInput, поток может подключать свою обработку ввода данных к другому потоку. Это к тому же позволяет потокам совместно использовать их статусы ввода данных, так что они могут вызывать функцию SetFocus, чтобы установить фокус клавиатуры в окне другого потока. Это также позволяет потокам получить информацию о состоянии клавиши. Эти способности обычно невозможны." http://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_attachthreadinput.htm |
|||
15
HeroShima
27.06.13
✎
12:00
|
(8) GetFocus function
Retrieves the handle to the window that has the keyboard focus, if the window is attached to the calling thread's message queue ? |
|||
16
Jaap Vduul
27.06.13
✎
12:05
|
(15)
Вот что нам говорит Рихтер (ссылка на статью в (13)): ...every thread is given its own local-input state. Each thread thinks that either it is receiving hardware messages or no thread in the system is receiving these messages. So, when your thread calls GetActiveWindow, the function returns a valid window handle only if one of the windows that your thread created is active. If another thread has created the now-active window, your thread's call to GetActiveWindow returns NULL. The same is true for the GetFocus and GetCapture functions. However, the Win32® API contains a new function called AttachThreadInput that allows you to connect the local-input states of two threads. |
|||
17
Кирпич
27.06.13
✎
12:06
|
(15) ну я про это и пишу. приаттачить input другого потока к своему и потом вызвать GetFocus.
|
|||
18
H A D G E H O G s
27.06.13
✎
12:10
|
(17) Счаст попробую.
|
|||
19
Кирпич
27.06.13
✎
12:11
|
я тоже щас попробую
|
|||
20
Кирпич
27.06.13
✎
12:20
|
работает
|
|||
21
Кирпич
27.06.13
✎
12:24
|
var
h : HWND; P : array [0..32] of char; d, d2 : DWORD; begin h := FindWindow(nil,'Form100500'); if h <> 0 then begin d := GetWindowThreadProcessId(h, nil); d2 := GetWindowThreadProcessId(self.Handle, nil); AttachThreadInput(d,d2,True); h := GetFocus(); AttachThreadInput(d,d2,False); GetWindowText(h,P,32); Memo1.Lines.Add(P); end; end; |
|||
22
HeroShima
27.06.13
✎
12:26
|
(21) у меня бы антивирусник выругался
|
|||
23
Кирпич
27.06.13
✎
12:27
|
(22) ну у тебя то да. у меня не ругается
|
|||
24
H A D G E H O G s
27.06.13
✎
12:30
|
Ясно. Спасибо.
|
|||
25
H A D G E H O G s
27.06.13
✎
12:30
|
Отправка событий из стороннего приложения в 1С считается нарушениям чего-нибудь?
|
|||
26
H A D G E H O G s
27.06.13
✎
12:31
|
Без внедрения потоков, подгрузки библиотек, сплайсинга, и.т.д.
Просто тупо WinAPI. |
|||
27
Кирпич
27.06.13
✎
12:33
|
ну windows же шлет сообщения всем программам. 1с пока не засудила за это микрасофт
|
|||
28
Кирпич
27.06.13
✎
12:34
|
Когда ты жмешь на кнопку в 1с, windows отправляет сообщение 1с, что ей нажали кнопку. криминала нет. продолжайте работать.
|
|||
29
Кирпич
27.06.13
✎
12:36
|
как с этим живет HeroShima, я не знаю. у него на каждый клик срабатывает антивирус наверное. бедный мальчик.
|
|||
30
HeroShima
27.06.13
✎
12:48
|
(29) Чеж на каждый - только на первый для приложения.
|
|||
31
Кирпич
27.06.13
✎
12:52
|
(30) А какой щас антивирус вообще модный?
|
|||
32
HeroShima
27.06.13
✎
12:53
|
(31) не знаю
|
|||
33
Кирпич
27.06.13
✎
12:54
|
у нас админ поставил какой то gdata. такое впечатление, что этот антивирус думает, что компьютеры существуют только для того, чтобы искать на них вирусы. тормоза дикие. работать просто невозможно.
|
|||
34
HeroShima
27.06.13
✎
12:56
|
по хорошему, нужно дать по шее всем хацкерам и жить без антивирусника, ибо любое упреждение - ограничение своей свободы за своим же компом. у меня только проактивка работает. гадость голыми руками стараюсь нехватать.
|
|||
35
HeroShima
27.06.13
✎
12:56
|
*не хватать
|
|||
36
Кирпич
27.06.13
✎
13:00
|
H A D G E H O G s, а ты чо там удумал наваять? Будет фурор? ;)
|
|||
37
Кирпич
27.06.13
✎
13:02
|
теперь управлять кнопкой "СДЕЛАТЬ ВСЁ КАК МНЕ НАДО" можно из стороннего приложения?
|
|||
38
H A D G E H O G s
27.06.13
✎
13:05
|
В помощь труженникам обработки 00165_2_82.epf
|
|||
39
Кирпич
27.06.13
✎
13:07
|
(38) а я уж думал снегопат какой замутил
|
|||
40
H A D G E H O G s
27.06.13
✎
14:46
|
Хосподя, как Инфостарт закомлексовался, уж и не разместишь.
|
|||
41
Ковычки
27.06.13
✎
14:49
|
коллекцию контролов не предлагать ?
|
|||
42
H A D G E H O G s
27.06.13
✎
14:51
|
||||
43
HeroShima
27.06.13
✎
15:39
|
Хоть дельфины ещё не на кьюте.
|
|||
44
ЧеловекДуши
27.06.13
✎
15:40
|
(42) А оно на 8-ке работает?
Там уже не совсем тот механизм окон используется от виндовс, как обычно при 7.7. |
|||
45
Nexux
27.06.13
✎
15:45
|
покаж сырцы
|
|||
46
H A D G E H O G s
27.06.13
✎
15:46
|
(44) Все тот. Сообщения от Windы то ловятся.
|
|||
47
ХомаБрут
27.06.13
✎
15:55
|
от завидую я людЯм. есть время на развлечения
|
|||
48
H A D G E H O G s
27.06.13
✎
16:08
|
(47) Это развлечение съэкономит кучу времени, уходящего на бессмысленные и беспощадные действия.
|
|||
49
Torquader
28.06.13
✎
00:01
|
Активное окно (не элемент управления) GetForegroundWindow(VOID)
Дальше перебираем его дочерние окна (можем получить массив). Потом желательно узнать их потоки (тех, что нас интересуют) GetWindowThreadProcessId ну и после попытаться сделать AttachThreadInput к нужному потоку. P.S. если нужно "изобразить" нажатие какой-то кнопки или ввод в какое-то поле, то можно просто этому окну слать сообщения ввода через SendMessage - чаще всего никто не проверяет, что сообщение прислано - и все формы работают. |
|||
50
H A D G E H O G s
28.06.13
✎
00:05
|
Отстрелялась связочка:
AttachThreadInput(GetCurrentThreadId(), Pid_HWND^.PID, true); OldForegroundWindow:=GetForegroundWindow(); SetActiveWindow(HWND); HWNDFocus := GetFocus(); AttachThreadInput(GetCurrentThreadId(), Pid_HWND^.PID, false); SetForegroundWindow(OldForegroundWindow); Обратите внимание на SetActiveWindow(HWND); вместо SetForegroundWindow(HWND); :-) Вот така фигня, малята. |
|||
51
HeroShima
28.06.13
✎
09:40
|
||||
52
ЧеловекДуши
28.06.13
✎
09:51
|
(47) А жизнь, она по твоему для чего? ;)
|
|||
53
HeroShima
01.07.13
✎
19:37
|
(50) видим )
L004AEF60( _unknown_ __ebx, // r1 _unknown_ __edi, // r4 _unknown_ __esi, // r5 _unknown_ __eflags, // r9 struct HWND__* _a4, // _cfa_4 intOrPtr _a8 // _cfa_8 ) { struct HWND__* _v8; // _cfa_fffffff8 struct HWND__* _v12; // _cfa_fffffff4 intOrPtr _v16; // _cfa_fffffff0 struct HWND__* _v20; // _cfa_ffffffec short _v532; // _cfa_fffffdec struct HWND__* _v536; // _cfa_fffffde8 char _v540; // _cfa_fffffde4 struct HWND__* _t38; // _t38 intOrPtr _t41; // _t41 intOrPtr _t47; // _t47 intOrPtr _t67; // _t67 struct HWND__* _t71; // _t71 struct HWND__* _t73; // _t73 struct HWND__* _t74; // _t74 _unknown_ _t75; // _t75 intOrPtr _t76; // _t76 _unknown_ _t77; // _t77 _t77 = __eflags; _push(_t75); _t76 = __esp; __esp = __esp + -536; _push(__ebx); _push(__esi); _push(__edi); _v540 = 0; _v536 = 0; _t71 = _a4; _push(_t76); _push(4911454); _push( *fs:eax]); *fs:eax] = __esp; _v16 = _a8; GetClassNameW(_t71, &_v532, 512); __ecx = 256; L00406A20(_t77); _t67 = 4911484; L00406EF8(4911484); if(_t77 == 0) { L2: *4973320 = 1; SendMessageW(_t71, 16, 0, 0); _push(100); L004175DC(); if(IsWindow(_t71) == 0) { L14: _push(100); L004175DC(); if(IsWindow(_t71) != 0) { *4973320 = 0; } L16: _pop(__edx); _pop(__ecx); _pop(__ecx); *fs:eax] = _t67; _push(4911461); L00406830(); return &_v540; } _t38 = FindWindowExW(_t71, 0, 4911560, 0); if(_t38 == 0) { goto L14; } _v12 = FindWindowExW(_t38, 0, 4911604, 0); if(_v12 == 0) { goto L14; } _t73 = 0; _push(255); _t41 = *_v16; _push(_t41); L0040B11C(); _push(_t41); AttachThreadInput(); _v20 = GetForegroundWindow(); SetActiveWindow(_t71); _v8 = GetFocus(); _push(0); _t47 = *_v16; _push(_t47); L0040B11C(); _push(_t47); AttachThreadInput(); SetForegroundWindow(_v20); if(_v8 == 0) { L10: if(IsWindow(_t71) == 0) { goto L16; } _t74 = 0; while(1) { _t74 = FindWindowExW(_v12, _t74, 4911604, 0); if(_t74 == 0) { goto L14; } SendMessageW(_t74, 256, 13, 1835009); _push(100); L004175DC(); if(IsWindow(_t71) != 0) { continue; } goto L14; } goto L14; } else { goto L6; } while(1) { L6: _t73 = FindWindowExW(_v12, _t73, 4911604, 0); if(_t73 == 0) { goto L10; } if(_t73 == _v8) { SendMessageW(_t73, 256, 13, 1835009); } _push(100); L004175DC(); if(IsWindow(_t71) != 0) { continue; } else { goto L10; } } goto L10; } __ecx = 256; L00406A20(_t77); _t67 = 4911544; L00406EF8(4911544); if(_t77 != 0) { goto L16; } goto L2; } |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |