Что не смогло не зацепить меня.... Аж слеза навернулась... Спасибо тем, кто это сделал!
Super Mario Bros Theme Orcestra
Screenshoot C#
Скриншот, как известно, это моментальный снимок экрана. И делается он одним волшебным нажатием кнопки PrintScreen (PrtScr). Ловкость рук и никакого мошейничества... Далее снимок экрана помещается в буффер обмена Windows, откуда его можно вытащить не менее волшебным нажатием сочетания кнопок Ctrl+V или воспользовавшись пунктом меню "Вставить" графического редактора (или не графического.... каждый вставляет куда хочет ;) ).
А теперь, как это реализовать на C#.
PictureBox screenshootBox = new PictureBox();
//Нажмем на кнопочку PrintScreen
SendKeys.Send("{PRTSC}");
//А теперь получим изображение из буффера обмена
screenshootBox.Image = Clipboard.GetImage();
Вот и всё. Опять же только ловкость рук....
Правда, тут есть маленький нюанс - вышепреведенный код сделает скриншот исключительно окна активного приложения, так как класс SendKeys
предоставляет методы для отправки сообщений о нажатиях клавиш исключительно текущему приложению (http://msdn.microsoft.com/ru-ru/library/system.windows.forms.sendkeys.aspx). Если мы хотим получить скриншот всего экрана, то нужно поступить несколько иначе.
Во-первых, нам надо сделать активным десктоп, а после этого уже послать ему сообщение о нажатии кнопки. Но для начала нам надо получить хэндл десктопа.
Для этого потребуются функции FindWindow, FindWindowEx, SetForegroundWindow, которые нужно для начала импортировать из user32.DLL.
[DllImport("user32.DLL")]
public static extern IntPtr FindWindow(string lpszClass, string lpszWindow);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern bool SetForegroundWindow(IntPtr hwnd);
Только после этого их можно использовать в коде. Код для получения скриншота всего экрана прост:
//ищем хэндл дэсктопа
IntPtr vHandle = FindWindow("Progman", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SysListView32", null);
//сделаем активным окно по полученному хэндлу
SetForegroundWindow(vHandle);
//Нажмем на кнопочку PrintScreen
SendKeys.Send("{PRTSC}");
Вот и все.
Маленькую тестовую программку вы можете скачать отсюда (36 KB)
UPD: Спасибо за комментарии. Описанный выше способ получения скриншота лучше не использовать, а статью рассматривать как альтернативный способ выстрелить себе в ногу для сильных духом:
1) если кто-то очистит буффер обмена между вызовами MakeSreenshoot() и GetScreenshoot(), то сделанный снимок экрана пропадёт.
2) весь этот зоопарк с импортированием системных win32 dll в .net и вызовом методов оттуда не есть хорошая практика. Например, теряется кроссплатформенность кода (зависимость от win platform dll), нужны привелегии для импортирования dll ( SecurityPermission(SecurityPermissionFlag.UnmanagedCode) ). Гораздо лучше и проще воспользоваться средствами, предоставляемыми библиотекой .net. Несколько примеров таких решений можно найти в комментариях.
Таблица html-кодов символов
Сводная таблица HTML-кодов | |||||||||
---|---|---|---|---|---|---|---|---|---|
" | " | & | & | < | < | > | > | | |
¡ | ¡ | ¢ | ¢ | £ | £ | ¤ | ¤ | ¥ | ¥ |
¦ | ¦ | § | § | ¨ | ¨ | © | © | ª | ª |
« | « | ¬ | ¬ | ® | ® | ¯ | ¯ | ° | ° |
± | ± | ² | ² | ³ | ³ | ´ | ´ | µ | µ |
¶ | ¶ | · | · | ¸ | ¸ | ¹ | ¹ | º | º |
» | » | ¼ | ¼ | ½ | ½ | ¾ | ¾ | ⅛ | ⅛ |
⅜ | ⅜ | ⅝ | ⅝ | ⅞ | ⅞ | ¿ | ¿ | À | À |
Á | Á | Â | Â | Ã | Ã | Ä | Ä | Å | Å |
Æ | Æ | Ç | Ç | È | È | É | É | Ê | Ê |
Ë | Ë | Ì | Ì | Í | Í | Î | Î | Ï | Ï |
Ð | Ð | Ñ | Ñ | Ò | Ò | Ó | Ó | Ô | Ô |
Õ | Õ | Ö | Ö | × | × | Ø | Ø | Ù | Ù |
Ú | Ú | Û | Û | Ü | Ü | Ý | Ý | Þ | Þ |
ß | ß | à | à | á | á | â | â | ã | ã |
ä | ä | å | å | æ | æ | ç | ç | è | è |
é | é | ê | ê | ë | ë | ì | ì | í | í |
î | î | ï | ï | ð | ð | ñ | ñ | ò | ò |
ó | ó | ô | ô | õ | õ | ö | ö | ÷ | ÷ |
ø | ø | ù | ù | ú | ú | û | û | ü | ü |
ý | ý | þ | þ | ÿ | ÿ | Ć | Ć | ć | ć |
ı | ı | IJ | IJ | ij | ij | Ł | Ł | ł | ł |
Œ | Œ | œ | œ | Š | Š | š | š | Ÿ | Ÿ |
Ž | Ž | ž | ž | ƒ | ƒ | ˇ | ˇ | ˘ | ˘ |
˙ | ˙ | ˚ | ˚ | ˛ | ˛ | ˝ | ˝ | Α | Α |
Β | Β | Γ | Γ | Δ | Δ | Ε | Ε | Ζ | Ζ |
Η | Η | Θ | Θ | Ι | Ι | Κ | Κ | Λ | Λ |
Μ | Μ | Ν | Ν | Ξ | Ξ | Ο | Ο | Π | Π |
Ρ | Ρ | Σ | Σ | Τ | Τ | Υ | Υ | Φ | Φ |
Χ | Χ | Ψ | Ψ | Ω | Ω | α | α | β | β |
γ | γ | δ | δ | ε | ε | ζ | ζ | η | η |
θ | θ | ι | ι | κ | κ | λ | λ | μ | μ |
ν | ν | ξ | ξ | ο | ο | π | π | ρ | ρ |
ς | ς | σ | σ | τ | τ | υ | υ | φ | φ |
χ | χ | ψ | ψ | ω | ω | ϑ | ϑ | ϕ | ϕ |
ϖ | ϖ | ϵ | ϵ | – | – | — | — | ‘ | ‘ |
’ | ’ | ‚ | ‚ | “ | “ | ” | ” | „ | „ |
† | † | ‡ | ‡ | • | • | ‰ | ‰ | ′ | ′ |
″ | ″ | ‹ | ‹ | › | › | ‾ | ‾ | ⁄ | ⁄ |
€ | € | ℏ | ℏ | ℑ | ℑ | ℘ | ℘ | ℜ | ℜ |
™ | ™ | ℵ | ℵ | ← | ← | ↑ | ↑ | → | → |
↓ | ↓ | ↔ | ↔ | ↕ | ↕ | ↵ | ↵ | ⇐ | ⇐ |
⇑ | ⇑ | ⇒ | ⇒ | ⇓ | ⇓ | ⇔ | ⇔ | ⇕ | ⇕ |
∀ | ∀ | ∂ | ∂ | ∃ | ∃ | ∅ | ∅ | ∇ | ∇ |
∈ | ∈ | ∉ | ∉ | ∋ | ∋ | ∏ | ∏ | ∑ | ∑ |
− | − | ∓ | ∓ | ∗ | ∗ | √ | √ | ∝ | ∝ |
∞ | ∞ | ∠ | ∠ | ∧ | ∧ | ∨ | ∨ | ∩ | ∩ |
∪ | ∪ | ∫ | ∫ | ∴ | ∴ | ∼ | ∼ | ≃ | ≃ |
≅ | ≅ | ≈ | ≈ | ≠ | ≠ | ≡ | ≡ | ≢ | ≢ |
≤ | ≤ | ≥ | ≥ | ≪ | ≪ | ≫ | ≫ | ⊂ | ⊂ |
⊃ | ⊃ | ⊄ | ⊄ | ⊅ | ⊅ | ⊆ | ⊆ | ⊇ | ⊇ |
⊕ | ⊕ | ⊗ | ⊗ | ⊥ | ⊥ | ⋅ | ⋅ | ⌈ | ⌈ |
⌉ | ⌉ | ⌊ | ⌊ | ⌋ | ⌋ | 〈 | ⟨ | 〉 | ⟩ |
⎛ | ⎛ | ⎜ | ⎜ | ⎝ | ⎝ | ⎞ | ⎞ | ⎟ | ⎟ |
⎠ | ⎠ | ⎡ | ⎡ | ⎢ | ⎢ | ⎣ | ⎣ | ⎤ | ⎤ |
⎥ | ⎥ | ⎦ | ⎦ | ⎧ | ⎧ | ⎨ | ⎨ | ⎩ | ⎩ |
⎪ | ⎪ | ⎫ | ⎫ | ⎬ | ⎬ | ⎭ | ⎭ | ⎯ | ⎯ |
│ | │ | □ | □ | ◊ | ◊ | ○ | ○ | ☜ | ☜ |
☞ | ☞ | ♠ | ♠ | ♣ | ♣ | ♥ | ♥ | ♦ | ♦ |
✓ | ✓ |
Как вытащить картинку из поля OLE из Access
Недавно столкнулась с такой проблемой - надо было организовать работу с БД Access через php. Извращение в чистом виде, особенно, если учесть, что в бд были столбцы типа OLE, в которых хранились картинки. А эти картинки надо было отображать на странице. Долго искала решение, но так нигде и не нашла.
На одном из сайтов прочитала, что при сохранении картинки в столбец OLE Аксес добавляет заголовок. О длине этого заголовка точно известно не было - в одном месте утверждали, что он 78 байт, в другом - что зависит от региональных настроек. Час от часу не легче....
На самом деле, как показала практика, фиксированной длины у этого заголовка нет.
В итоге всех моих поисков, методом тыка я нашла собственное решение. И оно оказалось элементарно просто!!! В базе, с которой пришлось мне работать, все картинки были в основном в bmp-формате, поэтому я приведу пример кода для конкретного случая.
И так, для начала нужно подключиться к бд с помощью odbc (более подробно как сделать это описано тут):
$connection = odbc_connect( $dsn, $user, $pwd);
Далее делаем запрос на выборку поля с картинкой:
$result = odbc_exec($connection, "Select Foto From Users Where UserID=1");
Теперь надо извлечь данные. Тут есть одна тонкость. Так как картинка больше 4096 байт (это длина данных , возвращаемая по умолчанию для LONG столбцов ), то нужно указать, что хотим, нет, даже требуем! чтобы нам передали большее количество данных с помощью функции odbc_longreadlen:
if ($result!== FALSE)
{
odbc_longreadlen($result, 1048576);
odbc_fetch_row($result, 0);
$data = odbc_result($result, "Foto");
Стандартный bmp начинается со символов "BM". Так как Аксес добавляет свой заголовок к данным файла и в нем могут встречатится такое же сочетание букв, то искать начало нашей картинки будем после фразы "PBrush", которая находится в конце заголовка, который добавляет аксес. Дело за малым, осталось из полученных данных вырезать картинку и отправить ее в браузер:
$data = substr($data, strpos($data, "BM", strpos($data, "PBrush")));
header("Content-type: ".image_type_to_mime_type(IMAGETYPE_BMP));
echo $data;
exit;
}
Для форматов gif, png, jpeg понадобиться только искать соответствующий формату заголовок.
Для изображений, который были сохранены с отметкой Microsoft PhotoEditor 3.0, я так решения и не нашла :(
Ярлыки
Копирайты
Блог о жизни вне кода
Постоянные читатели
Популярно
-
Понравился анекдот о колбасе и яйцах :) Жена посылает мужа-программиста в магазин: - Дорогой, купи, пожалуйста, палку колбасы, и если б...
-
Продолжаю серию постов о своём первом андроид-приложении. Сегодня мысли о публикации приложения в разных маркетах.
-
Бета-версия одиннадцатой cтудии вызвала много охов и ахов. Чтобы там ни говорили, работать в ней приятно, хоть по началу немного необычно. ...
-
Jquery.Inputmask - крутой (да-да, именно) плагин, добавляющий гибкости в работу с обычным текстовым полем для ввода. Плагин является ус...
-
Перевод поста "Top 10 Things That Annoy Programmers" Кевина Панга. Оригинал тут
-
Разделяй и влавствуй - подход на все времена. Концепция модульного программирования не нова, и хорошо себя зарекомендовала. В мире разрабо...
-
Фридман А.Л. - Основы объектно-ориентированной разработки программных систем. ( скачать ) Книга написана как учебное пособие для студентов ...
-
Steve Freeman, Nat Pryce. Growing Object-Oriented Software, Guided by Tests ( скачать ) Test-Driven Development (TDD) is now an established...
-
Для некоторых методов класса Microsoft Code Analysis даёт такой совет: CA1822 : Microsoft.Performance : The 'this' parameter (or ...