Нужна помощь с Win32API - страница 2

 

Вам нужны еще два кода:

LVM_GETNEXTITEM = 0x100C

и

LVM_GETITEMTEXT = 0x102D

LVNI_SELECTED = 0x0002

index=SendMessageA(hwnd, LVM_GETNEXTITEM, (WPARAM)-1, (LPARAM)2); //Возвращает индекс первой выделенной строки

lvi.iSubItem = 1; // Номер столбца

SendMessageA(hwnd, LVM_GETITEMTEXT, (WPARAM)index, (LPARAM)&lvi); // lvi.pszText содержит строку текста из ячейки. Дальше переводим в int.

 
ForexTools >>:

очень даже можно обойтись - в MQL достаточно средств для этого ;)

Поправьте меня, если не так, но для user.dll галочку ж надо в терминале ставить, чтобы разрешить ей работать? Тогда чем она не внешняя? Ок, понятно, что имелись в виду самописные dll (не из поставки операционки).

А каким образом описать структуру для вызова SendMessageA(hwnd, LVM_GETITEMTEXT, (WPARAM)index, (LPARAM)&lvi) из MQL4? Или задача под МТ5? Я пытался таким способом вытащить текст (правда из другого окна) как раз используя DLL. Получил мусор, разбираться было некогда. Если лист имеет стиль ownerdraw, то может и не содержать текста в самих элементах.

 
marketeer >>:

Поправьте меня, если не так, но для user.dll галочку ж надо в терминале ставить, чтобы разрешить ей работать? Тогда чем она не внешняя? Ок, понятно, что имелись в виду самописные dll (не из поставки операционки).

А каким образом описать структуру для вызова SendMessageA(hwnd, LVM_GETITEMTEXT, (WPARAM)index, (LPARAM)&lvi) из MQL4? Или задача под МТ5? Я пытался таким способом вытащить текст (правда из другого окна) как раз используя DLL. Получил мусор, разбираться было некогда. Если лист имеет стиль ownerdraw, то может и не содержать текста в самих элементах.

да имелось ввиду именно отсутствие самописных длл. про ownerdraw сказать пока ничего не могу, кроме одног: текст то этот гдето всетаки есть - значит както до него можно добраться ;)

Задача для четверки. Вот все что мне удалось собрать - но оно еще не работает. нет еще связки с текстовой строкой куда нужно вернуть результат и возвращает всегда число прочитанных символов - ноль :(

#include <WinUser32.mqh>

#import "user32.dll"
  int GetParent( int hWnd );
  int GetDlgItem( int hDlg, int nIDDlgItem );
  int GetAncestor(int hWnd, int gaFlags);
  int GetDlgItem(int hDlg, int nIDDlgItem);
#import "commctrl.dll"
  int ListView_GetItemTextA(int hwnd, int row, int col, string buf, int bufsize);
#import

#define LVM_FIRST  0x1000
#define LVM_GETITEMCOUNT 0x1004
#define LVM_GETITEM  0x1005
#define LVM_GETITEMTEXT 0x1045
#define LVM_GETSELECTEDCOUNT  0x1050


#define LVIF_TEXT  0x0001
#define LVIF_IMAGE 0x0002
#define LVIF_PARAM  0x0004
#define LVIF_STATE  0x0008
#define LVIF_INDENT  0x0010
#define LVIF_GROUPID  0x0100
#define LVIF_COLUMNS  0x0200

// еще константы тут http://sql.ru/forum/actualthread.aspx?bid=22&tid=265781&hl=lvm_setcolumn


int lvi[9]; /* public struct LV_ITEM
{
  0 public UInt32 mask;
  1 public Int32 iItem; строка
  2 public Int32 iSubItem; колонка
  3 public UInt32 state;
  4 public UInt32 stateMask;
  5 public String pszText;
  6 public Int32 cchTextMax;
  7 public Int32 iImage;
  8 public IntPtr lParam;
}
*/

void start()
{
  int hwnd = GetAncestor(WindowHandle(Symbol(),Period()),2); //дескриптор основного окна терминала
  int Count = 0;    

  hwnd = GetDlgItem(hwnd, 0xE81E); // Нашли историю счета
  hwnd = GetDlgItem(hwnd, 0x51);
  hwnd = GetDlgItem(hwnd, 0x81B8);

  Count = SendMessageA(hwnd, LVM_GETITEMCOUNT, 0, 0); // получили количество элементов списка
  Print(Count);
  // чтение
  ArrayInitialize(lvi,0);  
  lvi[0] =  LVIF_TEXT;
  lvi[1] = 1;
  lvi[2] = 1;  
  lvi[6] = 100;
  lvi[8] = 8;  
  int ret = SendMessageA(hwnd, LVM_GETITEMTEXT, 8, lvi[0]); 

  Print(ret);
}

для api: cишных текстов я уже видел немало, возможно они были даже рабочими. вся беда в том, что некоторые вещи в MQL не "транслируются" один-в-один:(

ну например: как положить адрес строки для возврата прочитанного значения в lvi[5] (то самое pszText) ?

 
ForexTools писал(а) >>

как положить адрес строки для возврата прочитанного значения в lvi[5] (то самое pszText) ?

:) Очень просто....

#import "kernel32.dll"
int lstrcat(string dst, string src);
#import

string strHolder = "13245678901234567890123456789012345678901234567890123456789012324";

lvi[5] = lstrcat(strHolder,"");

 

Эхх, доканывать - так по полной. Тем более и тема подходящая (ForexTools, извини меня).

В МТ4 для генерации искусственного тика надо было вызвать PostMessageA( h, WM_COMMAND, 33324, 0 ) из user32.dll.

А вот в МТ5 как? Впечатление такое, что эта цифирь поменялась. Может, знает кто?

 
ForexTools >>:

про ownerdraw сказать пока ничего не могу, кроме одног: текст то этот гдето всетаки есть - значит както до него можно добраться ;)

