|
クリックでもその色を取得
自身のウィンドウ内のカーソルの位置や色の取得ならWPFにも用意されているんだけど、自身のウィンドウ外、画面上のどこでもって場合にはWPFだけではできないようで、Windows APIやWindows.Formsの関数を使ってできた
できたっていっても9割方解説サイトのコピペになった
デザイン画面
StackPanelの中にTextBlockを3つ用意
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Threading;//タイマー用
//System.DrawingとSystem.Windows.Formsを参照に追加する必要がある
//System.Drawingは画面全体をキャプチャするために
//System.Windows.Formsはマウスカーソルの画面上での座標の取得のため
//一定時間ごとにマウスカーソル位置を取得、その座標の1ピクセルをキャプチャして、その色を取得
namespace _20190302_アプリの外でもカーソル下の色取得
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
//クリックされているか判定用
[System.Runtime.InteropServices.DllImport("user32.dll")] private static extern short GetKeyState(int nVirtkey);
public MainWindow()
{
InitializeComponent();
//タイトルバーにアプリの名前(アセンブリ名)表示
var info = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
Title = info.ProductName;
//タイマーの設定、一定時間ごとにマウスカーソルの状態を見る
var timer = new DispatcherTimer(DispatcherPriority.Normal);
//timer.Interval = new TimeSpan(100000);//ナノ秒
timer.Interval = new TimeSpan(0, 0, 0, 0, 10);//10ミリ秒毎(0.01秒毎)
timer.Start();
timer.Tick += Timer_Tick;
}
//タイマーのTickイベント時
private void Timer_Tick(object sender, EventArgs e)
{
System.Drawing.Point p = System.Windows.Forms.Cursor.Position;//マウスカーソル位置取得
Color c = GetPixelColor(p.X, p.Y);//マウスカーソル位置の色取得
var b = new SolidColorBrush(c);
MyTextBlockColor.Background = b;
MyTextBlockColor.Text = c.ToString();
MyTextBlockCursorLocation.Text = $"マウスの位置 = {System.Windows.Forms.Cursor.Position}";
if (IsClickDown())
{
MyTextBlockGetColor.Background = b;
}
}
//クリック判定
private bool IsClickDown()
{
//マウス左ボタン(0x01)の状態、押されていたらマイナス値(-127)、なかったら0
return GetKeyState(0x01) < 0;
}
//画面上の指定座標の1ピクセルの色を返す
private Color GetPixelColor(int x, int y)
{
//1x1サイズのBitmap作成
using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(
1, 1, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
{
using (var bmpGraphics = System.Drawing.Graphics.FromImage(bitmap))
{
//画面全体をキャプチャして指定座標の1ピクセルだけBitmapにコピー
bmpGraphics.CopyFromScreen(x, y, 0, 0, new System.Drawing.Size(1, 1));
//ピクセルの色取得
System.Drawing.Color color = bitmap.GetPixel(0, 0);
//WPF用にSystem.Windows.Media.Colorに変換して返す
return Color.FromArgb(color.A, color.R, color.G, color.B);
}
}
}
}
} 参照に追加する
System.Windows.FormsとSystem.Drawingを追加するのは
System.Drawing.GraphicsクラスのCopyFromScreenで画面全体から指定座標の1ピクセルをキャプチャして、1ピクセルのSystem.Drawing.Bitmapを作成してBitmapのGetPixelで色を取得
指定座標のマウスカーソル位置取得で
System.Windows.Forms.Cursor.Position
この2つのためで、WPFでもアプリ上でのキャプチャやカーソル位置取得はあるんだけどねえ、アプリの外になるとないみたいで探したけど見つからなかった
マウスの左ボタンが押されたかどうかの判定もWindows APIを利用している
なんだかWPF以外の機能ばかりになってしまった
ギットハブ
参照したところ
C# - 【C#】画面上のクリックされた地点のRGB値を取得したい|teratail Graphics.CopyFromScreen Method(System.Drawing) | Microsoft Docs 画面のキャプチャ
タイマにより一定時間間隔で処理を行うには?(WPFタイマ編):.NET TIPS - @IT WPFでスクリーンショットの取得 - SourceChord 関連記事
2016/3/3
WPFとVB.NETで表示した画像をクリックした場所の色を取得はややこしい ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ 2016/3/4
WPFとVB.NETで表示した画像をクリックした場所の色を取得はややこしい(後編) ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ |

>
- コンピュータとインターネット
>
- コンピュータ
>
- ソフトウェア






アプリケーション制作の勉強になります。
なんか、Yahoo!知恵ノートに続いて、Yahoo!ブログが終焉みたいで、今までの遺産をどうしようか途方にくれています・・・
[ PSP ]
2019/3/4(月) 午後 11:12
> PSPさん
Yahoo!ブログ終了でたくさんの記事、情報が失われますよねえ、とても残念です
どこかに移転して画像のリンクは大丈夫だとしても、記事に貼り付けたblogs.yahoo.co.jpのリンクの変更は手作業になるはず、と思っているけどどうなるんでしょうねえ、そういうのが楽なとこがあればいいなあ
[ わてん@午後 ]
2019/3/5(火) 午前 11:12
知恵ノートで掲載していた、RGB←→HSV・HSL変換式の記事を、Yahoo!ブログへ移転して安心していたら、今度はYahoo!ブログ閉鎖とはひどすぎです・・・。
FC2ブログだと、引越しツールで簡単に移転できました。
移転先→ https://colormodel.blog.fc2.com/
https://colormodel.blog.fc2.com/blog-entry-569.html
記事はちゃんと引っ越されているけど、分類(書庫)がメチャクチャになっていて、再整理する気が起きません。
プロフィールとか各種設定は、改めて設定しないとダメみたいです。
[ PSP ]
2019/3/6(水) 午前 0:15
> PSPさん
もう移転されたんですね、速い
のんびり屋(めんどくさいことは後回し)の僕は秋ぐらいにしようかなあと思っています。
分類(書庫)が引き継がれないのは辛いですねえ
今見てきたんですけど、横幅が広いからプログラムのコードは見やすいのはいいですね。
さらに1記事での文字数制限も画像数制限もないとあって、かなり魅力を感じました。
[ わてん@午後 ]
2019/3/6(水) 午後 0:41
分類(書庫)は順番がメチャクチャになってましたが、FC2の管理機能で並び替える事ができました。
問題は、ブログ内の別記事をリンクしている部分が、自動ではリンク先変更されないことですね・・・
(FC2内の記事ではなく、Yahoo!内の記事をリンクしたままです)
引越しツール自体は、Yahoo!ブログからの引越しがサポートされているので簡単でした。
FC2は編集機能はYahoo!よりも上ですが、Yahoo!ライクな外観にしようとするとかなり設定が大変なようなので、諦めました・・・
[ PSP ]
2019/3/10(日) 午後 11:27
> PSPさん
分類(書庫)は並び替えの機能でなんとかなったんですねえ
ブログ内の別記事へのリンクは完全に手動での変更になってしまうと、これはFC2に限らずどこのブログでも同じかなあ
直すときは元のYahoo!ブログの記事に飛んで日付を確認して、FC2でその日付の記事に飛んでアドレスをコピペする感じでしょうか、想像するだけで疲れました_(:3」∠)_
[ わてん@午後 ]
2019/3/11(月) 午前 9:59