Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сравнить результат GetWindowText с искомым заданным именем окна? / 12 сообщений из 12, страница 1 из 1
31.08.2013, 18:11
    #38383218
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить результат GetWindowText с искомым заданным именем окна?
Задача: перебираем окна через 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
31.08.2013, 18:28
    #38383224
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить результат GetWindowText с искомым заданным именем окна?
Дмитрий77Как правильно понять что title окна равен "MyProgaTitle"?

strcmp()
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.08.2013, 18:37
    #38383227
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить результат GetWindowText с искомым заданным именем окна?
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
31.08.2013, 18:48
    #38383232
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить результат GetWindowText с искомым заданным именем окна?
Дмитрий77,

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

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

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

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



Дмитрий77,

http://msdn.microsoft.com/ru-ru/library/e0z9k731(v=vs.90).aspx
Настоятельно рекомендую обратить свое внимание на подраздел " Заметки ".
...
Рейтинг: 0 / 0
31.08.2013, 20:36
    #38383260
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить результат GetWindowText с искомым заданным именем окна?
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
01.09.2013, 10:25
    #38383411
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить результат GetWindowText с искомым заданным именем окна?
Дмитрий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
01.09.2013, 16:23
    #38383525
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить результат GetWindowText с искомым заданным именем окна?
NekZКод не на чем проверить. Возможно, потребуются дополнительные преобразования.
Я наверно оставлю как привел выше. Типа работает, не трогай.
NekZв кодинге под винду, тем более с Win API.
Ну, в чем в чем, в этом опыт есть .
...
Рейтинг: 0 / 0
01.09.2013, 20:26
    #38383627
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить результат GetWindowText с искомым заданным именем окна?
Дмитрий77Usman,
спасибо.

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


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


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