Фокус ввода в чужом процессе
От: Dr.Golova  
Дата: 19.06.02 21:52
Оценка:
Как можно получить хэндл окошка в котором сейчас идет ввод, по типу GetFocus() но не обязательно для текущего процесса. Расставлять хуки и прочую мешуру чтоб попасть в активный процесс очень не хочется.
Re: Фокус ввода в чужом процессе
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 20.06.02 01:40
Оценка:
Здравствуйте Dr.Golova, Вы писали:

D.G>Как можно получить хэндл окошка в котором сейчас идет ввод, по типу GetFocus() но не обязательно для текущего процесса. Расставлять хуки и прочую мешуру чтоб попасть в активный процесс очень не хочется.


HWND GetForegroundWindow(VOID)


The GetForegroundWindow function returns a handle to the foreground window (the window with which the user is currently working).
Re[2]: Фокус ввода в чужом процессе
От: Аноним  
Дата: 20.06.02 10:26
Оценка:
Здравствуйте Odi$$ey, Вы писали:

O$>Здравствуйте Dr.Golova, Вы писали:

D.G>>Как можно получить хэндл окошка в котором сейчас идет ввод, по типу GetFocus() но не обязательно для текущего процесса. Расставлять хуки и прочую мешуру чтоб попасть в активный процесс очень не хочется.


O$>
O$>HWND GetForegroundWindow(VOID)
O$>


O$>The GetForegroundWindow function returns a handle to the foreground window (the window with which the user is currently working).

Звезды мне подсказывают что это не катит — так я получу максимум родительское окно, а если ввод идет в одно из дочерних (типа EditBox) — мне придется только догыдываться.
Re[3]: Фокус ввода в чужом процессе
От: Максим Алексейкин Россия  
Дата: 20.06.02 11:22
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Odi$$ey, Вы писали:


O$>>Здравствуйте Dr.Golova, Вы писали:

D.G>>>Как можно получить хэндл окошка в котором сейчас идет ввод, по типу GetFocus() но не обязательно для текущего процесса. Расставлять хуки и прочую мешуру чтоб попасть в активный процесс очень не хочется.


O$>>
O$>>HWND GetForegroundWindow(VOID)
O$>>


O$>>The GetForegroundWindow function returns a handle to the foreground window (the window with which the user is currently working).

А>Звезды мне подсказывают что это не катит — так я получу максимум родительское окно, а если ввод идет в одно из дочерних (типа EditBox) — мне придется только догыдываться.



После получения родительского окна придется спускаться по иерархии окон.
Когдато я это делал, кажется при помощи EnumChildWindows
Успехов
ICQ #311116826
Re[4]: Фокус ввода в чужом процессе
От: Dr.Golova  
Дата: 20.06.02 12:26
Оценка:
Здравствуйте Максим Алексейкин, Вы писали:

МА>Здравствуйте Аноним, Вы писали:


А>>Здравствуйте Odi$$ey, Вы писали:


O$>>>Здравствуйте Dr.Golova, Вы писали:

D.G>>>>Как можно получить хэндл окошка в котором сейчас идет ввод, по типу GetFocus() но не обязательно для текущего процесса. Расставлять хуки и прочую мешуру чтоб попасть в активный процесс очень не хочется.


O$>>>
O$>>>HWND GetForegroundWindow(VOID)
O$>>>


O$>>>The GetForegroundWindow function returns a handle to the foreground window (the window with which the user is currently working).

А>>Звезды мне подсказывают что это не катит — так я получу максимум родительское окно, а если ввод идет в одно из дочерних (типа EditBox) — мне придется только догыдываться.



МА>После получения родительского окна придется спускаться по иерархии окон.

МА>Когдато я это делал, кажется при помощи EnumChildWindows
МА>Успехов :)

И как же потом имея список дочерних окон определить в каком именно из них находится фокус ввода?
Re[5]: Фокус ввода в чужом процессе
От: Максим Алексейкин Россия  
Дата: 20.06.02 13:27
Оценка:
Здравствуйте Dr.Golova, Вы писали:

D.G>И как же потом имея список дочерних окон определить в каком именно из них находится фокус ввода?


Попробуй что-нибудь вроде этого:
BOOL __stdcall EnumCallback (HWND hwnd, LPARAM lParam)
{
   HWND      *phwnd = (HWND*)lParam;
   WINDOWINFO wi;

   ::GetWindowInfo (hwnd, &wi);

   if ( wi.dwWindowStatus == WS_ACTIVECAPTION )
   {
      *phwnd = hwnd;
      return FALSE;
   }
   // продолжаем перечислять
   return TRUE;
}

HWND GetFocusedWindow ( HWND hParent )
{
   HWND hWnd = NULL;

   ::EnumChildWindows ( hParent, EnumCallback, (LPARAM)&hWnd );

   return hWnd;
}
ICQ #311116826
Re[6]: Фокус ввода в чужом процессе
От: Аноним  
Дата: 21.06.02 04:13
Оценка:
D.G>>И как же потом имея список дочерних окон определить в каком именно из них находится фокус ввода?

МА>Попробуй что-нибудь вроде этого:

МА>BOOL __stdcall EnumCallback (HWND hwnd, LPARAM lParam)

Все конечно хорошо, даже учитывая что такой код работает при WINVER >= 0500 (читай 95 и NT SP2 уже не канают). Одно плохо — WS_ACTIVECAPTION вовсе не означает что фокус ввода в этом окошке, например в MSDEV (тот что IDE от VC++) таких окошек оказалось не меньше десятка, причем того в котором был фокус среди них небыло :) Видимо придется таки внедряться в чужой процесс и вызывать GetFocus() а так не хотелось таскать лишнюю длл :(
Re[7]: Вах, решение
От: Dr.Golova  
Дата: 21.06.02 05:01
Оценка: 12 (2)
  DWORD hThrdTo = GetWindowThreadProcessId(hWnd, NULL);
  DWORD hThrd   = GetCurrentThreadId();
  AttachThreadInput(hThrd, hThrdTo, TRUE);
  HWND hFocusWnd = GetFocus();
  AttachThreadInput(hThrd, hThrdTo, FALSE);


И вот ходил ведь вокруг этого AttachThreadInput() и не замечал gока носом не ткнули :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.