ããããããšãªããæå ã«Visual Studio 2015ãããã®ã§ããã¡ããæ°ããCïŒãããžã§ã¯ããäœæããŸããã ããã¯éåžžã«äŸ¿å©ã§ãããç§ã¯ä»¥åã«å°ããªCïŒããã°ã©ã ããã§ã«å®è¡ããŸããã
ã¿ã¹ã¯1
PrintScreenããã³Alt + PrintScreenãã¿ã³ãæŒãã°ããŒãã«ãªã€ã³ã¿ãŒã»ããã è»èŒªãåçºæããªãããã«ãæ°åéã®ã°ãŒã°ã«ã§ãã»ãšãã©ããã«è§£æ±ºçãèŠã€ãããŸãã ã äžçªäžã®è¡ã¯ãuser32.dllã®WH_KEYBOARD_LLã§LowLevelKeyboardProcã³ãŒã«ããã¯é¢æ°ãšSetWindowsHookExé¢æ°ã䜿çšããããšã§ãã 2ã€ã®çµã¿åãããã€ã³ã¿ãŒã»ããããããã®ããããªå€æŽã«ãããã³ãŒãã¯æ©èœããããŒã¹ãããŒã¯ãæ£åžžã«ãã£ããããŸããã
ããŒã¹ãããŒã¯ãã£ããã£ã³ãŒã
namespace ScreenShot_Grab { static class Program { private static MainForm WinForm; /// <summary> /// . /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); _hookID = SetHook(_proc); Application.Run(new MainForm()); UnhookWindowsHookEx(_hookID); } private const int WH_KEYBOARD_LL = 13; //private const int WH_KEYBOARD_LL = 13; private const int VK_F1 = 0x70; private static LowLevelKeyboardProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; private static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { Keys number = (Keys)Marshal.ReadInt32(lParam); //MessageBox.Show(number.ToString()); if (number == Keys.PrintScreen) { if (wParam == (IntPtr)261 && Keys.Alt == Control.ModifierKeys && number == Keys.PrintScreen) { // Alt+PrintScreen } else if (wParam == (IntPtr)257 && number == Keys.PrintScreen) { // PrintScreen } } } return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); } }
ã¿ã¹ã¯2
ããŒãæŒãããšãã«å®éã«ã¹ã¯ãªãŒã³ã·ã§ããããã£ããã£ããŸãã ããäžåºŠã°ãŒã°ã«ã§è§£æ±ºçãèŠã€ãããŸãã ã ãã®å ŽåãGetForegroundWindowé¢æ°ãšGetWindowRecté¢æ°ã¯ãã¹ãŠãæšæºã®.NET Graphics.CopyFromScreené¢æ°ãšåãuser32.dllããã®ãã®ã§ãã ããã€ãã®ãã§ãã¯ãšã³ãŒãã¯æ©èœããŸããã1ã€ã®åé¡ããããŸã-ãŠã£ã³ããŠã®å¢çããã£ããã£ããŸãã å°ãåŸã§ãã®è³ªåã®è§£æ±ºçã«æ»ããŸãã
ã¹ã¯ãªãŒã³ã·ã§ãããã£ããã£ã³ãŒã
class ScreenCapturer { public enum CaptureMode { Screen, Window } [DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll")] private static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect); [StructLayout(LayoutKind.Sequential)] public struct Rect { public int Left; public int Top; public int Right; public int Bottom; } public Bitmap Capture(CaptureMode screenCaptureMode = CaptureMode.Window) { Rectangle bounds; if (screenCaptureMode == CaptureMode.Screen) { bounds = Screen.GetBounds(Point.Empty); CursorPosition = Cursor.Position; } else { var handle = GetForegroundWindow(); var rect = new Rect(); GetWindowRect(handle, ref rect); bounds = new Rectangle(rect.Left, rect.Top, rect.Right, rect.Bottom); //CursorPosition = new Point(Cursor.Position.X - rect.Left, Cursor.Position.Y - rect.Top); } var result = new Bitmap(bounds.Width, bounds.Height); using (var g = Graphics.FromImage(result)) { g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size); } return result; } public Point CursorPosition { get; protected set; } }
ã¿ã¹ã¯3
ã¹ã¯ãªãŒã³ã·ã§ãããã³ã³ãã¥ãŒã¿ãŒã«ä¿åãããšããã¹ãŠãéåžžã«ç°¡åã§ãBitmap.Saveé¢æ°ã䜿çšããã ãã§ååã§ããã
private void save_Click(object sender, EventArgs e) { if (lastres == null) { return; } // base36 Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; var FileName = base_convert(unixTimestamp.ToString(), 10, 36); lastres.Save(spath + FileName); }
ã¿ã¹ã¯4
ãµãŒããŒã«ã¹ã¯ãªãŒã³ã·ã§ãããã¢ããããŒããããšããã¹ãŠãåçŽãªããã«èŠããŸããããŸã£ããæ£ãããããŸããã å°ãèããåŸãããªãåçŽãªã¢ã€ãã¢ãæãæµ®ãã³ãŸãã-ãapplication / octet-streamãããããŒãšWebClient.UploadDataé¢æ°ã䜿çšããŠãã€ããªåœ¢åŒã§WebClientã䜿çšãããµãŒããŒåŽã§file_get_contentsã䜿çšããŠããŒã¿ãååŸããïŒãphpïŒ//å ¥åã ïŒ å®éãç§ã¯ããããŸãããæ°è¡ã§éåžžã«åçŽãªphpã¹ã¯ãªãããäœæãããã®ãã¹ãŠãããã°ã©ã ã«æ·»ä»ããŸããã çµè«-ã¹ã¯ãªãŒã³ã·ã§ãããä¿åããã³ããŒãããŸãã ããã«å ããŠãçããªã³ã¯ãçæããããã®ç°¡åãªã¢ã«ãŽãªãºã ãèŠã€ããå¿ èŠããããŸãããããã¯ãBase36ã䜿çšããint unixã®ç§åäœïŒLinuxãšããã¯ïŒã®æéã§ãéåžžã«ã·ã³ãã«ã§ãšã¬ã¬ã³ããªæ¹æ³ãã°ãŒã°ã«ã§æ€çŽ¢ããŸãã
// bitmap byte[] private Byte[] BitmapToArray(Bitmap bitmap) { if (bitmap == null) return null; using (MemoryStream stream = new MemoryStream()) { bitmap.Save(stream, ImgFormat[Properties.Settings.Default.format]); return stream.ToArray(); } } private void upload_Click(object sender, EventArgs e) { using (var client = new WebClient()) { client.Headers.Add("Content-Type", "application/octet-stream"); try { var response = client.UploadData(svurl, BitmapToArray(lastres); var result = Encoding.UTF8.GetString(response); if (result.StartsWith("http")) { System.Diagnostics.Process.Start(result); } } catch { } } }
ãã¹ãPHPã¹ã¯ãªãã
<?php $file = file_get_contents("php://input"); $id = base_convert(time(), 10, 36); file_put_contents("img/".$id.".png",$file); echo "http://".$_SERVER['SERVER_NAME']."/img/".$id.".png"; ?>
ã¹ã¯ãªãŒã³ã·ã§ããç·šé
ãããããã¹ã¯ãªãŒã³ã·ã§ããããªããšãããŠããã«ç·šéããŠããµãŒããŒã«ã¢ããããŒããããã£ãã®ã§ãã å¥ã®ç»åãšãã£ã¿ãŒãçºæãã代ããã«ããã£ããã£ãããã¹ã¯ãªãŒã³ã·ã§ããïŒãã£ã¹ã¯ã«ä¿åãããæåŸã®ã¹ã¯ãªãŒã³ã·ã§ããïŒã§ãã€ã³ããéããç·šéããã¿ã³ãäœæããç·šéåŸããã®ãã¡ã€ã«ãå®å šã«ãµãŒããŒã«ã¢ããããŒãããããšãã§ããŸããã
private void edit_Click(object sender, EventArgs e) { if (lastres == null) return; if (lastfile == "") save_Click(sender, e); Process.Start("mspaint.exe", "\"" + lastfile + "\""); }
èšå®
ãŸããã©ããã§ãµã€ãã®URLãæå®ããã¹ã¯ãªãŒã³ã·ã§ãããä¿åããããã©ã«ãã®ãã©ã«ããŒãæå®ããå¿ èŠããããŸããããã®çµæãããã瀺ãããšãã§ããèšå®ã®åçŽãªåœ¢åŒãäœæãããŸããã ããã«ãSystem.Diagnostics.Process.Starté¢æ°ã䜿çšããŠããã¹ãŠãããã«ç°¡åãã€é«éã«ããããã«ãããã©ã«ããŒãéãããã¿ã³ãäœæããŸããã ããã«ã圌ã¯ãã¬ã€ã«æå°åããããã°ã©ã ãããã«æããŸããã
çµå±ã æåã®å®çšãããã¿ã€ãã¯æºåãã§ããŠã㊠ã 次ã®ããã«èŠããŸããã
æ€çŽ¢ãã
ãã¹ãŠãè¯ãããã«èŠããŸãããäœãæ¬ ããŠããããæããã«ãªããŸããã ãã¬ãã¥ãŒãã¿ã³ããããŸããã§ããïŒ ãã©ã«ããŒãéããã[ç·šé]ãã¯ãªãã¯ããŠãéä¿¡ããåã«ç»é¢ãããã£ããã£ããããã®ã確èªããã®ã¯å°ãäžå¿«ã§ããã ãã®çµæããã¬ãã¥ãŒãã©ãŒã ããã°ããã¹ã±ããããŸããããã©ãŒã ã«ãã«ã¹ã¯ãªãŒã³ã®ã¹ã¯ãªãŒã³ã·ã§ããã衚瀺ããããšã«ã¯å°ããªåé¡ãããïŒãã¬ãŒã ä»ãïŒããã¬ãŒã ãåé€ããããªãã£ãã®ã§ïŒçç±ãããããŸããïŒãçµæãšããŠãã©ãŒã ã§ã¹ã¯ããŒã«ããå®å šã«é©ããŠããŸãã
private void PreviewForm_Load(object sender, EventArgs e) { if (form1.lastfile!="") { img.Image = Image.FromFile(form1.lastfile); } else { img.Image = form1.lastres; } ClientSize = new Size(img.Image.Width + 10, img.Image.Height + 10); img.Width = img.Image.Width+10; img.Height = img.Image.Height+10; if (img.Image.Width >= Screen.PrimaryScreen.Bounds.Width || img.Image.Height >= Screen.PrimaryScreen.Bounds.Height) { WindowState = FormWindowState.Maximized; } CenterToScreen(); }
ç»åãã©ãŒããã
ããã«å ããŠãããŸããŸãªåœ¢åŒã§ã¹ã¯ãªãŒã³ã·ã§ãããä¿åããå¿ èŠããããŸããïŒããã©ã«ãã®PNGã ãã§ãªãïŒãããã¯ãã¹ãŠåãBitmap.Saveé¢æ°ã䜿çšããŠç°¡åã«è§£æ±ºã§ããããã§ãããã ããjpgç»åã®å質ã¯ç§ã«ã¯é©ããŠããŸããã jpgã®å質ãæå®ããæ©èœã¯ããã»ã©æçœã§ã¯ãããŸããã§ãããè¿ éãªgoogle ã解決çã§ãã Bitmap.Saveã«è¿œå ãã©ã¡ãŒã¿ãŒEncoderParameterã䜿çšããŠå®è£ ãããŸãã
// private ImageCodecInfo GetEncoder(ImageFormat format) { ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); foreach (ImageCodecInfo codec in codecs) { if (codec.FormatID == format.Guid) { return codec; } } return null; } internal void SaveFile(string FilePath, ImageFormat format) { var curimg = lastres; if (format == ImageFormat.Jpeg) { System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality; ImageCodecInfo Encoder = GetEncoder(format); EncoderParameters myEncoderParameters = new EncoderParameters(1); myEncoderParameters.Param[0] = new EncoderParameter(myEncoder, Properties.Settings.Default.quality); curimg.Save(stream, Encoder, myEncoderParameters); } else { curimg.Save(FilePath, format); } }
ãŸããã¹ã¯ãªãŒã³ã·ã§ãããä¿åããåŸã«ãã©ã«ããŒãèªåçã«éãããšãšãããŒãåŸã«ãªã³ã¯ãèªåçã«éãããšã®ã¢ã€ãã¢ãçãŸããŸããã ãããããã«å®è£ ããèšå®ã«ãã§ãã¯ããŒã¯ãè¿œå ããŸããã ãªã³ã¯ãã¯ãªããããŒãã«ã³ããŒããæ©èœãè¿œå ããŸããã
ãã¬ãã¥ãŒãã¿ã³ãè¿œå ããåŸãããã°ã©ã ã¯äœããã®åœ¢ã§ãééã£ããããã«èŠãå§ãããã¿ã³ã®ã¬ã€ã¢ãŠããã°ãã°ãã«ãªããå°ãèããŠããã¿ã³ãåé 眮ããããã次ã®ããã«ãªããŸããã
ãã€ããŒãªæ¹å
å°ãäŒãã§èããŠã¿ããšããŸã 足ããªããã®ãã€ãŸãæåŸã®ã¹ã¯ãªãŒã³ã·ã§ããã®ããŠã³ããŒãã«é¢ããæ å ±ãããããŸããã 察å¿ãããã£ãŒã«ããäœæããã¯ãªãã¯ãããšãªã³ã¯ããã©ãããšãã§ããŸããã ããã«ãã¹ã¯ãªãŒã³ã·ã§ãããæ®ããŸã§ãä¿å/ç·šéãã¿ã³ã«ã¢ã¯ã»ã¹ã§ããªãããã«ããŸããã ããŠããã1ã€è§ŠããŸã-ç°¡åãªèª¬æãããŒãžã§ã³ããã«ãæ¥ãå«ããããã°ã©ã ã«ã€ããŠããã¿ã³ãè¿œå ããŸããïŒã¡ãªã¿ã«ãæ¥ä»ãååŸããããã«ãã¢ããªã±ãŒã·ã§ã³èªäœã®ã¿ã€ãã«ããæ¥ä»ãååŸããŠããœãªã¥ãŒã·ã§ã³ãå床Googleã§æ€çŽ¢ããŸãã ïŒã
ãããã®ã¢ã¯ã·ã§ã³ã次ã®çµæãåºããåŸã®åèšïŒ
å°ãåŸã«ãæåŸã«ä¿åãããã¡ã€ã«ãååãªè¡šç€ºã§ã¯ãªãããšã«æ°ä»ããããã«è¿œå ããClipboard.SetTextã䜿çšããŠãªã³ã¯/ãã¹ãã¯ãªããããŒãã«ã³ããŒã§ããã³ã³ããã¹ãã¡ãã¥ãŒïŒå³ã¯ãªãã¯ïŒãå°ç¡ãã«ããŠããããã®ãã£ãŒã«ããããæ©èœçã«ããŸããã
ããã°ã©ã ã®æºåãããŒã«ãªãŒãŒã·ã§ã³
ãŸããäž»ãªæ©èœã¯æºåãã§ããŠããŠããã¹ãŠãããŸããã£ãããã§ãããããŠç§ã¯ããã°ã©ã ã人ã ãšå ±æã§ããŸããïŒ ãããè¡ãå Žåãå°ãªããšãè±èªãããŒã«ã©ã€ãºããã³è¿œå ã§ããããã«ããå¿ èŠããããŸãã 幞ããªããšã«ãã¹ã¿ãžãªã¯ããããã¹ãŠãå®æçãªæ段ã§ç°¡åã«å®è£ ã§ããã®ã§ããã®ãã¹ãŠã翻蚳ãå§ããŸããã åèšçµæïŒ
äžéšã®ã¡ãã»ãŒãžã翻蚳ããã«ã¯ãæ°ãããªãœãŒã¹ãã¡ã€ã«ãäœæããŠããã次ã®ããã«è¡ãååŸããå¿ èŠããããŸããã
internal ResourceManager LocM = new ResourceManager("ScreenShot_Grab.Resources.WinFormStrings", typeof(MainForm).Assembly); LocM.GetString("key_name");
ãã·ã¢èªã®WinFormStrings.resxãå«ããã¡ã€ã«ããããŸããããã¯ãResourcesãã©ã«ããŒã«é 眮ããè±èªã®WinFormStrings.en.resxçšã§ãã
ããããèšèªãå€æŽããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®åèµ·åãå¿ èŠã§ããããã¡ããããããªãã§ã§ããããã«ãããã£ãã®ã§ããã幞ããªããšã«ããã®åé¡ã®è§£æ±ºçããããããã«é©çšããŸããã ããã«å ããŠãã¢ããªã±ãŒã·ã§ã³ã§ãµããŒããããŠããèšèªã®ãªã¹ããååŸããå¿ èŠããããŸããïŒå°æ¥ãããŒã«ã©ã€ãºãçªç¶å¢ããå ŽåïŒãåèšã§ã ãã®ãããªãœãªã¥ãŒã·ã§ã³ã googleããŠãããããã¹ãŠãçµã¿åãããŠæ¬¡ã®æ§æãååŸããŸãïŒ
ãªã¢ã«ã¿ã€ã ã®èšèªå€æŽã³ãŒã
private void ChangeLanguage(string lang) { foreach (Form frm in Application.OpenForms) { localizeForm(frm); } } private void localizeForm(Form frm) { var manager = new ComponentResourceManager(frm.GetType()); manager.ApplyResources(frm, "$this"); applyResources(manager, frm.Controls); } private void applyResources(ComponentResourceManager manager, Control.ControlCollection ctls) { foreach (Control ctl in ctls) { manager.ApplyResources(ctl, ctl.Name); Debug.WriteLine(ctl.Name); applyResources(manager, ctl.Controls); } } private void language_SelectedIndexChanged(object sender, EventArgs e) { var lang = ((ComboboxItem)language.SelectedItem).Value; if (Properties.Settings.Default.language == lang) return; UpdateLang(lang); } private void UpdateLang(string lang) { Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang); ChangeLanguage(lang); Properties.Settings.Default.language = lang; Properties.Settings.Default.Save(); form1.OnLangChange(); } private void Form2_Load(object sender, EventArgs e) { language.Items.Clear(); foreach (CultureInfo item in GetSupportedCulture()) { var lc = item.TwoLetterISOLanguageName; var citem = new ComboboxItem(item.NativeName, lc); //Debug.WriteLine(item.NativeName); // if (item.Name == CultureInfo.InvariantCulture.Name) { lc = "ru"; citem = new ComboboxItem("", lc); } language.Items.Add(citem); if (Properties.Settings.Default.language == lc) { language.SelectedItem = citem; } } } private IList<CultureInfo> GetSupportedCulture() { //Get all culture CultureInfo[] culture = CultureInfo.GetCultures(CultureTypes.AllCultures); //Find the location where application installed. string exeLocation = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path)); //Return all culture for which satellite folder found with culture code. IList<CultureInfo> cultures = new List<CultureInfo>(); foreach(var cultureInfo in culture) { if (Directory.Exists(Path.Combine(exeLocation, cultureInfo.Name))) { cultures.Add(cultureInfo); } } return cultures; }
ãŠã£ã³ããŠã§ããŒããŒããã£ããã£ããåé¡
ãããŠä»ãç§ã¯ãŠã£ã³ããŠã®å¢çããã£ããã£ããåé¡ã«æ»ããŸãããã®åé¡ã¯æåã«èªåãŠã£ã³ããŠããªãã³ã°æ©èœïŒèšå®ã«è¿œå ããŸããïŒã䜿çšããŠè§£æ±ºããããŠã£ã³ããŠ10ã®å€ãæå®ããŸãããã解決çãããæŸèæã§ããã ç§ãããã§è©±ããŠããããšãæ確ã«ããããã«ãç§ãæå³ãããã®ã®ã¹ã¯ãªãŒã³ã·ã§ããããããŸãïŒ
ïŒæ°ããããŒãžã§ã³ã®ã¹ã¯ãªãŒã³ã·ã§ããïŒ
ã¹ã¯ãªãŒã³ã·ã§ããã§èŠãããšãã§ããããã«-ãŠã£ã³ããŠã«å ããŠããã®å¢çç·ãšãã®äžã«ãã£ããã®ããã£ããã£ãããŸããã é·ãéãã®åé¡ã解決ããæ¹æ³ãã°ãŒã°ã«ã§èª¿ã¹ãŸããããåé¡ã®è§£æ±ºçãå®éã«èª¬æãããã®èšäºã«åºããããŸãããæçµçã«ã¯ãWindows Vista以éã§ã¯dwmapiã䜿çšããŠãšã¢ããªã©ã«åºã¥ããŠæ£ãããŠã£ã³ããŠã®å¢çç·ãååŸããå¿ èŠããããŸã ã³ãŒããå°ãä¿®æ£ããããšã§ãdwmapiã«ãã€ã³ããããåé¡ã¯æçµçã«å®å šã«è§£æ±ºãããŸããã ããããä»¥æ¥ ãŠã£ã³ããŠã®ããªãã³ã°æ©èœã¯ãã§ã«äœæãããŠããã®ã§ããã®ãŸãŸã«ããŠããããšã«ããŸããããããã誰ãã圹ã«ç«ã€ã§ãããã
[DllImport(@"dwmapi.dll")] private static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out Rect pvAttribute, int cbAttribute); public Bitmap Capture(CaptureMode screenCaptureMode = CaptureMode.Window, bool cutborder = true) { ... var handle = GetForegroundWindow(); var rect = new Rect(); // Win XP if (Environment.OSVersion.Version.Major < 6) { GetWindowRect(handle, ref rect); } else { var res = -1; try { res = DwmGetWindowAttribute(handle, 9, out rect, Marshal.SizeOf(typeof(Rect))); } catch { } if (res<0) GetWindowRect(handle, ref rect); } ...
ImgurãµããŒã
ãã®åŸãèãçŽããåŸãç§ã¯ãã¹ãŠã®äººã«ããã°ã©ã ãå ¬éããã®ã§ããããããµãŒããŒã«ã¢ããããŒããã以å€ã«äœããã®ãµãŒãã¹ã«ããŠã³ããŒãããããšããå§ãããŸããããããã°ãããã°ã©ã ã¯ãã䟿å©ã«ãªããããã䜿çšããããã«ç¬èªã®ãµãŒããŒãå¿ èŠãšããªããªã©ã§ããã«ã ç§ã¯é·ãéimgur.comã䜿çšããŠãããã·ã³ãã«ãªapiããã ãããã«ãã€ã³ãããããšã«ããŸããã ãããå匷ããåŸã«åº§ã£ãåŸãAPIã¯æåã«å¿åããŠã³ããŒããå®è£ ããå°ãåŸã«ã¢ã«ãŠã³ãããã€ã³ãããæ©èœãå®è£ ããŸããã ããã«ã圌ã¯ããã°ã©ã ã§æåŸã«ããŠã³ããŒãããç»åãåé€ããæ©èœãå®è£ ããŸããïŒãµãŒãã¹ã®ã¿ïŒã
APIã®å®è£ ã³ãŒããå®å šã«ã¯èª¬æããŸããã.NETFramework 4.5ã®HttpClientãšMultipartFormDataContentã䜿çšããŠç»åãimgurã«ã¢ããããŒãããåæã«ãç»åãèªã¿èŸŒãã³ãŒãããµãŒããŒã«åéä¿¡ããŸãããã³ãŒãã éäžã§ãç§ã¯ãŠãŒã¶ãŒãšãŒãžã§ã³ããš$ _GET [ããŒ]ããŒãèå¥æ¹æ³ãšããŠäœ¿çšããŸããããäœããå®å šãªæ¿èªãå°ç¡ãã«ãããã¯ãããŸããã§ããïŒçè«çã«ã¯é£ããããšã§ã¯ãããŸãããïŒã
private void uploadfile(bool bitmap = true) { byte[] data; if (bitmap && !imgedit) { data = BitmapToArray(lastres); } else { if (!File.Exists(lastfile)) { MessageBox.Show(LocM.GetString("file_nf"), LocM.GetString("error"), MessageBoxButtons.OK, MessageBoxIcon.Error); return; } data = File.ReadAllBytes(lastfile); } HttpContent bytesContent = new ByteArrayContent(data); using (var client = new HttpClient()) using (var formData = new MultipartFormDataContent()) { ... formData.Add(bytesContent, "image", "image"); try { var response = client.PostAsync(url, formData).Result; if (!response.IsSuccessStatusCode) { MessageBox.Show(response.ReasonPhrase, LocM.GetString("error"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); lastlabel.Text = LocM.GetString("error"); lastlabel.Enabled = false; } else { ... }
ãã®çµæãå®å šã«æ©èœçãã€æ©èœçãªããã°ã©ã ãå®æããŸããããã®ããã°ã©ã ã¯ãåœåäºå®ããŠãããããã¯ããã«å€ãã®ããšãã§ããŸãã
ãã®ãšãã®èšå®ã®ãªã¹ãã¯æ¬¡ã®ããã«ãªããŸããã
Win XPäºæ
Windows XPãšã®äºææ§ã«ã€ããŠèãå§ããåŸã.NET Framework 4.0ã®ã¿ããµããŒãããMultipartFormDataContentã¯v4.5ã§ã®ã¿äœ¿çšå¯èœã§ãããSystem.Net.Httpããã±ãŒãžãã€ã³ã¹ããŒã«ããããšã§v4.0ã§æ¥ç¶ã§ããŸãã ç§ã¯ããããã£ãã ãããŠãWindows Vista / 7ã§ã¯ãããã°ã©ã ãæ©èœããããã«.NET Framework 4.0ãã€ã³ã¹ããŒã«ããå¿ èŠãããããšãé€ããŠããã¹ãŠãããŸãããããã§ãã ãããžã§ã¯ãã3.5ã«åãæ¿ããŠãWebClientãžã®ã¢ããããŒãç»åãæžãçŽãããã¡ã€ã«ãã¢ããããŒããã代ããã«ãbase64圢åŒã®ãšã³ã³ãŒããããç»åãæã€éåžžã®ãã£ãŒã«ãã䜿çšããŸãããããã¯ãimgurã®apiããã®ãããªç»åãã¢ããããŒãããããšãèš±å¯ããŠããããã®ãªãã·ã§ã³ã®phpã¹ã¯ãªãããæžãæããããšã¯é£ãããªãã£ãããã§ã ãããŠããããžã§ã¯ããããŒãžã§ã³2.0ã«åãæ¿ããããšã決å®ããŸãããæ°è¡ãå¹³å¡ã«ç·šéããçµæãå®å šã«æ©èœãã.NET Framework 2.0ãããžã§ã¯ãã«ãªããŸããã
using (var client = new WebClient()) { var pdata = new NameValueCollection(); ... pdata.Add("image", Convert.ToBase64String(data)); try { var response = client.UploadValues(url, "POST", pdata); var result = Encoding.UTF8.GetString(response); ...
$file = base64_decode($_POST["image"]);
ããã«ãããå€ããã¬ãŒã ã¯ãŒã¯ã§ããã°ã©ã ãå®è¡ããWindows Vista / 7ã§äœãã€ã³ã¹ããŒã«ããã«å®è¡ã§ããããã«ãªããŸããã ãã®èšäºã«ãããšã Windows Vistaã«ã¯v2.0ãå«ãŸããWindows 7ã«ã¯ããã©ã«ãã§v3.5ãå«ãŸããŠããŸãã ããããåé¡ã¯ããã§çµãããŸããã§ããã Windows 8以éã§ã¯ã.NET Framework v3.5ã®ã€ã³ã¹ããŒã«ãæ±ããããã«ãªããŸããããããã¯ç¢ºãã«æªãã§ãããæ§æå ã®supportedRuntimeãªãã·ã§ã³ã調æŽããããšã«ããã ãã®æ å ±ã®ãããã§åé¡ã¯ããã«è§£æ±ºãããåé¡ãªãæ°ããããŒãžã§ã³ãŸãã¯å€ãããŒãžã§ã³ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ã§ããããã«ãªããŸããã ããã«ã圌ã¯TLS 1.2ãããã³ã«ãå©çšå¯èœã§ããã°ïŒã€ãŸãã.NET Framework 4.5ãæèŒããã·ã¹ãã ã§ïŒäœ¿çšã§ããããã«ããŸããã
app.config
<startup> <supportedRuntime version="v4.0"/> <supportedRuntime version="v2.0.50727"/> </startup>
TLS 1.2ãµããŒã
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls; try { System.Net.ServicePointManager.SecurityProtocol |= (SecurityProtocolType)3072; //SecurityProtocolType.Tls12; } catch { }
ã€ãã³ãå±¥æŽ
æŠããŠãç§ã¯ããã§ååãªãã®ã¯ãã¹ãŠãªãªãŒã¹ã§ãããšæã£ãŠããŸããããããã§ããŸã äœããæ¬ ããŠããŸãã-ãã°ã§ã®ã¢ã¯ã·ã§ã³ã®å±¥æŽã ç§ã¯ãPCãimgurãããã¡ã€ã«ãåé€ããããã¡ã€ã«/ãªã³ã¯ãéããã³ã³ããã¹ãã¡ãã¥ãŒã䜿çšããŠãã¹/ãªã³ã¯ãã³ããŒãããªã©ãããã€ãã®æ©èœãåãã察å¿ãããŠã£ã³ããŠã®éçºãéå§ããŸããã ãŸãããªã¹ãããã€ãã³ãããã°ãã¡ã€ã«ã«ä¿åããèšå®ã§èªåçã«èšå®ããããšãã§ããŸããã
éåžžã«æçãªãŠã£ã³ããŠã衚瀺ãããŸããïŒ
Win XPã§ã®HookCallbackã®åé¡
ãããã1ã€ã®åé¡ãæããã«ãªããŸãããWindowsXPã§ã¯ãsrkinshotsããã£ããã£ãããšãã«ãã¬ã³ãŒãã2åè¿œå ãããŸããã ãã¹ãäžã«ãããŒã解æŸããããšãã«HookCallbackã2ååŒã³åºãããããšãããããŸãããããã®åäœã®çç±ã¯æ確ã§ã¯ãããŸããã§ããããåé¡ãç°¡åã«è§£æ±ºããŸãã-ããŒã¹ãããŒã¯ãè¿œå ãã¹ãããŠå€æ°ã«ä¿åããããŒã解æŸããŠå€æ°ãfalseã«å€æŽãããšãæçµçã«ããŒããªãªãŒã¹ãããšãã«ã³ãŒããåŠçãããã®ã¯1åã ãã§ãã
private static bool pressed = false; private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { Keys number = (Keys)Marshal.ReadInt32(lParam); //MessageBox.Show(number.ToString()); if (number == Keys.PrintScreen) { if (pressed && wParam == (IntPtr)261 && Keys.Alt == Control.ModifierKeys && number == Keys.PrintScreen) { var res = Scr.Capture(ScreenCapturer.CaptureMode.Window, Properties.Settings.Default.cutborder); WinForm.OnGrabScreen(res, false, true); pressed = false; } else if (pressed && wParam == (IntPtr)257 && number == Keys.PrintScreen) { var res = Scr.Capture(ScreenCapturer.CaptureMode.Screen); WinForm.OnGrabScreen(res); pressed = false; } else if (wParam == (IntPtr)256 || wParam == (IntPtr)260) { pressed = true; // fix for win xp double press } } } return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam); }
ã²ãŒã ããã¹ã¯ãªãŒã³ã·ã§ããããã£ããã£ããéã®åé¡
ãã®åŸããã¹ãäžã«ããã«ã¹ã¯ãªãŒã³ã¢ããªã±ãŒã·ã§ã³ïŒã²ãŒã ãªã©ïŒããã¹ã¯ãªãŒã³ã·ã§ããããã£ããã£ããåé¡ãçºçããŸãããWindows10ã§ã¯ãéåžžã®ããªã³ãã¹ã¯ãªãŒã³ãåé¡ãªããã®ããžãã¹ããã£ããã£ããŠããããšã«æ°ä»ããŸããããã®çµæãã¯ãªããããŒãããç»åã貌ãä»ããæ©èœãè¿œå ãããã¯ãªããããŒãã代ããã«äœ¿çšãããèªåã®ããã«ãèšå®ã«ãããåã蟌ãã§åé¡ã解決ããããããããåå©7以äžã§å€æããã®ã§ãããŸããããªãã®ã§ãåé¡ãç 究ãå§ããDirectX泚å°ã䜿çšããå¿ èŠãããããªãé£ããã¿ã¹ã¯ã§ããããšã«æ°ä»ããã åé¡ã¯ãçµå±ã®ãšãããäž»ãªç®æšã¯ã²ãŒã ããã¹ã¯ãªãŒã³ã·ã§ããããã£ããã£ããããšã§ã¯ãªããšããããšã§ããããã«ã¯ä»ã«ãå€ãã®ããã°ã©ã ãããŒã«ããããŸãã
éäžã§ãèšå®ãè¿œå ããèšå®ã¡ãã¥ãŒãåç·šéããŠã解å床ã640 * 480ãã¯ã»ã«ã®ç»é¢ã«åãŸãããã«ã³ã³ãã¯ãã«ãã次ã®ããã«ãªããŸããã
ãŸãããã¬ã€ã¢ã€ã³ã³ãããæ©èœçã«ããå³ã¯ãªãã¯æã«ãã¹ãŠã®éèŠãªæ©èœãè¿œå ããŸããã
Win98ããã³Win2000ã§ç¢ºèªããŠãã ãã
å®éšã®ããã«ãä»®æ³ãã·ã³ã«Windows 2000 SP4ããã³98 SEãå±éããããã«.NET Framework 2.0ãã€ã³ã¹ããŒã«ããŸããã ç°¡åã§ã¯ãããŸããã§ãã ããã€ãã®ãããã®ã€ã³ã¹ããŒã«ãšWindowsã€ã³ã¹ããŒã©ãŒã®æŽæ°ãå¿ èŠã§ããã ããããããã§ãããŸããããã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããšããŸããã
Windows 2000 SP4ã§å€æããããã«ãã¢ããªã±ãŒã·ã§ã³ã¯å®å šã«æ©èœããããšãå€æããŸããããWindows 98 SEã§ã¯ããŒãã£ããã£ãæ©èœããããããã¡ããã®è²Œãä»ããæ©èœããŸããã§ãããããã¡ã€ã«ããã®ã¹ã¯ãªãŒã³ã·ã§ããã®èªã¿èŸŒã¿ã¯åé¡ãªãæ©èœããŸããã å®éããããã®åé¡ã¯è§£æ±ºã§ãããæ å ±ãã»ãšãã©ãªãããWH_KEYBOARD_LLããã©ã¡ãŒã¿ãWindows 2000ã§ã®ã¿è¿œå ãããããšãããããŸããããããã¡ããç Žæããã€ã¡ãŒãžã®çç±ã«é¢ããæ å ±ã¯èŠã€ãããŸããã§ããã åèšæå°èŠä»¶-Windows 2000ã
ãããã£ãŠãããã€ãã®ãã§ãã¯ããããã°ãããã³ãã€ããŒãªä¿®æ£ã®åŸãããã°ã©ã ã¯æçµçã«æºåãæŽããæçµããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
æ®ã£ãŠããã®ã¯ãgithubãªããžããªã®äœæããœãŒã¹ã®ããŠã³ããŒããã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ãã€ã«ãreadmeã®äœæããªãªãŒã¹ã®äœæã ãã§ãã ãããéçºã¹ããŒãªãŒã®çµããã§ãã å®æããããã°ã©ã ãããŠã³ããŒãããŠã GitHubã§ãœãŒã¹ã³ãŒãã確èªã§ããŸãã èšäºãã圹ã«ç«ãŠã°å¹žãã§ãã