Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить заголовок окна по координате курсора, Курсор находится в области окна 
V
    Опции темы
FiMa1
Дата 21.6.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: нет
Всего: 6



Доброго здравия, друзья!

У меня, пожалуй, возникла довольно тривиальная проблема, но все же не могли бы вы помочь в ее решении. Мне нужно получить заголовок (caption) окна, то есть тот текст, что находится в строке заголовка (title bar) окна. Я попробовал использовать приведенные ниже API функции, но не добился ожидаемого результата. Для примера, находясь в области редактирования текста в Notepad, нужно получить заголовок окна.
Код

void __fastcall TForm1::Timer1Timer(TObject *Sender) {
    TPoint cPt;
    char buf[256];

    GetCursorPos(&cPt); // получить текущую позицию курсора
    HWND h = WindowFromPoint(cPt); // получить handle окна по позиции курсора
    GetWindowText(h, buf, 256); // получить текст заголовка окна
    Label1->Caption = AnsiString(buf); // НЕ ВЫВОДИТ НИЧЕГО ДЛЯ ТОГО ЖЕ NOTEPAD!

//---------------------------------
    GetClassName(h, buf, 256); // получить имя класса окна (до кучи)
    Label2->Caption = AnsiString(buf); // ВЫВОДИТ 'Edit' ДЛЯ NOTEPAD.

    HWND hFgWnd = GetForegroundWindow(); // получить текущее активное окно
    TRect rect;
    GetWindowRect(hFgWnd, &rect); // получить его координаты

//---------------------------------
    TPoint p;
    p.x = rect.left + 5; // +5 - небольшое смещение
    p.y = rect.top + 5; // +5 - небольшое смещение
    // получить заголок, установив его позицию явно...
    GetWindowText(WindowFromPoint(p), buf, 256);
    Label3->Caption = AnsiString(buf); // ВЫВОДИТ ЗАГОЛОВОК ОКНА, ЕСЛИ ОН
                                       // ПРЕДУСМОТРЕН ФАКТИЧЕСКИ ДЛЯ ПРИЛОЖЕНИЯ
                                       // БЫВАЮТ ОКНА И БЕЗ ОБЛАСТИ TITLE BAR - ТОГДА НАПЕЧАТАЕТСЯ ЕРУНДА...
}

Как вы понимаете, последний вариант никак не подходит, первый тоже не дает положительного результата, т.к. "if the specified window is a control, the text of the control is copied"...

Если кто-нибудь сталкивался с подобным или знает более "конкретную" API функцию, подскажите, пожалуйста. Я пока не нашел... Заранее спасибо за помощь!

Для удобства приведу также здесь описания из MSDN для использованных мной API функций:
Цитата

The WindowFromPoint function retrieves a handle to the window that contains the specified point. 

The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application.

The GetClassName method returns the fully qualified name of the class represented by this type descriptor.

The GetWindowRect function retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. 



Это сообщение отредактировал(а) FiMa1 - 21.6.2008, 19:34
PM   Вверх
586
Дата 21.6.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Код
HWND GetMainWindow(HWND hWnd)
{
    while(true)
    {
        if(GetWindowLong(hWnd, GWL_STYLE) & WS_CAPTION)
            return hWnd;

        if(HWND w = GetParent(hWnd)) {
            hWnd = w;
        } else {
            return hWnd;
        }
    }
}

PM   Вверх
FiMa1
Дата 21.6.2008, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: нет
Всего: 6



586, а я, извините, не понял чем это может помочь моей проблеме...
Проверяем есть ли у окна title bar и если есть возвращаем его хэндл. Если у окна нет title bar, то получаем хэндл на указанное родительское окно, возвращаем этот хэндл, ну и т.д. А как мне получить caption - 'Безымянный - Блокнот'? Я, наверняка, что-то не понял, объясните, пожалуйста  smile .

Это сообщение отредактировал(а) FiMa1 - 21.6.2008, 20:12
PM   Вверх
586
Дата 21.6.2008, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Заголовок "Безымянный - Блокнот" у родительского окна. А эдит (сам редактор блокнота) - это дочернее окно. Нужно родительское окно найти.
Код
HWND hWnd = WindowFromPoint(&pt);  // некое окно (толи имеющее заголовок, толи нет)
hWnd = GetMainWindow(hWnd);     // ищется родительское окно с заголовком, если окно не найдено, возвращается родительское окно без заголовка
char buf[260];
GetWindowText(hWnd, buf, 260);     // получаем заголовок
Caption = buf;

Пример:
Код
bool bDown = false;


HWND GetMainWindow(HWND hWnd)
{
    while(true)
    {
        if(GetWindowLong(hWnd, GWL_STYLE) & WS_CAPTION)
            return hWnd;
        if(HWND w = GetParent(hWnd)) {
            hWnd = w;
        } else {
            return hWnd;
        }
    }
}

void __fastcall TForm1::Button1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    bDown = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1MouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    bDown = false;    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
    if(!bDown) return;

    POINT pt;
    ::GetCursorPos(&pt);
    HWND hWnd = GetMainWindow(WindowFromPoint(pt));
    char buf[260];
    GetWindowText(hWnd, buf, 260);
    Caption = buf;
}

Писал с таким учётом, что можно распознать MDI окна.

Это сообщение отредактировал(а) 586 - 21.6.2008, 20:37
PM   Вверх
FiMa1
Дата 21.6.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: нет
Всего: 6



Цитата(586 @ 21.6.2008,  20:37)
Заголовок "Безымянный - Блокнот" у родительского окна......

586smile . Вы мне просто очень помогли и выручили +1!

Это сообщение отредактировал(а) FiMa1 - 23.6.2008, 09:13
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0689 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.