powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сравнить результат GetWindowText с искомым заданным именем окна?
12 сообщений из 12, страница 1 из 1
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383218
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача: перебираем окна через EnumWindows, ищем окно с заголовком "MyProgaTitle",
как нашли сохраняем его hwndEnumTarget и прекращаем перебор окон.

Успешное решение на VB6 (точно работает):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Private Function EnumWindowsProc(ByVal app_hwnd As Long, _
 ByVal lParam As Long) As Boolean
' Return False to stop the enumeration.
 
  Dim buf As String * 256
  Dim title As String
  Dim length As Long

  ' Get the window's title.
  length = GetWindowText(app_hwnd, buf, Len(buf))
  title = Left$(buf, length)
  If lParam = 1 Then 'конкретное окно "MyProgaTitle"
    If title = "MyProgaTitle" Then
      hwndEnumTarget = app_hwnd
      EnumWindowsProc = False ' Save the hwnd and end the enumeration
      Exit Function
    End If
  End If
  
  EnumWindowsProc = True ' Continue the enumeration (default)
End Function



Предварительный код C++:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
  // Return FALSE to stop the enumeration.

  char title[256];
  GetWindowText(hwnd,title,sizeof(title));
  if (lParam == 1) {
    if (title == "MyProgaTitle"){
      hwndEnumTarget = hwnd;
      return FALSE;
    }
  }

  return TRUE;
}


Выделенная строчка наводит меня на глубокие сомнения (компилятор тоже сомневается пишет Warning).
Как правильно понять что title окна равен "MyProgaTitle"?


P.S.
Я бы мог использовать
Код: plaintext
1.
HWND hwndTarget = FindWindow(NULL,"MyProgaTitle");


но опыт показывает что это ненадежно.
"MyProgaTitle" может быть несколько,
приведенный код неполный,
там еще делаю проверку на предмет хитро-обозванного child
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  If lParam = 1 Then 'конкретное окно WINDOWTITLE_SERVER
    If title = WINDOWTITLE_SERVER Then
      hwndTemp = FindWindowEx(app_hwnd, 0&, vbNullString, WINDOWTITLE_SERVER_CHILD)
      If hwndTemp <> 0 Then
        hwndEnumTarget = app_hwnd
        EnumWindowsProc = False ' Save the hwnd and end the enumeration
        Exit Function
      End If
    End If
  End If


Но до этого пока не дошел.
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383224
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Как правильно понять что title окна равен "MyProgaTitle"?

strcmp()
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383227
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Код: plaintext
1.
    if (strcmp(title,"MyProgaTitle")){


чего-то не работает
там же хвост еще:
char title[256];
Его наверно как-то отсечь надо, типа как я в vb делаю. Как на C?

Работает так:
Код: plaintext
1.
    if (strstr(title,"MyProgaTitle")){



Но при этом и так:
Код: plaintext
1.
    if (strstr(title,"MyProgaTit")){



(вхождение, а не точное соответствие)
Хотелось бы точного.
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383232
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Код: plaintext
1.
2.
3.
if (strcmp(title,"MyProgaTitle") == 0) {
   // profit
}
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383236
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,
спасибо.

== 0 заработало.
Тяжело все-таки в вашем C/C++ со строками работать.
В VB есть String и все понятно.
А тут куча строковых типов, куча преобразований между ними и куча человеко-недружелюбных функций (извините, эмоции).

Спасибо.
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383244
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77куча человеко-недружелюбных функций
Поправлю: нечитателе-недружелюбных функций. Те, кто удосужился прочитать описание
стандартной библиотеки проблем не имеют.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383245
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77В VB есть String и все понятно.

Ну как сказать... Нативно да, нет. Но в стандартной библиотеке есть класс std::string, который отлично реализует сравнение через оператор ==. Во фреймворке Qt есть класс QString, который будет даже подружелюбнее VB-шных строк.
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383246
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДмитрий77куча человеко-недружелюбных функций
Поправлю: нечитателе-недружелюбных функций. Те, кто удосужился прочитать описание
стандартной библиотеки проблем не имеют.
Код: plaintext
+100500



Дмитрий77,

http://msdn.microsoft.com/ru-ru/library/e0z9k731(v=vs.90).aspx
Настоятельно рекомендую обратить свое внимание на подраздел " Заметки ".
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383260
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZНо в стандартной библиотеке есть класс std::string, который отлично реализует сравнение через оператор ==.
Ну допустим.
Только как это увязать с GetWindowText?

Полный код как бы такой (уже рабочий):
P.S. На форме находится "холостая" невидимая child-кнопка с надписью "MyProgaTitle mnbvcxz" -для проверки что окно именно кот. нужно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
HWND hwndEnumTarget;
HWND FindMyWindow(LPARAM lParam);
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);

...
HWND hwndTarget = FindMyWindow(1); //1 - MyProgaTitle
...

HWND FindMyWindow(LPARAM window_id)
{
  hwndEnumTarget = 0;
  EnumWindows(EnumWindowsProc, window_id); //window_id: 1-MyProgaTitle
  return hwndEnumTarget;
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
  // Return FALSE to stop the enumeration.

  char title[256];
  HWND hwndTemp;

  GetWindowText(hwnd,title,sizeof(title));
  if (lParam == 1) { //конкретное окно MyProgaTitle
    if (strcmp(title,"MyProgaTitle")==0){
      hwndTemp = FindWindowEx(hwnd, NULL, NULL, "MyProgaTitle mnbvcxz");
      if (hwndTemp!=0){
        hwndEnumTarget = hwnd;
        return FALSE;
      }
    }
  }

  return TRUE;
}



Идею не сегодня придумал:
Как ТОЧНО и БЕЗОШИБОЧНО узнать hwndTarget целевого окна?
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383411
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Только как это увязать с GetWindowText?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include <string>
//bla-bla-bla

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
  // Return FALSE to stop the enumeration.

  char title[256];
  HWND hwndTemp;

  GetWindowText(hwnd,title,sizeof(title));
  std::string strTitle(title);
  if (lParam == 1) { //конкретное окно MyProgaTitle
    if (strTitle == "MyProgaTitle"){
     //или даже так без объявления лишней переменной
     if (std::string(title) == "MyProgaTitle"){
//bla-bla-bla
  return TRUE;
}




P.S. Не разбираюсь в кодинге под винду, тем более с Win API. Код не на чем проверить. Возможно, потребуются дополнительные преобразования.
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383525
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZКод не на чем проверить. Возможно, потребуются дополнительные преобразования.
Я наверно оставлю как привел выше. Типа работает, не трогай.
NekZв кодинге под винду, тем более с Win API.
Ну, в чем в чем, в этом опыт есть .
...
Рейтинг: 0 / 0
Как сравнить результат GetWindowText с искомым заданным именем окна?
    #38383627
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Usman,
спасибо.

== 0 заработало.
Тяжело все-таки в вашем C/C++ со строками работать.
В VB есть String и все понятно.


А в С++ есть такая штука, называется документация. Читаешь ее — и сразу становится все понятно.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сравнить результат GetWindowText с искомым заданным именем окна?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]