На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> цвет в чужом RichEdit
    здраствуйте
    подскажите пдлст. как в чужом RichEdit поменять у кусочка текста цвет.. выделить и...?
      VCL поставляется с исходными текстами, можно посмотреть коды реализации методов RichEdit. Они вроде как основаны на том же механизме хендлов и сообщений, как и все WinApi.
        а где именно исходники его? не нашёл

        Добавлено
        всмысле на компе
          Не знаю поможет ли или нет, я в принципе все закомментировал. Разбирайся:

          ExpandedWrap disabled
            ////////////////////////////////////////////////////////////////////////////////
            //
            //  ****************************************************************************
            //  * Unit Name : RemoteRichEditDemo
            //  * Purpose   : Демо работы с уделенным RichEdit на примере WordPad
            //  * Author    : Александр (Rouse_) Багель
            //  * Copyright : © Fangorn Wizards Lab 1998 - 2007
            //  * Version   : 1.00
            //  * Home Page : http://rouse.drkb.ru
            //  ****************************************************************************
            //
             
            unit RemoteRichEditDemo;
             
            interface
             
            uses
              Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
              Dialogs, StdCtrls;
             
            type
              TForm1 = class(TForm)
                Button1: TButton;
                procedure Button1Click(Sender: TObject);
              end;
             
            var
              Form1: TForm1;
             
            implementation
             
            {$R *.dfm}
             
            uses
              ShellAPI, RichEdit;
             
            type
              PROCESS_BASIC_INFORMATION = packed record
                ExitStatus: DWORD;
                PebBaseAddress: Pointer;
                AffinityMask: DWORD;
                BasePriority: DWORD;
                uUniqueProcessId: Ulong;
                uInheritedFromUniqueProcessId: Ulong;
              end;
             
              PEnumWindowsProcParam = ^TEnumWindowsProcParam;
              TEnumWindowsProcParam = record
                PID: DWORD;
                AResult: DWORD;
              end;
             
            function  NtQueryInformationProcess(
                ProcessHandle : THandle;
                ProcessInformationClass : Byte;
                ProcessInformation : Pointer;
                ProcessInformationLength : ULONG;
                ReturnLength : PULONG
              ): DWORD; stdcall; external 'ntdll.dll';
             
            procedure RemoteRichViewDemo;
             
              function EnumWindowsProc(AWnd: THandle; AParam: LPARAM): BOOL; stdcall;
              var
                dwProcessID: DWORD;
              begin
                GetWindowThreadProcessId(AWnd, dwProcessID);
                if dwProcessID = PEnumWindowsProcParam(AParam)^.PID then
                begin
                  SetLastError(0);
                  PEnumWindowsProcParam(AParam)^.AResult := AWnd;
                  Result := False;
                end
                else
                  Result := True;
              end;
             
            const
              ProcessBasicInformation = 0;
              SampleText = 'Тестовая строка в удаленном RichEdit';
            var
              ExecuteInfo: SHELLEXECUTEINFOA;
              Info: PROCESS_BASIC_INFORMATION;
              RichViewHandle: THandle;
              EnumWindowsProcParam: TEnumWindowsProcParam;
              CharFormat: TCharFormat;
              pCharFormat: Pointer;
              dwBytesWriten: DWORD;
            begin
              // Запускаем процесс Вордпада
              ZeroMemory(@ExecuteInfo, SizeOf(SHELLEXECUTEINFOA));
              ExecuteInfo.cbSize := SizeOf(SHELLEXECUTEINFOA);
              ExecuteInfo.lpFile := 'wordpad.exe';
              ExecuteInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
              ExecuteInfo.nShow := SW_SHOWNORMAL;
              if not ShellExecuteEx(@ExecuteInfo) then
                RaiseLastOSError;
             
              // Получаем его PID
              if NtQueryInformationProcess(ExecuteInfo.hProcess,
                ProcessBasicInformation, @Info, SizeOf(Info), nil) <> NO_ERROR then
                RaiseLastOSError;
             
              // Немного подождем, пока инициализируются окна процесса
              Sleep(100);
             
              // Ищем его TopLevel окно
              ZeroMemory(@EnumWindowsProcParam, SizeOf(TEnumWindowsProcParam));
              EnumWindowsProcParam.PID := Info.uUniqueProcessId;
              EnumWindows(@EnumWindowsProc, Integer(@EnumWindowsProcParam));
              if EnumWindowsProcParam.AResult = 0 then
                RaiseLastOSError;
             
              // Теперь ищем само окно RichView-а
              RichViewHandle :=
                FindWindowEx(EnumWindowsProcParam.AResult, 0, 'RICHEDIT50W', nil);
             
              // Пишем в нем текст
              SendMessage(RichViewHandle, WM_SETTEXT, 0, Integer(@SampleText[1]));
             
              // Выделяем буквы с девятой по пятнадцатую
              SendMessage(RichViewHandle, EM_SETSEL, 9, 15);
             
              // Далее начинаем работать с паямятью удаленного процесса
              // т.к. EM_SETCHARFORMAT требует указатель на буффер
              // Если не прописать его в удаленное АП, процесс рухнет.
             
              // Выделяем память под структуру
              pCharFormat := VirtualAllocEx(ExecuteInfo.hProcess, nil, SizeOf(TCharFormat),
                MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
              if pCharFormat <> nil then
              try
             
                // Для изменения стиля выделенного текста
                // необходимо заполнить соответствующую структуру
                // Сначала делаем кусок текста жирным
                ZeroMemory(@CharFormat, SizeOf(TCharFormat));
                CharFormat.cbSize := SizeOf(TCharFormat);
                CharFormat.dwMask := CFM_BOLD;
                CharFormat.dwEffects := CFE_BOLD;
             
                // Теперь необходимо ее переместить в память удаленного процесса
                if not WriteProcessMemory(ExecuteInfo.hProcess,
                  pCharFormat, @CharFormat,
                  SizeOf(TCharFormat), dwBytesWriten) then
                  RaiseLastOSError;
             
                // Вот теперь все готово для изменения стиля текста,
                // отправляем сообщение для изменения
                SendMessage(RichViewHandle, EM_SETCHARFORMAT,
                  SCF_SELECTION, Integer(pCharFormat));
             
                // теперь по аналогии сделаем другой
                // кусок текста подчеркнутым и красным
                 SendMessage(RichViewHandle, EM_SETSEL, 28, 36);
                 CharFormat.dwMask := CFM_UNDERLINE or CFM_COLOR;
                 CharFormat.dwEffects := CFE_UNDERLINE;
                 CharFormat.crTextColor := clRed;
                if not WriteProcessMemory(ExecuteInfo.hProcess,
                  pCharFormat, @CharFormat,
                  SizeOf(TCharFormat), dwBytesWriten) then
                  RaiseLastOSError;
                SendMessage(RichViewHandle, EM_SETCHARFORMAT,
                  SCF_SELECTION, Integer(pCharFormat));
             
              finally
                // Освобождаем ранее выделенную память
                VirtualFreeEx(ExecuteInfo.hProcess, pCharFormat, 0, MEM_RELEASE);
              end;
             
              // Ставим курсор в начало текста и любуемся результатом
              SendMessage(RichViewHandle, EM_SETSEL, 0, 0);
            end;
             
            procedure TForm1.Button1Click(Sender: TObject);
            begin
              RemoteRichViewDemo;
            end;
             
            end.
            работает спасибо :)
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0566 ]   [ 15 queries used ]   [ Generated: 16.09.25, 12:53 GMT ]