Re[3]: А расскажите за Винду
От: ononim  
Дата: 27.07.14 21:43
Оценка:
_>Ну как бы это всё прогресс, но даже близко не имеет отношения к каким-то революционным изменениям.
_>Вот WinRT — это действительно что-то типа революции. Только вот существенно запоздавшей — далеко не факт, что сейчас взлетит. Тем более, что старый api на десктопе никто не запрещает, а metro пока и не особо актуально.
Ну по моему революция — далеко не всегда то что что видно невооруженным глазом.. Ну да ладно.

O>>С помощью них сама винда, и все (сильно) желающие могут впендюривать свои окошки туда, где обычно показываются Win'RT приложения.

_>О, очень интересно. Не в смысле нашей дискуссии (это тоже явно не какая-то революция), а просто лично для меня. Это что, позволяет нам из обычного приложения влезть в метро интерфейс или что?
Да. С учетом некоторых ээ.. хитростей... А именно — не любой процесс может это сделать. Могут похоже лишь подписанные микрософтом, но и то — не все. explorer.exe — может. Потому если хочется влезть в метроинтерфейс, то можно заинжектить в экплорер свою длл, которая должна выполнить примерно такой вот код в нем:
typedef HWND (WINAPI *CreateWindowInBandProc)(DWORD dwExStyle, LPCWSTR lpClassName,
                     LPCWSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, 
                     HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam, DWORD dwBand);

    CreateWindowInBandProc pCreateWindowInBand = (CreateWindowInBandProc)
        ::GetProcAddress(::GetModuleHandle(TEXT("user32.dll")), "CreateWindowInBand");
    if (!pCreateWindowInBand)
    {
        ::MessageBox(0, TEXT("CreateWindowInBand not found"), TEXT("Hello"), MB_ICONWARNING);
        return;
    }

    DWORD cy = ::GetSystemMetrics(SM_CYMAXIMIZED), y = 10, x = 10;
    TCHAR txt[0x100] = {0};
    for (DWORD i = 0; i<=0x20; ++i)
    {
        wsprintf(txt, TEXT("Band %u\n"), i);
        HWND w = pCreateWindowInBand(WS_EX_TOPMOST, TEXT("Edit"), txt, 
            WS_VISIBLE|WS_OVERLAPPEDWINDOW, x, y, 200, 40, 0, 0, ::GetModuleHandle(0), 0, i);
        if (!w)
        {
            wsprintf(txt, TEXT("Failed %u\n"), i);
            pCreateWindowInBand(WS_EX_TOPMOST, TEXT("Edit"), txt, 
                WS_VISIBLE|WS_OVERLAPPEDWINDOW, x, y, 200, 40, 0, 0, ::GetModuleHandle(0), 0, 0);
        }
      if (( (y+= 40 ) +40)>=cy) 
        {
            y = 10;
            x+= 200;
        }
    }
    ::MessageBox(0, TEXT("In loop.."), TEXT("Hello"), MB_ICONWARNING);
}

Это работало полтора года назад на свежезарелизенной восьмерке — создавались окошки везде где можно А сейчас могли добавить дополнительные ректальные оградки. Но по факту — все это ваше RT — не более чем надстройка над старым добрым вендогуем
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.