私はSDG(Single Display Groupware)アプリケーションを開発しており、そのためには単一のウィンドウに対して複数のカーソル(色の異なるもの)が必要です。私はC#でそれを知るようになっただけで、私の問題を解決しない黒と白のカーソルを使うことができます。だからこの問題で私を助けてください。C#Windowsアプリケーションでのカスタムカラーカーソルの使用
ありがとうございます。
私はSDG(Single Display Groupware)アプリケーションを開発しており、そのためには単一のウィンドウに対して複数のカーソル(色の異なるもの)が必要です。私はC#でそれを知るようになっただけで、私の問題を解決しない黒と白のカーソルを使うことができます。だからこの問題で私を助けてください。C#Windowsアプリケーションでのカスタムカラーカーソルの使用
ありがとうございます。
カーソルクラスはかなり不十分で行われます。不思議な理由のために、従来のCOMインターフェイス(IPicture)を使用しています。そのインターフェイスは、カラーおよびアニメーションカーソルをサポートしていません。それはいくつかのかなり醜い肘グリースで修正可能です:
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
static class NativeMethods {
public static Cursor LoadCustomCursor(string path) {
IntPtr hCurs = LoadCursorFromFile(path);
if (hCurs == IntPtr.Zero) throw new Win32Exception();
var curs = new Cursor(hCurs);
// Note: force the cursor to own the handle so it gets released properly
var fi = typeof(Cursor).GetField("ownHandle", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(curs, true);
return curs;
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr LoadCursorFromFile(string path);
}
使用例:
this.Cursor = NativeMethods.LoadCustomCursor(@"c:\windows\cursors\aero_busy.ani");
あなたは動的に次のようにファイルからカーソルを読み込むことができます:あなたはそれをロードした後
がvar myCursor = new Cursor("myCursor.cur");
、あなたがこのような任意のコントロールのカーソルを設定することができます。
myControl.Cursor = myCursor;
は、カーソルも受け付けますストリームをコンストラクタパラメータとして返します。つまり、ファイルシステムからではなく、アプリケーションに埋め込まれたリソースからロードできます。
Windowsでは、複数のカーソルを持つことはできませんが、複数のコントロールをコントロール上に描画することはできます。あなたはそうのようなカーソルオブジェクトのDraw
メソッドを使用することができます:あなたは、クライアントの間でカーソル・データを送信するためにTCP/IPを使用している場合、これが動作するために十分であるべき
myCursor.Draw(g, new Rectangle(...));
。
しかし、1台のPCに複数の入力をサポートしているアプリケーションがいくつかあります。 (例えば、Rag Doll Kung Fu)このためには、.NETフレームワークがサポートしていないものがあります。
おそらく、いくつかのUSBコールをPInvokingする必要があります。 (私はここで多くの経験がないので、私は黙示的に表現することはできません)
ありがとうジョン、しかし私は実際にこれを試みたが、それは私のために働かなかったし、私のWindowsアプリケーションの複数のマウスコントロールのために、基本的に私はすべての低レベルのものを処理するSDGToolkitと呼ばれるC#のAPIを使用しています。 – Himanshu
私はかつて動的カーソルを作成する必要がありました。これは、特に半透明が黒と混じってカーソルが暗すぎるため、奇妙な問題を引き起こすことが判明しました。最後に、私はSOのコミュニティからいくつかの助けを借りて問題を解決し、ソリューション全体がここに表示されます。
私はまた別の何かをしようと、別の色のカーソルで動作するようだが、この作品の唯一の問題コードは、マウスカーソルのホットスポット座標が正確でない、すなわち、右にわずかに移動されるということです。しかし、これはコード内のオフセットを考慮することで修正できます。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
namespace MID
{
public partial class CustomCursor : Form
{
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr LoadCursorFromFile(string filename);
public CustomCursor()
{
InitializeComponent();
Bitmap bmp = (Bitmap)Bitmap.FromFile("Path of the cursor file saved as .bmp");
bmp.MakeTransparent(Color.Black);
IntPtr ptr1 = blue.GetHicon();
Cursor cur = new Cursor(ptr1);
this.Cursor = cur;
}
}
}
カラーカーソルが正常に動作:次のように
コードがあります。黒と白のカーソルしか使えないことを知りたかったのはどうでしたか? –
Windowsは1つ以上のカーソルを持つことができますか? –
@Tim - C#フォーラムの1つで、デフォルトのCursorクラスを使用すると、黒と白のカーソル(グレースケールのカーソルも使用できません)しか使用できません。 – Himanshu