Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Название окон


Автор: Santilka85 18.6.2007, 10:08
Подскажите, пожалуйста, как написать цикл на С++, который перебирает ВСЕ окна и внутри цикла записывает заголовок окна в переменную?
если можно, приведите, пожалуйста пример..
я это представляю примерно так:

for (.....)
  {
     ...//искать окно 
     ...//ивлечь заголовок
     txt=[заголовок окна];
     ShowMessage ("Найдено окно --->"+txt);
  }
ShowMessage ("Больше окон нет.");

Автор: SenkraD 18.6.2007, 10:57
Вот пример по изменению заголовков всех окон, бередаль думаю сам сможеш

Код

// Раз "колбек"
BOOL CALLBACK EnumChildWnd( HWND hwnd, LPARAM lParam)
{
    SendMessage(hwnd, WM_SETTEXT, 0,LPARAM(LPCTSTR("I See You")));
    return TRUE;
}

// Два "колбек"
BOOL CALLBACK EnumWindowsWnd(HWND hwnd,    LPARAM lParam)
{
    SendMessage(hwnd, WM_SETTEXT, 0,LPARAM(LPCTSTR("I See You")));
    EnumChildWindows(hwnd,&EnumChildWnd,0);
    return TRUE;
}

// Вот вызов

EnumWindows(&EnumWindowsWnd, 0);

Автор: Santilka85 18.6.2007, 11:14
не получилось, можно по подробней, что где описать надо?

ерор:

[C++ Error] Unit1.cpp(230): E2034 Cannot convert 'int (__stdcall *)(void *,long)' to 'int (__stdcall *)()'
[C++ Error] Unit1.cpp(230): E2342 Type mismatch in parameter 'lpEnumFunc' (wanted 'int (__stdcall *)()', got 'int (__stdcall *)(void *,long)')
[C++ Error] Unit1.cpp(251): E2034 Cannot convert 'int (__stdcall * (_closure )(void *,long))(void *,long)' to 'int (__stdcall *)()'
[C++ Error] Unit1.cpp(251): E2342 Type mismatch in parameter 'lpEnumFunc' (wanted 'int (__stdcall *)()', got 'int (__stdcall * (_closure )(void *,long))(void *,long)')

Автор: Rodman 18.6.2007, 11:37
окон твоего приложения или всех открытых на машине???

Автор: Santilka85 18.6.2007, 11:43
Мне нужно чтоб заголовки ВСЕХ ОТКРЫТЫХ  на машине "пробежались" через одну переменную в цикле.

Автор: SenkraD 18.6.2007, 11:44
Вот тебе твоя версия.  Кладён на форму TMemo (Memo1), TButton(Button1) и пишеш так, при чём в таком же порядке
Код

String g_strParentWindowName;
//---------------------------------------------------------------------------
BOOL CALLBACK EnumChildWnd( HWND hwnd, LPARAM lParam)
{
    SendMessage(hwnd, WM_SETTEXT, 0,LPARAM(LPCTSTR("I See You")));

    char lpWndText[256];

    GetWindowText(hwnd, lpWndText, 256);
    Form1->Memo1->Lines->Add(g_strParentWindowName + String(lpWndText));

    return TRUE;
}

//---------------------------------------------------------------------------
BOOL CALLBACK EnumWindowsWnd(HWND hwnd, LPARAM lParam)
{
    SendMessage(hwnd, WM_SETTEXT, 0,LPARAM(LPCTSTR("I See You")));
    char lpWndText[256];

    GetWindowText(hwnd, lpWndText, 256);
    Form1->Memo1->Lines->Add(lpWndText);
    g_strParentWindowName.sprintf("%s->", lpWndText);
    EnumChildWindows(hwnd, (WNDENUMPROC)&EnumChildWnd,0);
    Form1->Memo1->Lines->Add("---------------------------------------");

    return TRUE;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Memo1->Lines->Clear();
    EnumWindows((WNDENUMPROC)&EnumWindowsWnd, 0);
}


Тебе это нужно было?

Автор: Santilka85 18.6.2007, 12:02
Ну примерно да, только я не понял ГДЕ текущий заголовок извлекается, я только понял где он задаётся..

Где можно вставить ShowMessage() чтобы в этой месаге увидеть у КАКОГО ОКНА сейчас изменится заголовок?

Автор: SenkraD 18.6.2007, 12:16
Santilka85, ну строку SendMessage(hwnd, WM_SETTEXT, 0,LPARAM(LPCTSTR("I See You"))) закоменьть. Эт я немного лоханулся )))
А текущий заголовоек получается вот так:
Код

char lpWndText[256];    // Буфер под название окна

GetWindowText(
    hwnd,                   // Хендл окна
    lpWndText,           // Буфер в который запишется название окна
    sizeof lpWndText  // Максимальное количество символов, которое нужно считать
);

Автор: Santilka85 18.6.2007, 12:27
Огромное Человеческое спасибо!!! кажись заработало smile

Автор: Santilka85 18.6.2007, 12:53
А вот маленький вопросик, почему в ListBox записывается много пустых строк?? (я вместо Memo ListBox сделал)??

Автор: SenkraD 18.6.2007, 13:18
Santilka85, потому что у окна может не быть заголовка или заговово равен пустой строке!!!

Автор: Klin 18.6.2007, 14:00
Santilka85, если важен интерфейс сделайте элементарную проверку перед добавлением нового элемента. 
Код

. . . . . . . .
if ( lpWndText == "" ) lpWndText = "<БЕЗ ЗАГОЛОВКА>";
Memo1->Lines->Add(g_strParentWindowName + String(lpWndText));

Автор: Santilka85 21.6.2007, 10:51
Пробовал, не помогает, всё равно много пустых строк, надо как-то избавиться от них, а то смысла нету-  пол-экрана ПУСТО, подскажите, плиз

Автор: Klin 21.6.2007, 13:07
Santilka85, попробуйте проверять на пробел или если их много (или всегда по-разному), то уничтожайте стандартной функцией пробелы, а затем уж проверйте.

Автор: Santilka85 21.6.2007, 13:18
Klin, LastDelimiter пробовал.... не помогает, как быть??

Автор: Klin 21.6.2007, 15:18
Цитата(Santilka85 @  21.6.2007,  14:18 Найти цитируемый пост)
 LastDelimiter пробовал.

А это причем? Я имел ввиду функцию TrimRight.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)