これは私の処女の投稿ですので、気楽に行ってください!
私はC#でプログラムを書いていますが、これを最大限に活用して常にトップで実行したいと考えています。アプリは半透明になるので、ユーザーは最大化されたアプリケーションの背後で起こっていることをすべて見ることができます。
私は、ユーザーが(アプリにフォーカスがあるにもかかわらず)他のすべての実行中のプログラムと通常どおりに対話できるシナリオを実現することを目指しています-まるでそれがすべてのユーザー入力を別の意図されたアプリケーションにリダイレクトするだけの色付きガラスのように、オーバーレイの後ろの特定のx、yマウスクリックで存在します。
基本的な考え方は、タスクバー以外のすべてにオーバーレイを作成して、ユーザーが画面に表示するすべてのものに色合いまたはトーンを適用することです。
私は学部生なので知識が限られていることを忘れないでください-それで私がここにいる理由。
また、おそらくグラフィックスドライバーと話し合ってこれらの色を変更する方法を検討しましたが、今後の方向性がわかりません。
ユーザー入力をリダイレクトするという私の最初のアイデアは実行可能ですか?または、ドライバーやWindowsのカラープロファイルなどのルートをたどる必要がありますか?
だから、ガンマランプのアイデアに関して、私は彼をフォローしてみましたが、期待どおりに実行されませんでした...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Runtime.InteropServices;
using System.Drawing;
namespace GammaRAMP
{
public class Program
{
[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("gdi32.dll")]
public static extern bool SetDeviceGammaRamp(IntPtr hDC, ref RAMP lpRamp);
[DllImport("gdi32.dll")]
public static extern int GetDeviceGammaRamp(IntPtr hDC, ref RAMP lpRamp);
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct RAMP
{
[ MarshalAs(UnmanagedType.ByValArray, SizeConst=256)]
public UInt16[] Red;
[ MarshalAs(UnmanagedType.ByValArray, SizeConst=256)]
public UInt16[] Green;
[ MarshalAs(UnmanagedType.ByValArray, SizeConst=256)]
public UInt16[] Blue;
}
public static void SetGamma(int gamma)
{
if (gamma <= 256 && gamma >= 1)
{
RAMP ramp = new RAMP();
ramp.Red = new ushort[256];
ramp.Green = new ushort[256];
ramp.Blue = new ushort[256];
for( int i=1; i<256; i++ )
{
int iArrayValue = i * (gamma + 128);
if (iArrayValue > 65535) // I assume this is a max value.
iArrayValue = 65535;
// So here I purposfully set red to max all the time expecting
// a lot of extra red but hardly any change occurs?
//ramp.Red[i] = 65535;
// However if I do this:
ramp.Red[i] = (ushort)iArrayValue;
// I get VERY noticable changes?
ramp.Blue[i] = ramp.Green[i] = (ushort)iArrayValue;
}
SetDeviceGammaRamp(GetDC(IntPtr.Zero), ref ramp);
}
}
public static void Main(string[] args)
{
string ent = "";
int g=0;
// A RAMP struct to store initial values.
RAMP r = new RAMP();
// Store initial values.
GetDeviceGammaRamp(GetDC(IntPtr.Zero),ref r);
while (ent != "EXIT")
{
Console.WriteLine("Enter new Gamma (or 'EXIT' to quit):");
ent = Console.ReadLine();
try
{
g=int.Parse(ent);
SetGamma(g);
}
catch
{
//Here only to catch errors where input is not a number (EXIT, for example, is a string)
}
}
// Reset any RAMP changes.
SetDeviceGammaRamp(GetDC(IntPtr.Zero), ref r);
Console.ReadLine();
}
}
}
お返事をお待ちしております。ありがとうございました!
さて、上記のコードを試してみたところ、渡されたガンマ値の係数で特定の赤/緑/青のランプメンバーを変更し、値を設定すると、目的の効果が得られるため、public static void SetGamma(int gamma)
変更したくないことがわかりました。iArrayValue = i * 128;
今やるべきことは、特定のrgbスカラーをスライダーコントロールまたはおそらくカラーダイアログにマップすることだけです。皆様からのご回答ありがとうございました!