Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2013, 17:04   #1
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию Отловить активное окно

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

Код:
var
  H: THandle;  //Дескриптор
  str: String;
  buff: PChar;
  WindowRect: TRect; // Область окна
begin
 H := GetForegroundWindow;  //Получаем дескриптори на активное окно
 str := GetWndTxt(H);
 Memo1.Text := str;

 GetWindowRect(H, WindowRect);
 Label2.Caption:=Format('top=%d Left=%d Width=%d Height=%d',[WindowRect.Top, WindowRect.Left,
                         WindowRect.Right-WindowRect.left, WindowRect.Bottom-WindowRect.Top]);
ivt22 вне форума Ответить с цитированием
Старый 06.11.2013, 19:54   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

GetWindow(0,GW_HWNDFIRST)
не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.11.2013, 13:08   #3
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
GetWindow(0,GW_HWNDFIRST)
не?
Не че-то вообще никаких окон не находит, я вот так написал:

Код:
function GetWndTxt(H: HWND): String;
var
Nm: Array [0 .. 255] of Char;
begin
  GetWindowText(H, Nm, 255);
  RESULT := String(Nm);
end;

procedure TForm4.Timer1Timer(Sender: TObject);
var
  H: THandle;  //Дескриптор
  str: String;
  buff: PChar;
  WindowRect: TRect; // Область окна
begin
 H := GetWindow(0,GW_HWNDFIRST);  //Получаем дескриптори на активное окно
 str := GetWndTxt(H);
 edit1.Text := str;
end;
ivt22 вне форума Ответить с цитированием
Старый 07.11.2013, 13:12   #4
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Цитата:
Значит EnumWindows +

GetWindowInfo и

выполнять поиск по

стилям WS_DLGFRAME,

WS_EX_TOPMOST
Мне вот такую штуку посоветовали, но я пока не могу тут разобраться, может у кого примеры есть?
ivt22 вне форума Ответить с цитированием
Старый 07.11.2013, 13:15   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Пример от меня: http://www.programmersforum.ru/showt...?t=9066&page=2
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.11.2013, 13:19   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
GetWindow(0,GW_HWNDFIRST)
не?
Наверно вместо 0 надо вставить GetDesktopWindow()
waleri вне форума Ответить с цитированием
Старый 07.11.2013, 13:25   #7
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Наверно вместо 0 надо вставить GetDesktopWindow()
Не получилось, edit все равно пустой((
ivt22 вне форума Ответить с цитированием
Старый 07.11.2013, 13:41   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

отладкой проверьте находит ли хэндл.
да и окно могло быть без текста.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.11.2013, 13:43   #9
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
отладкой проверьте находит ли хэндл.
да и окно могло быть без текста.
Окно с текстом 100 процентов. Функция GetForegroundWindow видит этот текст, просто нужно мышкой щёлкать по окну
ivt22 вне форума Ответить с цитированием
Старый 07.11.2013, 14:39   #10
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Чего-то ничего не получается... Вот смотрите есть на форме Таймер, настроенный на 1 милисекунду, и Edit таймер следит за окошечками и если появляется окно поверх других, необходимо получить его дескриптор, ну и по нему записать имя окна в Edit. У меня получается так сделать, но только если по этому окну щёлкнуть мышкой... А по другому никак...
ivt22 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отловить активное окно ivt22 Win Api 10 13.10.2013 12:44
как узнать, что окно активное/не активное beegl Общие вопросы Delphi 6 01.01.2013 22:48
Активное окно Messir_Leonard Win Api 4 22.04.2008 19:25
Активное окно MadReason Win Api 12 10.01.2008 17:44
Предыдущее активное окно martinz Win Api 3 25.11.2007 15:02