Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
general29
Действуй. Зная WinAPI, ты сто очков дашь вперёд "программистам", которых отсутствие понятия "форма" повергает в ступор.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 21:14 20-10-2007
pit23



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хелп!
 
Нужно программно установить время в винде. Для этого я использую функцию SetLocalTime. Но она работает только под админом, а мне нужно чтобы она работала под учетной записью юзера. Можно ли программно получить право на изменение времени ???

Всего записей: 60 | Зарегистр. 04-03-2006 | Отправлено: 16:05 25-10-2007
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Да, если админ предусмотрел . Вообще, Power Users тоже по дефолту имеют эту привилегию, вроде.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 17:11 25-10-2007
pit23



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer
 
А что должен предусмотреть админ ? Программно значит никак ?
У меня прога работает под учетной записью, которая входит в группу Users
 
 
 

Всего записей: 60 | Зарегистр. 04-03-2006 | Отправлено: 17:27 25-10-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pit23

Цитата:
А что должен предусмотреть админ ?

Дать права на изменение системного времени группе "Users", вестимо.

Цитата:
Программно значит никак ?

А какой тогда смысл в разграничении прав, если бы их так просто было бы обойти?

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 19:08 25-10-2007
pit23



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А какой тогда смысл в разграничении прав, если бы их так просто было бы обойти?

 
Действительно.  
 
Я просто знаю, что для программного выключения компа нужно получить
право на это действие. Я подумал может и в этом случае как-то это возможно сделать.
 
Ну ладно все равно спасибо за помощь.
 
А если запустить прогу от имени администратора, то получиться поменять время?

Всего записей: 60 | Зарегистр. 04-03-2006 | Отправлено: 09:17 26-10-2007 | Исправлено: pit23, 09:19 26-10-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pit23

Цитата:
А если запустить прогу от имени администратора, то получиться поменять время?

Должно. Если администратор сам себе это не запретил, вестимо.


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 09:42 26-10-2007
fox234



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Всем добрый вечер.
 
У меня вот такой вопрос, при решении проблемы с мерцанием стандартных контролов винды, я пришел только к одному решению, сабклассить нужные контролы (перехватывая WM_PAINT) и рисовать их в контекст памяти. Но мне кажется, что это не последний выход. Для этого мне надо выводить и графику окна и графику контролов в один контекст памяти. Но как мне это сделать, ведь контролы рисуются всегда с точки (х = 0, у = 0). Если ли способ сабклассить только один раз?

Всего записей: 5 | Зарегистр. 29-10-2007 | Отправлено: 19:24 21-11-2007 | Исправлено: fox234, 19:30 21-11-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
fox234

Цитата:
Для этого мне надо выводить и графику окна и графику контролов в один контекст памяти.

To force a window to draw into a specific device context, use the WM_PRINT or WM_PRINTCLIENT message. Note that this requires the target window to support the WM_PRINTCLIENT message. Most common controls support the WM_PRINTCLIENT message. (C) MSDN

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 20:12 21-11-2007
fox234



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Abs62
Спасибо за подсказку, к стате где-то я уже про это читал.
Если не трудно, кинь часть сырца или посмотри что я делаю не так:

Код:
 