Здесь-то и сложность, поскольку способы внешнего хранения текстов не формализованы как структуры стандартных контролов. Этак нужно будет делать полный реверсинжиниринг.
ForexTools >>:

ну например: как положить адрес строки для возврата прочитанного значения в lvi[5] (то самое pszText) ?

Мда, крутой способ описания структуры. Никогда б не решил так делать, т.к. был уверен, что сэмулировать указатели простыми переменными MQL4 нельзя. Если заработает - дайте знать. ;-)
 
Mathemat >>:

Эхх, доканывать - так по полной. Тем более и тема подходящая (ForexTools, извини меня).

В МТ4 для генерации искусственного тика надо было вызвать PostMessageA( h, WM_COMMAND, 33324, 0 ) из user32.dll.

А вот в МТ5 как? Впечатление такое, что эта цифирь поменялась. Может, знает кто?

Зачем жеж извинятся? лучше просто новую тему создать, да на форуме пятерочном с правильным названием - тогда быстрее помогут ;)

а по сути - есть такая прожка от мирсософта SPY++ (и на форуме была и в инете найти ссылку не проблемма). умеет в том числе перехватывать сообщения посылаемые окну. вот скрин когда в окно идут только тики


сорри - дальше не копал. мне бы сейчас со своей задачкой разобраться :(

 

Знатоки Win32API.... аууууу.... ну не уж то задачка вам не по зубам?!!

Ведь не из праздного любопытства был задан вопрос. Вещь реально нужная для написания скриптов работы с ордерами в ручном режиме. Например - простая подтяжка стопа. Код - тривиальный, но спрашивать в параметрах скрипта номер тикета которому нужно стоп промодифицировать :(

А так, можно вообще без параметров скрипт сделать: выбранному в списке ордеров устанавливается стоп в точке сброса скрипта.

Может хоть на выходных у кого то найдется время добить мой последний вариант (неработающего еще) кода?


 
ForexTools писал(а) >>

...

Может хоть на выходных у кого то найдется время добить мой последний вариант (неработающего еще) кода?

А с моими подсказками не получилось?

 
api >>:

А с моими подсказками не получилось?

увы :((( мои познания в системном программировании закончились на том коде который я выложил. может добьете(сь результата)?

Причина обращения: