1

これは私の処女の投稿ですので、気楽に行ってください!

私は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スカラーをスライダーコントロールまたはおそらくカラーダイアログにマップすることだけです。皆様からのご回答ありがとうございました!

4

2 に答える 2

0

あなたは次のようなものを見てみるかもしれません:

http://www.pinvoke.net/default.aspx/gdi32.setdevicegammaramp

http://www.pinvoke.net/default.aspx/gdi32/getdevicegammaramp.html

これらは簡単にアクセスできるガンマ修飾子です。簡単なアプリケーションをまとめて、それらがどのように機能するかを確認できるはずです。オーバーレイとまったく同じではありませんが、画面全体を低レベルで変更できます。

于 2012-06-26T00:18:14.230 に答える
0

これを WinForms と WPF のどちらで実行したいのかわかりません。WPF を使用すると、次のようなことができます。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Background="Transparent"
    AllowsTransparency="True" WindowStyle="None" Topmost="True" WindowState="Maximized">
</Window>

これにより、完全に透明なウィンドウが表示され、すべてのクリックなどは下の画面に移動します。次に、ウィンドウにコントロールを配置すると、それらが表示され、クリックに応答します。次に、たとえば、これらのコントロールを部分的に透明にしたい場合は、Opacity="0.2" にすることができます。

WinForms ソリューションについては、こちらをご覧ください。

編集:画面上に常に上にとどまり、マウスやキーボードの影響を受けない色の色合いを表示するには、...を使用します

this.TopMost = true;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
this.Opacity = 0.5;
int initialStyle = GetWindowLong(this.Handle, -20);
SetWindowLong(this.Handle, -20, initialStyle | 0x20);
于 2012-06-26T00:28:32.907 に答える