Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Get Window Caption / 16 сообщений из 16, страница 1 из 1
03.06.2015, 14:44
    #38975390
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
Добрый день!

У меня есть процедура, которая получает 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
03.06.2015, 17:58
    #38975579
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
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
03.06.2015, 18:05
    #38975587
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
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
03.06.2015, 18:22
    #38975605
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
Lisichkin,

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

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

По какой-то причине вызов 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
04.06.2015, 14:13
    #38976249
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
Рекомендую писать так
Код: 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
Период между сообщениями больше года.
20.03.2019, 13:07
    #39788984
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
_Vasilisk_(+1 - тоже лишний)не-а.
попробуй.

зы: случайно наткнулся на эту тему, сори за некрофильство
...
Рейтинг: 0 / 0
20.03.2019, 18:56
    #39789222
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
Мимопроходящий_Vasilisk_(+1 - тоже лишний)не-а.
попробуй.Что пробовать, если я копирую из PChar явно указанное количество символов
_Vasilisk_
Код: pascal
1.
 SetString(Result, @sCaption[0], lenCopy);
...
Рейтинг: 0 / 0
20.03.2019, 19:20
    #39789228
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
нет уж, ты попробуй ;)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.03.2019, 19:35
    #39789236
Foxpc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
Код: 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
20.03.2019, 19:57
    #39789245
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
Мимопроходящийнет уж, ты попробуй ;)Говори уже в чем засада?
...
Рейтинг: 0 / 0
21.03.2019, 10:14
    #39789388
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
_Vasilisk_Мимопроходящийнет уж, ты попробуй ;)Говори уже в чем засада?
Очевидно, что wParam в сообщении WM_GETTEXT указывает на размер буфера , а WM_GETTEXTLENGTH - возвращает длину текста . И если убрать +1, то WM_GETTEXT вернёт строку на 1 символ короче, т.к. последним будет записан #0.
...
Рейтинг: 0 / 0
21.03.2019, 10:32
    #39789406
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Get Window Caption
сломал интригу
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Get Window Caption / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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