SysListView32 запись значений в чужом окне - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Ребята помогите пожалуйста с реализацией записи значений в колонки SysListView32 который находится в окне чужой программы. Перечитал много чего - перегуглил, переяндоксил и МСДНил однако рабочей реалиазии не добился, так что прошу меня в выше указанные вещи не отпровлять, а помочь примером именно на c# или пенками в нужную сторону с примерами ))).

Для чего надо:

на работе у коллег очень много однотипного ручного ввода причём дублирующего в нескольких программах, меня попросили написать программу которая этот бы самый ввод автоматизировала.

Что есть:

упешно получаем дескрипторы нужных окон, контролов и заполняем их, жамкаем клавиши и т.д. (в не активном окне). Каких-либо проблем с получением дескриптора нужного SysListView32 нет.

В чём нужна помощь:

После большой кучи операций ввода в сторонней программе появляется окно с SysListView32 в котором имеется 4 колонки и в которые в обязательном порядке нужно внести значения. Вот тут я и встал полностью, пробывал и через посылку сообщений, пробывал копашится в памяти но безуспешно. К своему стыду какой либо боле менее вразумительный код представить вам не могу поэтому прошу дать примерчик как записывать значения в колонки стороннего ListView и если не затруднит как считывать значения именно на c#.

PS

с языком c# знаком всего менее месяца, ранее писал на паскале и PHP, приходится изучать и адаптироваться на лету, возможности сменить среду разработки нет из-за сурового отдела безопасности. Всех откликнувшихся заранее благодарю.

Решение задачи: «SysListView32 запись значений в чужом окне»

textual
Листинг программы
procedure AddSomeString(AHandle:THandle);
var
vItem: TLVItemW;
vPointer,vPointerText:Pointer;
vNumberOfBytesRead,vProcessId: DWORD;
vProcess: THandle;
vBuffer: array[0..255] of Char;
begin
  GetWindowThreadProcessId(AHandle, @vProcessId);
  vProcess := OpenProcess(PROCESS_ALL_ACCESS, False, vProcessId);
  vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
  vPointerText := VirtualAllocEx(vProcess, nil,256,MEM_RESERVE or MEM_COMMIT,PAGE_READWRITE);
  vBuffer:='АСЕЕВА УЛ., 6';
    with vItem do begin
      mask := LVIF_TEXT;
      iItem := 0;
      iSubItem := 0;
      cchTextMax := SizeOf(vBuffer);
      pszText := vPointerText;
    end;
  WriteProcessMemory(vProcess, vPointerText, @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
  WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(TLVItemW), vNumberOfBytesRead);
  SendMessage(AHandle, LVM_INSERTITEM, 0, lparam(vPointer));
  SendMessage(AHandle, LVM_SETITEMTEXT, wParam(i), lparam(vPointer));
 
  VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
  VirtualFreeEx(vProcess, vPointerText, 0, MEM_RELEASE);
  CloseHandle(vProcess);
end;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы