На главную Наши проекты:
Журнал   ·   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
  
> бестелесное окно
    Можно ли сделать окно так, чтобы с одной стороны его было видно на экране, а с другой стороны - чтобы курсор за него не цеплялся, т.е. как будто его нет?

    ЗЫ. Чушь наверное спрашиваю, но интересно :)
      Чего-то я не понимаю. Нужно чтобы размары окна можно было менять с одной стороны (как в WinAmp)?
      Если нет, то с какой тогда стороны?
        ExpandedWrap disabled
            procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
           
          ...
           
          procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
          begin
            Message.Result := HTTRANSPARENT;
          end;


        Это нужно?
          Цитата Rouse_,8.12.04, 13:41 @
          ExpandedWrap disabled
              procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
             
            ...
             
            procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
            begin
              Message.Result := HTTRANSPARENT;
            end;


          Это нужно?

          Да наверное нет. Мне нужно, чтобы курсор "проваливался" через окно в нижележащее окно. Т.е. чтобы мое окно было просто видно, но никаким иным способом оно себя не проявляло.
          Для чего? Ну например, висят на экране часы (полупрозрачные), и иногда мешают, т.к. нужно нажать что-нибудь под ними. Приходится двигать.
            M
            Тема перенесена из Delphi -> Delphi: Общие вопросы.
              М-да... Скорее всего, нельзя. Буду делать "убегающее" окно. Хотя круто было-бы :D
                Думаю, что можно. Перехватывать нажатие кнопки мыши в пределах формы, определять экранные координаты, искать, какое окно расположено под ним в пределах этих координат. Ну и соответственно передавать нажатие этому окну.

                Добавлено
                Вот я только точно не знаю как реализовать поиск окна по координатам. Хотя способы есть. Многие программы это умеют!
                  Цитата
                  Ну и соответственно передавать нажатие этому окну.


                  Но наверное, не просто окну, а в конкретное "место" окна. А это получается еще интереснее...
                    Цитата s-mike,8.12.04, 14:26 @
                    Вот я только точно не знаю как реализовать поиск окна по координатам. Хотя способы есть. Многие программы это умеют!

                    Может быть кто-то нам подскажет?
                      Цитата s-mike,8.12.04, 14:26 @
                      Вот я только точно не знаю как реализовать поиск окна по координатам. Хотя способы есть. Многие программы это умеют!

                      GetWindowFromPoint
                      Хотя есть ещё функция, более надёжная. Названия, к сожалению, не помню. Но, кажется, Song знает (когда-то, в какой-то теме видел его пост про это). В любом случае, можно попытать Поиск.
                        GetWindowFromPoint возвращает нэндл окна находящегося впереди всех в данной точке, поэтому для данной задачи не подойдет...
                          Только WindowFromPoint(), без Get.

                          Цитата Curve,8.12.04, 21:36 @
                          Но, кажется, Song знает (когда-то, в какой-то теме видел его пост про это). В любом случае, можно попытать Поиск.

                          не помню :( Может и говорил.
                            Как показала тема "Прозрачность" для мышки WindowFromPoint не пашет, поскольку возвращает координаты как раз того окна, по которому и был произведен щелчок, что не представляет никакой ценности.

                            Но я нашел другое решение. Смотрите пост "Прозрачность" для мышки (сообщение #577723).
                            Сообщение отредактировано: s-mike -
                              s-mike, там твоё бесценное решение было разделено в тему Прозрачная форма раздела FAQ. По сему и не смог тебе плюсик поставить. Ставлю здесь :yes: Спасибо!

                              Добавлено
                              Упс :unsure: Пишет
                              Цитата Обнаружена ошибка
                              Вы в недавнее время уже меняли рейтинг этого пользователя.
                              До следующего изменения должно пройти 1 дней
                                Стоп, а если задавать WindowStyle как TRANSPARENT (точное название константы сейчас не вспомню)? Насколько помню, у меня как раз такое и получалось, когда я пробовал делать прозрачное местами окно. Копни MSDN на тему window styles / extended styles.
                                  Да, действительно в МСДНе об этом написано. Цитирую:
                                  Цитата
                                  Hit testing of a layered window is based on the shape and transparency of the window. This means that the areas of the window that are color-keyed or whose alpha value is zero will let the mouse messages through.

                                  If the layered window has the WS_EX_TRANSPARENT extended window style, the shape of the layered window will be ignored and the mouse events will be passed to the other windows underneath the layered window.
                                  Сообщение отредактировано: s-mike -
                                    SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT );
                                      Идея: ловить нажатие нашим окном, создавать в нём дырку в 1 пиксель и передавать нажатие ниже
                                        Scorpy, а ты не идеи подкидывай, а реализуй и код покажи.
                                        :yes:
                                          Цитата Scorpy @
                                          Идея: ловить нажатие нашим окном, создавать в нём дырку в 1 пиксель и передавать нажатие ниже

                                          Класс - обожаю безбашенные идеи :))) Лови плюс :)
                                            Цитата
                                            а ты не идеи подкидывай, а реализуй и код покажи.


                                            как-то так :tong:

                                            ExpandedWrap disabled
                                              procedure TForm1.HandleMessage(var Msg: tagMSG;var Handled: Boolean);
                                              Var
                                                P,PP:TPoint;
                                                S,SS,R:HRGN;
                                              begin
                                                Inherited;
                                                {Case Msg.message Of
                                                  WM_MOUSEFIRST..WM_MOUSELAST:
                                                  Begin}
                                                    PP:=Mouse.CursorPos;
                                                    P:=ScreenToClient(PP);
                                                    R:=CreateRectRgn(P.X,P.Y,P.X+1,P.Y+1);
                                                    SS:=CreateRectRgn(0,0,Width,Height);
                                                    S:=CreateRectRgn(0,0,Width,Height);
                                                    CombineRgn(S,SS,R,RGN_XOR);
                                                    SetWindowRgn(Handle,S,True);
                                                    SendMessage(WindowFromPoint(PP),Msg.message,Msg.wParam,Msg.lParam);
                                                    DeleteObject(R);
                                                    DeleteObject(S);
                                                    DeleteObject(SS);
                                                    Handled:=True;
                                              {    End;
                                                End;}
                                              end;
                                               
                                              procedure TForm1.FormCreate(Sender: TObject);
                                              begin
                                                Application.OnMessage:=HandleMessage;
                                              end;


                                            сильно не пинайте, с регионами второй раз сталкиваюсь :rolleyes:

                                            ЗЫ надобно доделать: пересылать не все сообщения/сообщения не только мыши (я думаю)
                                            ЗЫЫ Окно fsStayOnTop
                                            Сообщение отредактировано: Scorpy -
                                              Scorpy, надо хотя бы тестировать свой код перед тем, как кидать на форум.
                                                Цитата
                                                s-mike надо хотя бы тестировать свой код перед тем, как кидать на форум.

                                                а что не так?
                                                у меня работает :huh:

                                                ЗЫ забыл, пример был для BorderStyle:=bsNone

                                                новый вариант, для любого BorderStyle:
                                                ExpandedWrap disabled
                                                  procedure TForm1.HandleMessage(var Msg: tagMSG;var Handled: Boolean);
                                                  Var
                                                    P:TPoint;
                                                    S,R:HRGN;
                                                  begin
                                                    Inherited;
                                                    Case Msg.message Of
                                                      WM_MOUSEFIRST..WM_MOUSELAST:
                                                      Begin
                                                        P.X:=ScreenToClient(Msg.pt).X+ClientOrigin.X-Left;
                                                        P.Y:=ScreenToClient(Msg.pt).Y+ClientOrigin.Y-Top;
                                                        R:=CreateRectRgn(P.X,P.Y,P.X+1,P.Y+1);
                                                        S:=CreateRectRgn(0,0,Width,Height);
                                                        CombineRgn(S,S,R,RGN_XOR);
                                                        SetWindowRgn(Handle,S,True);
                                                        SendMessage(WindowFromPoint(Msg.pt),Msg.message,Msg.wParam,Msg.lParam);
                                                        DeleteObject(R);
                                                        DeleteObject(S);
                                                        Handled:=True;
                                                      End;
                                                    End;
                                                  end;
                                                   
                                                  procedure TForm1.FormCreate(Sender: TObject);
                                                  begin
                                                    Application.OnMessage:=HandleMessage;
                                                  end;


                                                сообщения неклиентской части ловить лень
                                                  Scorpy, отлично! Лови +!
                                                    Хе - а я с локальным хуком парился :lool:
                                                    Молодец, лови и от меня заслуженный + :)
                                                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                    0 пользователей:


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