Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2013.08.25;
Скачать: [xml.tar.bz2];

Вниз

Свернуть окно   Найти похожие ветки 

 
Deltas ©   (2010-02-18 01:14) [0]

Когда главное окно сворачивается, то показывается анимация его уменьшения по направлению к соответсвующей ему кнопке на панели задач. Подскажите, пожалуйста, как сделать так, чтобы окно уменьшалось по направлению к области уведомлений (системному трею), так, если бы соответствующая кнопка панели задач была в правом нижнем углу экрана. Такую фишку провернули в Касперском 5.


 
brother ©   (2010-02-18 06:47) [1]

Кажется была подобная тема, попробуй поиск по сайту...


 
DVM ©   (2010-02-18 11:06) [2]


> Deltas ©


Ну раз уж Касперский провернул, то и мы смогем. Координаты области уведомлений или иконки вычислишь сам.

Как то так вот:


{******************************************************************************}
{* Демонстрация работы HSHELL_GETMINRECT                                      *}
{* (c)2003 Дмитрий Муратов                                                    *}
{* e-mail: dvmuratov@yandex.ru                                                *}
{* Данный код создан исключительно в демонстрационных целях                   *}
{******************************************************************************}

program ShellHookDemo;

uses
 Windows, Messages, SysUtils;

const
 RSH_DEREGISTER = 0;
 RSH_REGISTER = 1;
 RSH_REGISTER_PROGMAN = 2;
 RSH_REGISTER_TASKMAN = 3;

 HSHELL_ACTIVATESHELLWINDOW = 3;
 HSHELL_WINDOWCREATED = 1;
 HSHELL_WINDOWDESTROYED = 2;
 HSHELL_WINDOWACTIVATED = 4;
 HSHELL_GETMINRECT = 5;
 HSHELL_REDRAW = 6;
 HSHELL_TASKMAN = 7;
 HSHELL_LANGUAGE = 8;

type
 PSHELLHOOKINFO = ^TSHELLHOOKINFO;
 TSHELLHOOKINFO = packed record
   WindowHandle : HWND;
   rc: TSmallRect;
 end;

var
 wc: TWndClassEx;
 MainWnd: HWND;
 Mesg: TMsg;
 WM_ShellHook:Integer;
 xPos, yPos, nWidth, nHeight: Integer;
 osInfo: OSVERSIONINFO;

procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall;external "shell32.dll" index 181;

//------------------------------------------------------------------------------

function WindowProc(wnd: HWND; Msg: Integer; Wparam: Wparam; Lparam: Lparam): Lresult; stdcall;
begin
 if msg = wm_shellhook then
   begin
     case wparam of
       HSHELL_GETMINRECT:
         begin
           with PSHELLHOOKINFO(lParam)^.rc do
             begin
               Left := 10;
               Top := 10;
               Right := 20;
               Bottom := 20;
             end;
           Result := 1;
         end
     else
       Result:=DefWindowProc(wnd,msg,wparam,lparam);
     end;
   end
 else
   case msg of
     wm_destroy :
       begin
         postquitmessage(0);
         Result := 0;
         exit;
       end;
   else
     Result := DefWindowProc(wnd, msg, wparam, lparam);
   end;
End;

//------------------------------------------------------------------------------

begin
 wc.cbSize:=sizeof(wc);
 wc.style:=cs_hredraw or cs_vredraw;
 wc.lpfnWndProc:=@WindowProc;
 wc.cbClsExtra:=0;
 wc.cbWndExtra:=0;
 wc.hInstance:=HInstance;
 wc.hIcon:=LoadIcon(0,idi_application);
 wc.hCursor:=LoadCursor(0,idc_arrow);
 wc.hbrBackground:=COLOR_BTNFACE+1;
 wc.lpszMenuName:=nil;
 wc.lpszClassName:="ShellHookDemo";
 if RegisterClassEx (wc) = 0 then
   MessageBox (0, "Invalid class registration", "Error", MB_OK)
 else
   begin
     xPos:=100; yPos:=150;
     nWidth:=430; nHeight:=250;
     MainWnd:=CreateWindowEx(
       0,
       "ShellHookDemo",
       "ShellHookDemo",
       ws_overlappedwindow,
       xPos,
       yPos,
       nWidth,
       nHeight,
       0,
       0,
       Hinstance,
       nil
       );
     if MainWnd = 0 then
       MessageBox (0, "Window not created", "Error", MB_OK)
     else
       begin
         ShowWindow(MainWnd,CmdShow);
         WM_ShellHook := RegisterWindowMessage("SHELLHOOK");
         if WM_ShellHook<>0 then
           begin
             osInfo.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
             GetVersionEx(osInfo);
             RegisterShellHook(0, 1);
             if(osInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) then
               RegisterShellHook(MainWnd, RSH_REGISTER)
             else
              RegisterShellHook(MainWnd, RSH_REGISTER_TASKMAN);
           end;

         SendMessage(GetDesktopWindow, $400, 0, 0);

         while GetMessage(Mesg,0,0,0) do
         begin
           TranslateMessage(Mesg);
           DispatchMessage(Mesg);
         end;

       end;
   end;
end.



 
DVM ©   (2010-02-18 11:09) [3]

Ах, да, забыл сказать, код выше заставит все окна сворачиваться в угол, если надо свое только окно, то проверять надо WindowHandle в:

PSHELLHOOKINFO = ^TSHELLHOOKINFO;
TSHELLHOOKINFO = packed record
  WindowHandle : HWND;
  rc: TSmallRect;
end;


 
Deltas ©   (2010-02-18 11:30) [4]

Спасибо! :)



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2013.08.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.002 c
2-1355729101
Phoenix7
2012-12-17 11:25
2013.08.25
уникальное имя файла


3-1292023741
Паша
2010-12-11 02:29
2013.08.25
Oracle 9i, получаю разные результаты update, не пойму, где косяк


4-1266515606
leonidus
2010-02-18 20:53
2013.08.25
Определение типа ОС


2-1355296974
Вася
2012-12-12 11:22
2013.08.25
ШИМ из LPT порта


2-1355222180
Darvin
2012-12-11 14:36
2013.08.25
Программная инсталляция драйвера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский