Имя: Пароль:
IT
 
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
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;
}
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.