Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.219.95.244] |
|
Сообщ.
#1
,
|
|
|
Приветствую. Надеюсь кто-то ткнёт меня носом в ошибку, я уже всё перепробовал.
Есть вот такой вот код: // Скриншот 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). Такой же результат. Помогите пожалуйста с этим вопросом. Какой формат нужно указать? |
Сообщ.
#2
,
|
|
|
А в билдере работает
bmp.Assign(Clipboard); |
Сообщ.
#3
,
|
|
|
Цитата MBo @ А в билдере работает bmp.Assign(Clipboard); [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 *)()') Добавлено Офигеть... Такого я ещё не видел Всему причиной была софтина, которая была запущена в операционке. Называется она Clipdiary - clipdiary.com Очень удобная вешь, часто ей пользуюсь. Но как только я её вырубил, то программа моя перестала падать и всё отлично грузится Всем спасибо. Решение найдено Добавлено Хотя нет, это я погорячился... Сейчас у меня немного другой код. 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 Я что-то уже совсем запутался |
Сообщ.
#4
,
|
|
|
Объект клипборда не нужно создавать, это синглтон
OpenClipboard - API функция, требует хэндл окна или ноль Вот как работает в Delphi, но работает через раз - вероятно, скриншот не всегда срабатывает, с порядком нажатия клавиш я не разбирался 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' |
Сообщ.
#5
,
|
|
|
MBo
Спасибо за советы. Я вроде разобрался. Хотя сам не понял что изменилось. Вроде ничего особо в коде не поменялось, кроме условия... И стало работать нормально... Вот если кому пригодится... // Делаем скриншот 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"); |