Перейти к содержимому

Фотография

Выполнение Win32 API функций


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 3

#1 mbul

mbul

    Новый участник

  • Members
  • Pip
  • 6 сообщений

Отправлено 04 февраля 2009 - 06:06

стоит такая задача - оценить возможность работы TestComplete c неким нестандартным контролом. Необходимо получить данные из определенной ячейки самодельного грида.
Сторонним приложением это можно сделать примерно так:
int sorted_row = SendMessage ((HWND)grid, WM_USER+1042, row, true);
  SendMessage((HWND)grid, WM_USER + 1002, sorted_row, col);
  SendMessage((HWND)grid, WM_GETTEXT, size, (LPARAM) buff);
В итоге в buff будет лежать строка из ячейки [row, col].
как такие телодвижения можно повторить в TestComplete? Если не сложно, то с кусочком кода, плиз.
  • 0

#2 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 05 февраля 2009 - 05:05

Здравствуйте.

TestComplete позволяет вызывать функции из Win32 API, в том числе и SendMessage. Однако, скриптовые языки не поддерживают передачу параметров по ссылке в такие методы, а значит сделать третий вызов у вас не получится.

Однако, есть способ заставить TestComplete послать сообщение WM_GETTEXT автоматически. Для этого надо зарегистрировать класс окна вашего грида в Object Mapping как Edit Box. TestComplete добавит контролу синтетическое свойство wText, которое и будет возвращать результат посылки сообщения WM_GETTEXT. Для этого надо:
  • Двойным щелчком по имени вашего проекта в Project Explorer открыть редактор проекта.
  • Открыть закладку Properties.
  • Выбрать группу опций Object Mapping.
  • Выбрать тип объекта 'Win32 Controls and Windows | Edit Box'.
  • Добавить имя класса окна грида (свойства WndClass) в список.
По идее, это должно сработать.
var WM_USER = 0x0400;
...
  var grid = Sys.Process....;
  var row = 5;
  var col = 3;
  var sorted_row = Win32API.SendMessage(grid.Handle, WM_USER + 1042, row, true);
  Win32API.SendMessage(grid.Handle, WM_USER + 1002, sorted_row, col);
  var text = grid.wText;
  Log.Message(text);

  • 0
С уважением,
Дмитрий

#3 mbul

mbul

    Новый участник

  • Members
  • Pip
  • 6 сообщений

Отправлено 05 февраля 2009 - 07:21

Здравствуйте.

TestComplete позволяет вызывать функции из Win32 API, в том числе и SendMessage. Однако, скриптовые языки не поддерживают передачу параметров по ссылке в такие методы, а значит сделать третий вызов у вас не получится.

Однако, есть способ заставить TestComplete послать сообщение WM_GETTEXT автоматически. Для этого надо зарегистрировать класс окна вашего грида в Object Mapping как Edit Box. TestComplete добавит контролу синтетическое свойство wText, которое и будет возвращать результат посылки сообщения WM_GETTEXT. Для этого надо:

  • Двойным щелчком по имени вашего проекта в Project Explorer открыть редактор проекта.
  • Открыть закладку Properties.
  • Выбрать группу опций Object Mapping.
  • Выбрать тип объекта 'Win32 Controls and Windows | Edit Box'.
  • Добавить имя класса окна грида (свойства WndClass) в список.
По идее, это должно сработать.
var WM_USER = 0x0400;
...
  var grid = Sys.Process....;
  var row = 5;
  var col = 3;
  var sorted_row = Win32API.SendMessage(grid.Handle, WM_USER + 1042, row, true);
  Win32API.SendMessage(grid.Handle, WM_USER + 1002, sorted_row, col);
  var text = grid.wText;
  Log.Message(text);

За подсказку спасибо, буду пробовать. А когда происходит .SendMessage(grid.Handle, WM_GETTEXT...) ? В момент когда встречается вызов text = grid.wText или раньше?
  • 0

#4 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 05 февраля 2009 - 09:27

Здравствуйте.

Утверждать не берусь, но Spy++ говорит что, вроде, в момент обращения к wText.
  • 0
С уважением,
Дмитрий


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных