На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Ошибка вставки изображения из буфера
    Приветствую. Надеюсь кто-то ткнёт меня носом в ошибку, я уже всё перепробовал.

    Есть вот такой вот код:
    ExpandedWrap disabled
      // Скриншот
          keybd_event(VK_SNAPSHOT,MapVirtualKey(VK_SNAPSHOT,0),0,0);
          keybd_event(VK_SNAPSHOT,0,0,0);
       
          Graphics::TBitmap *bmp = new Graphics::TBitmap();
          bmp->LoadFromClipboardFormat(CF_BITMAP, Clipboard()->GetAsHandle(CF_BITMAP), 0);
          delete bmp;


    Заголовок Clipbrd.hpp подключён.

    При срабатывании кода вываливается ошибка " raised exception class EInvalidGraphic with message 'Unsupported clipboard format' "
    Я так понимаю что ему не нравится формат (CF_BITMAP) изображения в буфере обмена.

    Пробовал прописать (CF_PICTURE). Такой же результат. Помогите пожалуйста с этим вопросом. Какой формат нужно указать?
      А в билдере работает
      ExpandedWrap disabled
        bmp.Assign(Clipboard);
      ?
        Цитата MBo @
        А в билдере работает
        ExpandedWrap disabled
          bmp.Assign(Clipboard);
        ?

        ExpandedWrap disabled
          [C++ Error] Unit1.cpp(288): E2034 Cannot convert 'TClipboard * (_fastcall *)()' to 'TPersistent *'
          [C++ Error] Unit1.cpp(288): E2342 Type mismatch in parameter 'Source' (wanted 'TPersistent *', got 'TClipboard * (_fastcall *)()')


        Добавлено
        Офигеть... Такого я ещё не видел :lol:

        Всему причиной была софтина, :wall: которая была запущена в операционке. Называется она Clipdiary - clipdiary.com

        Очень удобная вешь, часто ей пользуюсь. Но как только я её вырубил, то программа моя перестала падать и всё отлично грузится :good:

        Всем спасибо. Решение найдено

        Добавлено
        Хотя нет, это я погорячился... Сейчас у меня немного другой код.

        ExpandedWrap disabled
                  keybd_event(VK_MENU, 0, 0 ,0);
                  Sleep(10);
                  keybd_event(VK_SNAPSHOT,MapVirtualKey(VK_SNAPSHOT,0),0,0);
                  keybd_event(VK_SNAPSHOT,0,0,0);
                  keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP,0);  
           
              Graphics::TBitmap *bmp = new Graphics::TBitmap();
              TClipboard *cl = new TClipboard;
              OpenClipboard(cl);
           
              bmp->LoadFromClipboardFormat(CF_PICTURE, cl->GetAsHandle(CF_PICTURE), 0);
           
          if (cl->HasFormat(CF_BITMAP))
          ShowMessage("BITMAP");
          if (cl->HasFormat(CF_METAFILEPICT))
          ShowMessage("METAFILEPICT");
          if (cl->HasFormat(CF_PICTURE))
          ShowMessage("PICTURE");
          delete cl;



        Программка всё так же вываливается с той же ошибкой, но перед этим успевает показать через ShowMessage 2 окна о том, что это BITMAP и PICTURE
        Я что-то уже совсем запутался :wall:
          Объект клипборда не нужно создавать, это синглтон

          OpenClipboard - API функция, требует хэндл окна или ноль

          Вот как работает в Delphi, но работает через раз - вероятно, скриншот не всегда срабатывает, с порядком нажатия клавиш я не разбирался

          ExpandedWrap disabled
            var
              bmp: TBitmap;
            begin
              keybd_event(VK_MENU, 0, 0, 0);
              Sleep(10);
              keybd_event(VK_SNAPSHOT, MapVirtualKey(VK_SNAPSHOT, 0), 0, 0);
              keybd_event(VK_SNAPSHOT, 0, 0, 0);
              keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
             
              bmp := TBitmap.Create;
              if ClipBoard.HasFormat(CF_BITMAP) then begin
                bmp.Assign(ClipBoard);
                Image1.Canvas.Draw(0, 0, bmp);
              end
              else
                Caption := 'no bitmap available'
          Сообщение отредактировано: MBo -
            MBo
            Спасибо за советы. Я вроде разобрался. Хотя сам не понял что изменилось.

            Вроде ничего особо в коде не поменялось, кроме условия... И стало работать нормально...
            Вот если кому пригодится...

            ExpandedWrap disabled
              // Делаем скриншот
                      keybd_event(VK_MENU, 0, 0 ,0);
                      Sleep(10);
                      keybd_event(VK_SNAPSHOT,MapVirtualKey(VK_SNAPSHOT,0),0,0);
                      keybd_event(VK_SNAPSHOT,0,0,0);
                      keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP,0);
               
                  Graphics::TBitmap *bmp = new Graphics::TBitmap();
                  TClipboard *cl = new TClipboard;
                  OpenClipboard(cl);
                  Sleep(1000);
                      if (cl->HasFormat(CF_BITMAP))
                              {
                              bmp->LoadFromClipboardFormat(CF_BITMAP, cl->GetAsHandle(CF_BITMAP), 0);
                              }
                              else ShowMessage ("FAIL CF_BITMAP");
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0262 ]   [ 16 queries used ]   [ Generated: 27.04.24, 08:53 GMT ]