На главную Наши проекты:
Журнал   ·   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
  
> Скриншот неактивного окна программы, содержащей 3д-изображение
    Возникла такая проблема - необходимо снимать скриншоты из игры с определённым промежутком и сохранять их в файл. Хочу кое-что отследить.
    Собственно, помнится раньше я нашёл какой-то метод, если не ошибаюсь, с использованием WM_PRINT или WM_PAINT, который позволял делать скриншоты из неактивного окна почти любых 3д-игр, запущенных в оконном режиме. При этом этот-же метод делал чёрные квадраты вместо скриншотов, если подсунуть ему хэндл обычной программ, которые используют обычные формы/контроли для отрисовки окна.
    А сейчас у меня вплоть до наоборот - с обычных виндосовских форм могу снять скриншот, а с игры - нет.
    ExpandedWrap disabled
        ScreenShot: TBitmap;

    ExpandedWrap disabled
      function WindowSnap(windowHandle: HWND): boolean;
      var
        r: TRect;
        user32DLLHandle: THandle;
        printWindowAPI:function(sourceHandle: HWND; destinationHandle: HDC; nFlags: UINT): BOOL; stdcall;
      begin
        result:=False;
        user32DLLHandle:=GetModuleHandle(user32);
        if user32DLLHandle <> 0 then begin
          @printWindowAPI:=GetProcAddress(user32DLLHandle, 'PrintWindow');
          if @printWindowAPI <> nil then begin
            GetWindowRect(windowHandle, r);
            ScreenShot.Width:=r.Right - r.Left;
            ScreenShot.Height:=r.Bottom - r.Top;
            ScreenShot.Canvas.Lock;
            try
              result:= printWindowAPI(windowHandle, ScreenShot.Canvas.Handle, 0);
              //SendMessage(windowHandle, WM_PRINT, Screenshot.Canvas.Handle, 0);
            finally
              ScreenShot.Canvas.Unlock;
            end;
          end;
        end;
      end;

    ExpandedWrap disabled
      procedure TForm1.Button1Click(Sender: TObject);
      begin
        //MakeScreenShot(HandleList[form1.ComboBox1.ItemIndex]) ;
        WindowSnap(HandleList[form1.ComboBox1.ItemIndex]);
        form2.Show;
        form2.Image1.Picture.Assign(ScreenShot);
      end;
    Хэндл передаю точно корректный. Метод, на который я тогда случайно наткнулся, не был громоздким и не требовал никаких инжектов и прочей подобной ереси. Была такая-же небольшая функция, как и WindowSnap. Bitblts не подходит - оно захватывает область экрана, а не окна.
    Сообщение отредактировано: Sonic Sonedit -
      Млин, ну есть же спец. проги, которые это делают! Ты про google знаешь вообще?
        Мне не нужны спец проги. Мне нужно реализовать это в своём приложении. Сейчас копаю в сторону GDI и BitBlt. Не могу разобраться с реализацией fromhbitmap.
          Нет, BitBlt не смотря на все ухищрения с HDC ловит исключительно кусок экрана и мало чем по сути отличается от copyrect.
            Проблема давно решена. Если кому интересно - в Win7 и в некоторых поздних версиях WinXP (которая видимо у меня до этого и стояла) изменена работа GDI - в связи с этим функция PrintWindow позволяет снимать скриншоты с любой программы, которая работает в оконном режиме.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0231 ]   [ 16 queries used ]   [ Generated: 20.05.24, 13:46 GMT ]