На главную Наши проекты:
Журнал   ·   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
  
> Label на Рабочем Столе , как сделать САМОЕ простое окно?
    Как сделать окно без заголовка (гольный Canvas) не на форме, а прямо на рабочем столе?
    (типа как WinAmp делает, или как окошечки хинтов)
      Ну сделать BorderStyle:=bsNone; - для окна... так тебе label или окно на рабочем столе надо?
      Если label, то натянуть какоу-нить label на это окно, поставить Align:=alClient; вроде все...:)
        нужно задать какие-то правильные параметры в CreateWindow. Какаие именно - никак не пойму.
        (И нужно выбрать правильный WindowClass.)
        Label собственно мне не нужна
          Цитата
          swe, 14.07.04, 07:59
          нужно задать какие-то правильные параметры в CreateWindow.

          dwStyle = WS_POPUP
          размеры и положение = по своему усмотрению :)
          hWndParent = GetDesktopWindow
          ...
            2ZEE спасибо, всё работает. Только на ТаскБаре при запуске такого окошка появляется кнопка (которая позволяет сделать окно активным). Можно ли сделать так, чтобы этой кнопки не было?
              тада надо сделать одно окошко на Десктопе и сделать его не видимым - т.е. без WS_VISIBLE, потом другое у кот. hWndParent = первому окошку, а стили = WS_POPUP or WS_VISIBLE - думаю так

              Добавлено в :
              хотя щас подумал о др. варианте:
              можно попробывать вместо WS_POPUP поставить WS_CHILD
              но я такой способ не проверял...
                swe, можно
                ExpandedWrap disabled
                  SetWindowLong(Handle, GWL_EXSTYLE, (GetWindowLong(Handle, GWL_EXSTYLE) and (not WS_EX_APPWINDOW)) or WS_EX_TOOLWINDOW);
                  Итак, резюме:

                  Чтобы получить самое простое (по виду похожее на Label) окно прямо на рабочем столе, чтобы при этом не появилась кнопка в TaskBar'е нужно:

                  вместо CreateWindow использовать CreateWindowEx, где первый параметр - расширенный стиль окна должен быть
                  WS_EX_TOOLWINDOW (чтобы не было кнопки на панели задач). Стиль окна должен быть (должен включать) WS_POPUP, чтобы окно было без заголовка и, кроме того, родительским окном должна быть переменная типа HWnd полученная с помощью функции GetDesktopWindow

                  вот пример кода:

                  ExpandedWrap disabled
                     
                    var
                      hMyWnd      : HWnd;   (* наше простое окно                      *)
                      hWndDeskTop : HWnd;   (* окно DeskTop - родительское для нашего *)
                      WinClassNm  : string; (* имя оконного класса                    *)
                    //...
                    begin
                      hWndDeskTop := GetDesktopWindow;
                      WinClassNm  := 'STATIC';  (* это класс для Label либо надо зарегистрировать свой класс *)        
                     
                      hMyWnd :=
                      CreateWindowEx(
                       WS_EX_TOOLWINDOW,  //  - чтобы не было кнопки на панели задач
                       WinClassNm,        //  - имя оконного класса
                       '',                //  - имя окна
                    (* стиль окна *)
                       WS_POPUP or        // $8000 0000    - без заголовка окна
                       WS_BORDER,         // $0080 0000    - тоненькая граница цвета Border
                     
                       0,     0,          // x0   , y0
                       300, 100,          // width, height
                       hWndDeskTop,       // hParentWindow,
                       0,                 // hMenu
                       hInstance,         // глобальная переменная модуля SysInit
                       Nil );
                    end;
                    Как создать класс содержащий в себе процедуры открытия различных окон.

                    Ещё , охото иметь "продвинутое" окно , которо можно двигать , сворачивать и с кнопочками :).

                    С уважением ,
                      oygan - задавай вопросы в отдельной теме :rulez:
                        Вопрос, в общем-то, продолжает тему. Но лучше все-таки создать отдельную ;) ZEE прав.
                          Цитата P.O.D @ 15.07.04, 10:13
                          swe, можно
                          ExpandedWrap disabled
                            SetWindowLong(Handle, GWL_EXSTYLE, (GetWindowLong(Handle, GWL_EXSTYLE) and (not WS_EX_APPWINDOW)) or WS_EX_TOOLWINDOW);

                          можно так, а еще в коде программы вставить примерно такую строчку Application.ShowForm:=false
                            тута нет Application - только чистый Window API
                              Как двигать окно с помощью мыши при нажатой левой кнопке:
                              ExpandedWrap disabled
                                 
                                var
                                  PMSave : TPoint;    (* в PMSave сохраняем абсолютные координаты мыши *)
                                 
                                procedure Win_Move(h:HWnd);
                                var dx,dy : integer; r : TRect; PM : TPoint;
                                begin
                                  GetCursorPos(PM);        (* получить абсолютную текущую позицию мыши *)
                                  dx := PM.X - PMSave.X; dy := PM.Y - PMSave.Y; (* изменения координат *)
                                  if (dx = 0) and (dy = 0) then Exit;   (* если нет изменений - выйти  *)
                                  PMSave := PM;            (* запомнить текущую позицию мыши           *)
                                  GetWindowRect(h,r);      (* выяснить абсолютные координаты окна      *)
                                  SetWindowPos(h,
                                        HWND_TOP,          (* оставлять перемещаемое окно наверху      *)
                                       r.Left+dx,r.Top+dy, (* новые координаты левого верхнего угла    *)
                                               0,0,        (* ширину и высоту не задаём, т.к.          *)
                                       SWP_NOSIZE);        (* т.к. размер окна не меняем               *)
                                end;
                                 
                                procedure Win_OnLButtonDown(h:HWnd; var Msg:TWMMouse);
                                begin
                                  GetCursorPos(PMSave); (* получить и запомнить абсолютные координаты мыши *)
                                  SetCapture(h);        (* "захватить" мышь окном h                        *)
                                end;
                                 
                                procedure Win_OnLButtonUp(h:HWnd; var Msg:TWMMouse);
                                begin
                                  ReleaseCapture; (* освободить захват мыши окном *)
                                  Win_Move(h);    (* последний сдвиг окна         *)
                                end;
                                 
                                procedure Win_OnMouseMove(h:HWnd; var Msg:TWMMouse);
                                begin
                                  if (Msg.Keys and MK_LBUTTON) = 1  (* если удерживается левая кнопка мыши *)
                                  then Win_Move(h);                 (* то сдвинуть окно                    *)
                                end;
                                 
                                function Win_WindowProc(h: HWnd; AMessage, WParam, LParam: Longint): Longint; stdcall; export;
                                var aMsg : TMessage absolute AMessage;
                                begin
                                  Win_WindowProc := 0;
                                (*   инструкция "absolute" позволяет обойтись без присваиваний :
                                  AMsg.Msg    := AMessage;
                                  aMsg.WParam := WParam;
                                  aMsg.LParam := LParam;
                                  aMsg.Result := 0;
                                *)
                                  case AMessage of
                                    wm_Destroy: begin PostQuitMessage(0); Exit; end;
                                //  wm_Paint       : Win_OnPaint      (h,TWMPaint(aMsg));
                                    wm_MouseMove   : Win_OnMouseMove  (h,TWMMouse(aMsg));
                                    wm_LButtonDown : Win_OnLButtonDown(h,TWMMouse(aMsg));
                                    wm_LButtonUp   : Win_OnLButtonUp  (h,TWMMouse(aMsg));
                                //  wm_KeyDown     : Win_OnKeyDown
                                  end; (* case *)
                                 
                                  Win_WindowProc := DefWindowProc(h, AMessage, WParam, LParam); (* DefaultProc *)
                                end;


                              Добавлено в :
                              2taifun вместо SetWindowLong я использую CreateWindowEx - см. сообщение #8

                              2oygan по поводу сворачивания окна - можно сделать соответствующую обработку на wm_KeyDown.
                              По поводу кнопочек, я бы сделал так:
                              - выделил несколько (список) Rect в своём окне, заполнил их нужными картинками, затем при обработке щелчка мыши сравнивал её координаты со списком координат Rect, выдавал номер найденного Rect или -1. Далее, если номер >= 0 вызывал бы по Case нужную функцию.
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0674 ]   [ 16 queries used ]   [ Generated: 1.10.22, 00:54 GMT ]