На главную Наши проекты:
Журнал   ·   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
  
> Как правильно поставить Процесс?
    program Project1;

    uses
       Windows,
       Messages,
       forms,
       dialogs,
       Bzin in 'Bzin.pas',
       CrElem in 'CrElem.pas',
       Vars in 'Vars.pas';

    var
       apClass       :   WndClass;
       apWindow      :   HWND;
       apEdit        :   HWND;
       shWindow  :   HWND;
       Message       :   Msg;
       DMessage      :   TMsg;
       BUTTON_STYLE  :   UINT;
       EXE_STYLE     :   UINT;

    const
       apWindowTitle = 'QNotepad';
       apClassName = 'apWindowClassTime';
       IDD_ED      =  WM_USER + 1001;

    [i]Function apEditProc(apWindow:HWND;Message,WParam:LongInt;
    LParam:Longint):Longint;stdcall;
    Begin
        case message of
          WM_RBUTTONDOWN: showMEssage('Clicked');
        end;
     Result:=DefWindowProc(apWindow,Message,WParam,LParam );
    End;[/i]

    Procedure SetAllObjects;
    begin
       apEdit := CreateWindowEx(WS_EX_CLIENTEDGE, 'edit','QNotepad',
       WS_CHILD or WS_VISIBLE or ES_MULTILINE or WS_VSCROLL or ES_AUTOHSCROLL,
       5, 25, 150, 150, apWindow, IDD_ED, HInstance, nil);
       [b]SetWindowLong( apEdit, GWL_WNDPROC, Integer( @apEditProc ) );[/b]
    end;

    Function apDetect(shWindow:HWND;Message,WParam:LongInt;
    LParam:Longint):Longint;stdcall;
    Begin
       Case Message of
          WM_LBUTTONDOWN:
            Begin
              ShowMessage('Left Button Clicked');
            End;
       End;
       Result:=DefWindowProc( shWindow,Message,WParam,LParam );
    End;

    {$R *.res}

    begin
     apClass.style := CS_HREDRAW or CS_VREDRAW;
     apClass.lpfnWndProc := @apDetect;
     apClass.hIcon:=LoadIcon(HInstance,'Icon1');
     apClass.hCursor:=LoadCursor(0,IDC_ARROW);
     apClass.hbrBackground:= GetSysColorBrush(COLOR_BTNFACE);
     apClass.lpszClassName:= apClassName;

     apWindow := CreateWindow(apClassName,'Notepad',
     WS_Visible or WS_SYSMENU or
     WS_MINIMIZEBOX,(GetSystemMetrics(SM_CXSCREEN)div 2)-150,
     (GetSystemMetrics(SM_CYSCREEN)div 2)-110,
     300,225,0,0,HInstance,nil);
     SetAllObjects;

     ShowWindow(apWindow,SW_NORMAL);

     While GetMessage(Message,0,0,0) do
     Begin
       TranslateMessage(Message);
       DispatchMessage(Message);
     End;
     Halt;

    end.


    В этом случае, созданное текстовое поле принимает все сообщения, но становится неактивным( в него нельзя ничего записать). Если же ставить обработчик событий так: SetWindowLong( apWindow, GWL_WNDPROC, Integer( @apEditProc ) ); То оно активно, НО ЕГО СООБЩЕНИЯ НЕ ОБРАБАТЫВАЮТСЯ. Хотелось бы чтобы оно было активным и обрабатывало Месаги(одновременно!). ?

    З.Ы. Я там по всякому пробовал менять, но....
    Сообщение отредактировано: Dzuk -
      В конце обработки очередного сообщения надо вызывать НЕ обработчик по умолчанию, а оригинальную процедуру окна, адрес которой получить с помощью GetWindowLong()
        Типа так:

        Result:=DefWindowProc(apWindow,Message,WParam,LParam ); ---- это убрать

        и написать так:

        SetWindowLong(apEdet, GWL_Proc, GetWindowLong(...));

        Я правильно понял?????????
          Нет. В тот момент, когда вызывается GetWindowLong у тебя, там УЖЕ лежит адрес твоей процедуры.

          Надо
          1. Получить и сохранить в какой-то переменной старый адрес.
          2. Только после етого установить свой обработчик
          3. В конце обработки в своем обработчике вызвать процедуру по сохраненному старому адресу.
            Цитата
            Dzuk, 29.11.03, 23:25
            program Project1;

            uses
            ...


            Не совсем в тему, но когда текст весь в один столбик (не форматирован) то разбираться очень тяжело, а по этому не очень хочется sad.gif.
              2Петрович: Никак не получается отредактировать. Тама все нормально а как запостю так все в столбик(без пробелов).
                Цитата
                Dzuk, 30.11.03, 00:50
                Никак не получается отредактировать

                А ты кнопку 'CODE' топчи чаще smile.gif
                  Спасибо всем, разобрался!

                  ...
                  OldProc := Pointer(GetWindowLong(apEdit, GWL_WNDPROC));
                  ...
                  Result:=CallWindowProc(OldProc, apEdit, Message, wParam, lParam);
                  ...
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0235 ]   [ 16 queries used ]   [ Generated: 27.04.24, 07:14 GMT ]