また、ワンクリックのスクリーンショット(C#)

あらすじ



少し前に私はC#の研究を始めました。そしてすぐに、実験は簡単でシンプルであると同時に便利で便利なアプリケーションを書きたいという欲求になりました。 スクリーンショットをすばやく撮影してホスティングに自動的にアップロードするように設計されたプログラムのアイデアが徐々に生まれました。 要件を満たすアナログが見つからなかったので、私はすべて自分でそれを行うことにしました。その後、一人の良い人がそれについて記事を書くというアイデアを思いつきました。



エッセンス



それで私のプログラムは何ができますか?



難しさ



そして今、おそらく、誰かにとって自明で平凡に見えるが、誰かを助けることができる部分。 そのような小さなアプリケーションを開発するときでさえ、判明したように、困難な瞬間を避けることは不可能です。



ホスティングに画像をアップロード


最初に遭遇したのは、ホスティングAPIの使用中のエラーです。イメージはロードされていましたが、ファイルの最後の数キロバイトがどこかに消えていました。 最初は、ホスティング自体でAPI 使用する例の中にある次のコードを使用しました。

using System; using System.IO; using System.Net; using System.Text; namespace ImgurExample { class Program { static void Main(string[] args) { PostToImgur(@"C:\Users\ashwin\Desktop\image.jpg", IMGUR_ANONYMOUS_API_KEY); } public static void PostToImgur(string imagFilePath, string apiKey) { byte[] imageData; FileStream fileStream = File.OpenRead(imagFilePath); imageData = new byte[fileStream.Length]; fileStream.Read(imageData, 0, imageData.Length); fileStream.Close(); string uploadRequestString = "image=" + Uri.EscapeDataString(System.Convert.ToBase64String(imageData)) + "&key=" + apiKey; HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://api.imgur.com/2/upload"); webRequest.Method = "POST"; webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.ServicePoint.Expect100Continue = false; StreamWriter streamWriter = new StreamWriter(webRequest.GetRequestStream()); streamWriter.Write(uploadRequestString); streamWriter.Close(); WebResponse response = webRequest.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader responseReader = new StreamReader(responseStream); string responseString = responseReader.ReadToEnd(); } }
      
      





コードにエラーがありましたが、それらを修正した後でも、問題は消えませんでした。 エラーと試行された多くのオプションを長時間苦労して検索した後、base64で使用されるスラッシュのためにエンコード後にファイルが切り捨てられる可能性があるという仮説に至りました。 おそらくエスケープ文字として解釈されたかもしれませんが、正確に見つけるのは面倒でした:ネットワークに何が起こっているのかを見つけるためににおいを嗅ぐ必要があります(デバッガーでは、streamWriter.Write(uploadRequestString)の呼び出しまですべて問題ありませんでした)、base64シーケンスを比較します。 .p。 この問題はインターネットで特に取り上げられていませんでしたが、スラッシュの疑いもある投稿がいくつかありました。



StackOverflowにあるコードの2番目のバージョンを使用することになりました。

 using (var w = new WebClient()) { var values = new NameValueCollection { { "key", "433a1bf4743dd8d7845629b95b5ca1b4" }, { "image", Convert.ToBase64String(File.ReadAllBytes(@"hello.png")) } }; byte[] response = w.UploadValues("http://imgur.com/api/upload.xml", values); Console.WriteLine(XDocument.Load(new MemoryStream(response))); }">
      
      





それはすでに時計のように機能し、必要に応じて調整するだけで済みました。関数はすべての答えではなく、リンクのみを返す必要があります。



ホットキー


2番目の問題は、ホットキーで発生しました。 RegisterHotKey関数でフックをフックしてグローバルホットキーをインターセプトし、WndProcを再定義してその中のメッセージを認識することをお勧めします。 ここで何が難しいのでしょうか? 難しかったのは、アプリケーションが(WinFormsではあるが)ウィンドウレスであるため、RegisterHotKeyに転送するためのウィンドウハンドルも、WndProcを再定義できるウィンドウ自体もなかったことです。 マニュアルの激しい喫煙の後、記述子は送信されるべきではないことが判明しました-この場合、メッセージはウィンドウではなく、RegisterHotKeyを引き起こしたスレッドに送信されます。 問題の最初の部分は解決されましたが、メッセージ自体をキャッチするものはまだありませんでした。 さらに数杯のコーヒーを飲んだ後、この問題の解決策を見つけました: Application.AddMessageFilter() 。 それを使用するには、メッセージの「フィルター」を実装する必要があります。私の場合、彼はWM_HOTKEYをキャッチし、アプリケーションコンテキストでクリックを返す適切なプロシージャを呼び出しました。 開発に対するこれ以上の障害はありませんでした。



ひれ



もちろん、アプリケーション、フリーウェア、およびソースコードは、 オープンにすることも決定しました。 彼はコードのそれらの場所にコメントを残しましたが、それは私の意見ではそれ自体では明らかではありません。 ローカライズのサポートはありません。インターフェース言語は英語です。 アプリケーションは.NET 4.0の下でVS2010で記述されており、サードパーティのライブラリは使用されていません。 アイコンはiconfinder.comで見つかりました。 私はこのアイデアでユニークなふりをするつもりはありません。プログラムは私の手に詰めるために書かれたもので、その間に特定のタスクに出会い、その解決策を記事で説明しました。



UPD。 リポジトリ全体をダウンロードせずに使用できるように、バイナリを個別に入力しました: ScreenPaste.exe



All Articles