LONG WINAPI MainWindowProcedure    (
                                    HWND    m_MainWindow,
                                    UINT    Message,
                                    WPARAM    wParam,
                                    LPARAM    lParam
                                )
{
    PAINTSTRUCT    ps;
    HDC            hdc;
    HDC            hdc2;
    POINT        pt1;
 
    switch (Message)  
    {
        case WM_CREATE:
            break;
        case WM_COMMAND:
            break;
        case WM_SIZE:
            break;
        case WM_ERASEBKGND:
        {
            return TRUE;
            break;
        }
        case WM_PAINT:
        {
            hdc = BeginPaint (m_MainWindow, &ps);
            PatBlt(memDC,0,0,m_RC.right-m_RC.left, m_RC.bottom-m_RC.top, BLACKNESS/*PATCOPY*/);
 
            SendMessage(m_MainWindow, WM_PRINTCLIENT, (WPARAM)memDC, (LPARAM)(PRF_CLIENT | PRF_ERASEBKGND | PRF_CHILDREN));
 
            GetClientRect(m_MainWindow, &m_RC);
            BitBlt(hdc, 0, 0, m_RC.right-m_RC.left, m_RC.bottom-m_RC.top, memDC, 0, 0, SRCCOPY);
            EndPaint (m_MainWindow, &ps);
            return true;
        }
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc    (
                                        m_MainWindow,
                                        Message,
                                        wParam,
                                        lParam
                                    );
   }
   return 0;
}
LONG WINAPI SubClassProcedure    (
                                    HWND    Window,
                                    UINT    Message,
                                    WPARAM    wParam,
                                    LPARAM    lParam
                                )
{
    PAINTSTRUCT    ps;
    HDC            hdc;
 
    if(Message == WM_PRINTCLIENT)
    {
        CallWindowProc(oldControlProc, Window, WM_PAINT, wParam, lParam);
        return 0;
    }
    if(Message == WM_PAINT)
    {
        hdc = BeginPaint (Window, &ps);
        EndPaint (Window, &ps);
        return true;
    }
    if(Message == WM_ERASEBKGND)
    {
        return true;
    }
    return    CallWindowProc    (
                                oldControlProc,
                                Window,
                                Message,
                                wParam,
                                lParam
                            );
}
 

Всего записей: 5 | Зарегистр. 29-10-2007 | Отправлено: 23:24 22-11-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
fox234

Цитата:
Если не трудно, кинь часть сырца или посмотри что я делаю не так:

У меня нет такого сырца, я из MSDN цитировал.

Цитата:
            SendMessage(m_MainWindow, WM_PRINTCLIENT, (WPARAM)memDC, (LPARAM)(PRF_CLIENT | PRF_ERASEBKGND | PRF_CHILDREN));

Непонятный вызов. Зачем оконная процедура вызывает саму себя таким образом, если она всё равно не обрабатывает WM_PRINTCLIENT?
Полагаю, вместо этого надо пробежаться по контролам с помощью EnumChildWindows, посылая каждому из них WM_PRINTCLIENT с memDC в WPARAM. MSDN уверяет, что стандартные контролы это сообщение отрабатывают.

Цитата:
    if(Message == WM_PRINTCLIENT)  
    {  
        CallWindowProc(oldControlProc, Window, WM_PAINT, wParam, lParam);  
        return 0;  
    }  

Я бы для начала попробовал оставить WM_PRINTCLIENT на откуп штатному обработчику.


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 00:12 23-11-2007 | Исправлено: Abs62, 00:31 23-11-2007
diaz85

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
добрый вечер.
 
вопрос относительно api функции LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam):
как получить дескриптор именно нужного окна? в моем случае это главная форма проекта. заранее спаибо.  

Всего записей: 39 | Зарегистр. 05-11-2007 | Отправлено: 16:29 23-11-2007
fox234



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Abs62
Что то я здесь опять запарол. Низлежащий код работает, но не доконца. Контрол рисуется в начале координат хоть и должен рисоватся в нужном месте.

Код:
 
