powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Get Window Caption
16 сообщений из 16, страница 1 из 1
Get Window Caption
    #38975390
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

У меня есть процедура, которая получает Caption окна по его handle. Для некоторых окон данная процедура возвращает пустую строку, хотя программа Spy(из Visual Studio) показывает, что у окна Caption не пустой.

P.S. Такое происходит с классом окна TsToolBar - аналог ToolBar из Top Speed Clarion.
P.S2. Программу запускал с администраторскими правами - результат аналогичный.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function GetWindowCaption(hwnd: HWND): string;
var
  szCaption: array[0..MAX_PATH] of WideChar;
  sCaption: array[0..MAX_PATH] of Char;
begin
  FillChar(szCaption, Length(szCaption)*SizeOf(szCaption[0]), 0);
  if InternalGetWindowText(hwnd, szCaption, SizeOf(szCaption))=0 then begin
    CheckSysError('GetWindowCaption');
    szCaption[0] := #0
  end;
  Result := szCaption;
  if Result='' then begin
    if GetWindowText(hwnd, sCaption, SizeOf(sCaption))=0 then begin
      CheckSysError('GetWindowText');
      Result := ''
    end else
      Result := sCaption
  end
end;



Помогите понять, в чем проблема.
(Delphi 6 - No Unicode)
...
Рейтинг: 0 / 0
Get Window Caption
    #38975579
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lisichkin,

попробуй так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function GetWindowCaption( hwnd: HWND ): String;
var
  sCaption: array[ 0..MAX_PATH ] of Char;
  nLen: Integer;
begin
  nLen := GetWindowText( hwnd, @sCaption, MAX_PATH );
  if nLen > 0 then
    SetString( Result, sCaption, nLen )
  else
    Result := '';
end;
...
Рейтинг: 0 / 0
Get Window Caption
    #38975587
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock:
Спасибо за ответ, но не поможет, т.к.:
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms633520(v=vs.85).aspx

MicrosoftIf the function succeeds, the return value is the length, in characters, of the copied string, not including the terminating null character. If the window has no title bar or text, if the title bar is empty, or if the window or control handle is invalid, the return value is zero.

GetWindowText для окон класса TsToolBar возвращает 0, при этом GetLastError = 0
...
Рейтинг: 0 / 0
Get Window Caption
    #38975605
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lisichkin,

А что, если у тулбара нет кэпшена - это проблема?
...
Рейтинг: 0 / 0
Get Window Caption
    #38975610
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да :)
У Программы есть два ToolBar'а мне нужно найти "правильный" что бы щелкнуть по четвертой кнопке и загрузить прайсы...:)
...
Рейтинг: 0 / 0
Get Window Caption
    #38975614
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но меня больше удивляет откуда Spy берет информацию!!!
Единственное предположение - это что Spy в Caption помещает данные Hint'а (при наведении на Toolbar появляется именно этот текст) или в терминах MS Windows "Tool-tip"
...
Рейтинг: 0 / 0
Get Window Caption
    #38975650
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lisichkin,

Наверняка они создаются по-порядку. Просто используй всегда 1-й (или всегда 2-й - определи методом тыка) хендл, который получаешь чз GetWindow
...
Рейтинг: 0 / 0
Get Window Caption
    #38976084
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, кому-то будет полезно.

По какой-то причине вызов Windows API функций GetWindowText и GetWindowLength завершается с ошибкой ERROR_FILE_NOT_FOUND. И получается не возможно получить Caption окна.

Однако, работая через SendMessage, все можно получить...Даже не имея администраторских привилегий :)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function GetWindowCaption(hwnd: HWND): string;
var
  sCaption: array[0..MAX_PATH] of Char;
  len, lenCopy: Integer;
begin
  Result := '';
  len := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
  if len<=0 then Exit;
  lenCopy := SendMessage( hwnd, WM_GETTEXT, len+1, Integer( @sCaption ) );
  if lenCopy<=0 then Exit;
  sCaption[lenCopy+1] := #0;
  Result := sCaption
end;
...
Рейтинг: 0 / 0
Get Window Caption
    #38976249
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекомендую писать так
Код: pascal
1.
lenCopy := SendMessage(hwnd, WM_GETTEXT, len, LPARAM(@sCaption));

(+1 - тоже лишний)
А еще лучше так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function GetWindowCaption(hwnd: HWND): string;
var
  sCaption: array of Char;
  len, lenCopy: Integer;
begin
  Result := '';
  len := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
  if len<=0 then Exit;
  SetLength(sCaption, len);
  lenCopy := SendMessage( hwnd, WM_GETTEXT, len, LPARAM(@sCaption[0]));
  if lenCopy<=0 then Exit;
  SetString(Result, @sCaption[0], lenCopy);
end;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Get Window Caption
    #39788984
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_(+1 - тоже лишний)не-а.
попробуй.

зы: случайно наткнулся на эту тему, сори за некрофильство
...
Рейтинг: 0 / 0
Get Window Caption
    #39789222
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий_Vasilisk_(+1 - тоже лишний)не-а.
попробуй.Что пробовать, если я копирую из PChar явно указанное количество символов
_Vasilisk_
Код: pascal
1.
 SetString(Result, @sCaption[0], lenCopy);
...
Рейтинг: 0 / 0
Get Window Caption
    #39789228
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет уж, ты попробуй ;)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Get Window Caption
    #39789236
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function GetWindowCaption(hwnd: hwnd): string;
var
  len: Integer;
begin
  Result := '';
  len := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
  if len <= 0 then
    Exit;

  SetLength(Result, len);
  SendMessage(hwnd, WM_GETTEXT, len + 1, LPARAM(@Result[1]));
end;



Cnhjrb
...
Рейтинг: 0 / 0
Get Window Caption
    #39789245
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийнет уж, ты попробуй ;)Говори уже в чем засада?
...
Рейтинг: 0 / 0
Get Window Caption
    #39789388
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Мимопроходящийнет уж, ты попробуй ;)Говори уже в чем засада?
Очевидно, что wParam в сообщении WM_GETTEXT указывает на размер буфера , а WM_GETTEXTLENGTH - возвращает длину текста . И если убрать +1, то WM_GETTEXT вернёт строку на 1 символ короче, т.к. последним будет записан #0.
...
Рейтинг: 0 / 0
Get Window Caption
    #39789406
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сломал интригу
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Get Window Caption
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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