//---------------------------------------------------------------------------------------------------------------------------
LONG WINAPI MainWindowProcedure    (
                                    HWND    Window,
                                    UINT    Message,
                                    WPARAM    wParam,
                                    LPARAM    lParam
                                )
{
    RECT        RC1;
    PAINTSTRUCT    ps;
    HDC            hdc;
 
    switch (Message)  
    {
        case WM_CREATE:
        {
            self_TabSheet = CreateWindow    (  
                                                "SysTabControl32",  
                                                "",  
                                                WS_CHILD|WS_VISIBLE,  
                                                0, 0, 0, 0,  
                                                Window,
                                                (HMENU)0,
                                                m_hInstance,
                                                NULL  
                                            );
            SendMessage(self_TabSheet, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(true, 0));
            TabItem.mask = TCIF_TEXT|TCIF_PARAM;    
            TabItem.dwState = 0;
            TabItem.dwStateMask = 0;
            TabItem.pszText = "Система";
            TabItem.cchTextMax = 10;
            TabItem.iImage = 0;
            TabItem.lParam = (LPARAM)0;
            SendMessage(self_TabSheet, TCM_INSERTITEM, 1, (LPARAM)&TabItem);
            TabItem.mask = TCIF_TEXT|TCIF_PARAM;    
            TabItem.dwState = 0;
            TabItem.dwStateMask = 0;
            TabItem.pszText = "Система";
            TabItem.cchTextMax = 10;
            TabItem.iImage = 0;
            TabItem.lParam = (LPARAM)0;
            SendMessage(self_TabSheet, TCM_INSERTITEM, 2, (LPARAM)&TabItem);
            SetWindowLong(self_TabSheet, GWL_WNDPROC, (long)&SubTabControlProc);
            return 0;
        }
        case WM_PAINT:
        {
            GetClientRect(Window, &RC1);
            hdc = BeginPaint (Window, &ps);
            PatBlt(memDC,0,0,RC1.right-RC1.left, RC1.bottom-RC1.top, PATCOPY);
            EnumChildWindows(Window, &DrawControlsProc, 0);
            BitBlt(hdc, 0, 0, RC1.right-RC1.left, RC1.bottom-RC1.top, memDC, 0, 0, SRCCOPY);
            EndPaint (Window, &ps);
            return 0;
        }
        case WM_ERASEBKGND:
        {
            return 1;
        }
        case WM_SIZE:
        {
            GetClientRect(Window, &RC1);
            MoveWindow(self_TabSheet, RC1.left+10, RC1.top+10, RC1.right-20, RC1.bottom-20, true);
            return 0;
        }
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc    (
                                Window,
                                Message,
                                wParam,
                                lParam
                            );
}
//---------------------------------------------------------------------------------------------------
LONG WINAPI SubTabControlProc    (
                                    HWND    Window,
                                    UINT    Message,
                                    WPARAM    wParam,
                                    LPARAM    lParam
                                )
{
    HDC            hdc;
    PAINTSTRUCT    ps;
 
    switch (Message)  
    {
        case WM_PAINT://Выключаем перерисовку без двойной буферизации
        {
            hdc = BeginPaint (Window, &ps);
            EndPaint (Window, &ps);
            return 0;
        }
    }
    return CallWindowProc    (
                                oldTabControlProc,
                                Window,
                                Message,
                                wParam,
                                lParam
                            );
}
//---------------------------------------------------------------------------------
BOOL CALLBACK DrawControlsProc(HWND hwnd, LPARAM lParam)
{
    SendMessage(hwnd, WM_PRINT, (WPARAM)memDC, (LPARAM)(PRF_CLIENT|PRF_CHILDREN));
    return true;
}
//--------------------------------------------------------------------------------------------
 

Всего записей: 5 | Зарегистр. 29-10-2007 | Отправлено: 16:55 23-11-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
diaz85

Цитата:
как получить дескриптор именно нужного окна?

Объясни как именно это самое нужное окно соответствует WindowProc твоего главного окна - там и поговорим.
fox234

Цитата:
хоть и должен рисоватся в нужном месте

Родительское окно - GetParent, детские ты создаёшь сам, и уж будь любезен заботиться о них и  следить за ними.

Цитата:
            self_TabSheet = CreateWindow    (  
                                                "SysTabControl32",  
                                                "",  
                                                WS_CHILD|WS_VISIBLE,  
                                                0, 0, 0, 0,  
                                                Window,  
                                                (HMENU)0,  
                                                m_hInstance,  
                                                NULL  

Ну так где же тут нужное место? Создавая окно, ты задал ему начальные координаты 0, 0 и такие же размеры. Что после этого ты хочешь получить?


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:29 23-11-2007
fox234



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Abs62
Ура, вроде сделал:

Код:
 
//---------------------------------------------------------------------------------------------------------------------------
LONG WINAPI MainWindowProcedure    (
                                    HWND    Window,
                                    UINT    Message,
                                    WPARAM    wParam,
                                    LPARAM    lParam
                                )
{
    RECT        RC1;
    PAINTSTRUCT    ps;
    HDC            hdc;
 
    switch (Message)  
    {
        case WM_CREATE:
        {
            //-----------------------------------
            t1 = GetSystemMetrics(SM_CYCAPTION);
            t2 = GetSystemMetrics(SM_CXSIZEFRAME);
            t3 = GetSystemMetrics(SM_CYSIZEFRAME);
            //-----------------------------------
            self_TabSheet = CreateWindow    (  
                                                "SysTabControl32",  
                                                "",  
                                                WS_CHILD|WS_VISIBLE,  
                                                0, 0, 0, 0,  
                                                Window,
                                                (HMENU)0,
                                                m_hInstance,
                                                NULL  
                                            );
            SendMessage(self_TabSheet, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(true, 0));
            TabItem.mask = TCIF_TEXT|TCIF_PARAM;    
            TabItem.dwState = 0;
            TabItem.dwStateMask = 0;
            TabItem.pszText = "Система";
            TabItem.cchTextMax = 10;
            TabItem.iImage = 0;
            TabItem.lParam = (LPARAM)0;
            SendMessage(self_TabSheet, TCM_INSERTITEM, 1, (LPARAM)&TabItem);
            TabItem.mask = TCIF_TEXT|TCIF_PARAM;    
            TabItem.dwState = 0;
            TabItem.dwStateMask = 0;
            TabItem.pszText = "Система";
            TabItem.cchTextMax = 10;
            TabItem.iImage = 0;
            TabItem.lParam = (LPARAM)0;
            SendMessage(self_TabSheet, TCM_INSERTITEM, 2, (LPARAM)&TabItem);
            SetWindowLong(self_TabSheet, GWL_WNDPROC, (long)&SubTabControlProc);
            return 0;
        }
        case WM_PAINT:
        {
            GetClientRect(Window, &RC1);
            hdc = BeginPaint (Window, &ps);
            PatBlt(memDC,t2,t1+t2,RC1.right-RC1.left, RC1.bottom-RC1.top, PATCOPY);
            //-----------
            SendMessage(Window, WM_PRINT, (WPARAM)memDC, (LPARAM)(PRF_CLIENT|PRF_CHILDREN|PRF_CHECKVISIBLE|PRF_ERASEBKGND|PRF_OWNED));
            //-----
            BitBlt(hdc, 0, 0, RC1.right-RC1.left, RC1.bottom-RC1.top, memDC, t2, t1+t2, SRCCOPY);
            EndPaint (Window, &ps);
            return 0;
        }
        case WM_ERASEBKGND:
        {
            return 1;
        }
        case WM_SIZE:
        {
            GetClientRect(Window, &RC1);
            MoveWindow(self_TabSheet, RC1.left+10, RC1.top+10, RC1.right-20, RC1.bottom-20, true);
            return 0;
        }
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc    (
                                Window,
                                Message,
                                wParam,
                                lParam
                            );
}
//---------------------------------------------------------------------------------------------------
LONG WINAPI SubTabControlProc    (
                                    HWND    Window,
                                    UINT    Message,
                                    WPARAM    wParam,
                                    LPARAM    lParam
                                )
{
    HDC            hdc;
    PAINTSTRUCT    ps;
 
    HWND pWnd = GetParent(Window);
    switch (Message)  
    {
        case WM_PAINT://Выключаем перерисовку без двойной буферизации
        {
            InvalidateRect(pWnd, NULL, true);
            hdc = BeginPaint (Window, &ps);
            EndPaint (Window, &ps);
            return 0;
        }
    }
    return CallWindowProc    (
                                oldTabControlProc,
                                Window,
                                Message,
                                wParam,
                                lParam
                            );
}
//---------------------------------------------------------------------------------
 

Глянь, мож чё лишнее. И правильно ли я сделал имитацию необходимости в перерисовке
Код:
InvalidateRect(pWnd, NULL, true);

Всего записей: 5 | Зарегистр. 29-10-2007 | Отправлено: 22:53 23-11-2007 | Исправлено: fox234, 22:56 23-11-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
fox234
Чессс-говоря, лень проверять. Смотри сам: правильно или нет - смотри по факту. Если действия программы соответствует заданию - правильно, если нет - кочевряжься дальше.
Да, на всякий случ1ай:

Цитата:
For some common controls, the default WM_PAINT message processing checks the wParam parameter. If wParam is non-NULL, the control assumes that the value is an HDC and paints using that device context.

Мало ли понадобится.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 01:49 24-11-2007
Dmitro25

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Всем привет!
Пишу собственный аналог инспектора объектов. Для реализации мне понадобилось создать аналог ComboBox'a. Проблема с выпадающим списком (аналог системного ComboLBox). Он реализован с использованием CreateWindow('ComboLBox', ..., организацией собственного цикла обработки сообщений и т.д. Для отслеживания кликов мыши вне области окна приходится делать SetCapture (впрочем, так сделано и в системном ComboLBox). Но! В этом случае не работает прокрутка (ScrollBar) внутри моего окна. В смысле полоса прокрутки появляется когда надо, но при клике мыши на ней перемещение ползунка не происходит. Как это победить?  
Привожу пример кода (сорри, что на Delphi, но пример, мне кажется, понятен):

Код:
 
var
  hlb: THandle;
  OldWndProc: Pointer;
 
function ComboLBoxWindowProc(Wnd: HWND; Msg, wParam, lParam: Longint): Longint; stdcall;
begin
  Result:=CallWindowProc(OldWndProc, wnd, Msg, wParam, lParam);
  case Msg of
    WM_LBUTTONDOWN:
    begin
      ReleaseCapture;
      ShowWindow(hlb, SW_HIDE);
    end;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  hlb:=CreateWindowEx(WS_EX_TOPMOST or WS_EX_TOOLWINDOW ,
    'ComboLBox', '',
    WS_CHILD or WS_CLIPSIBLINGS or WS_BORDER or WS_VSCROLL or WS_VISIBLE,
    100, 100, 100, 200, handle, 0, HInstance, nil);
  windows.SetParent(hlb, 0);
  OldWndProc:=Pointer(GetWindowLong(hlb, GWL_WNDPROC));
  SetWindowLong(hlb, GWL_WNDPROC, integer(@ComboLBoxWindowProc));
 
  for i:=1 to 20 do
    SendMessage(hlb, LB_ADDSTRING, 0, integer(pchar('12345')));
  SetCapture(hlb);
end;
 

Всего записей: 31 | Зарегистр. 13-12-2005 | Отправлено: 12:30 03-12-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dmitro25
Думаю, надо проверять, произошло ли событие мыши над окном полосы прокрутки, и если да - передать его туда на обработку через SendMessage.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 20:37 03-12-2007
Dmitro25

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Abs62
Извини, не понял, куда передать? Ведь обработчик оконых сообщений и так мною перекрыт.

Всего записей: 31 | Зарегистр. 13-12-2005 | Отправлено: 07:24 04-12-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dmitro25
Перекрыт обработчик окна комбобокса. А полоса прокрутки - это тоже окно, со своим обработчиком. И если оно не получит сообщение от мыши (а оно и не получит, если мышь захвачена - все сообщения пойдут захватившему её окну), естественно, оно на щелчки и не будет реагировать. Посмотри в сторону ChildWindowFromPoint.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 09:02 04-12-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru