以前の回答をありがとうございました。マウス座標の大きな赤い十字を示す基本的なツールを完成させてくれました。赤い十字は透明な背景の透明な背景を持つ画像です。問題は、フォームの上端と中央が実際にマウスxyに配置されているため、クリックスルーできないことです。どのように十字をカーソル上に表示させるが、「クリック可能」にするために、これを使用可能にする方法はありますか?一番上のフォームで「スルー」をクリックすると可能ですか?
9
A
答えて
8
あなたはWS_EX_TRANSPARENTウィンドウのスタイルを設定するためにSetWindowLongを使用することができます。
レイヤードウィンドウがWS_EX_TRANSPARENT拡張ウィンドウスタイルを持っている場合は、レイヤードウィンドウの形状は無視され、マウスイベントが渡されますレイヤードウィンドウの下にある他のウィンドウ。
CodeProjectには、テクニックの詳細が記載されています。this VB.NETにはありますが、C#に変換するのは簡単です。
public enum GWL
{
ExStyle = -20
}
public enum WS_EX
{
Transparent = 0x20,
Layered = 0x80000
}
public enum LWA
{
ColorKey = 0x1,
Alpha = 0x2
}
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, LWA dwFlags);
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
int wl = GetWindowLong(this.Handle, GWL.ExStyle);
wl = wl | 0x80000 | 0x20;
SetWindowLong(this.Handle, GWL.ExStyle, wl);
SetLayeredWindowAttributes(this.Handle, 0, 128, LWA.Alpha);
}
をそれはまた、他のどこかからコピーされました:
私は過去に次のコードを使用しています。ここでの重要な行は、OnShown
メソッドにあります。私はライン
wl = wl | 0x80000 | 0x20;
がWS_EX_LAYEREDとWS_EX_TRANSPARENT拡張スタイルを設定し、少し不可解であることを認めざるを得ないけれども。
あなたはおそらくもまた、透明性のキー(上記のバージョンと黒ではない)としてTransparencyKeyを使用して、より詳細/コメントバージョンを、提供するために
wl = wl | WS_EX.Layered | WS_EX.Transparent;
0
ようにそれを設定することができ、かつ、必要に応じて1は、_alpha設定するかもしれません。
/// <summary>
/// 0: the window is completely transparent ... 255: the window is opaque
/// </summary>
private byte _alpha;
private enum GetWindowLong
{
/// <summary>
/// Sets a new extended window style.
/// </summary>
GWL_EXSTYLE = -20
}
private enum ExtendedWindowStyles
{
/// <summary>
/// Transparent window.
/// </summary>
WS_EX_TRANSPARENT = 0x20,
/// <summary>
/// Layered window. http://msdn.microsoft.com/en-us/library/windows/desktop/ms632599%28v=vs.85%29.aspx#layered
/// </summary>
WS_EX_LAYERED = 0x80000
}
private enum LayeredWindowAttributes
{
/// <summary>
/// Use bAlpha to determine the opacity of the layered window.
/// </summary>
LWA_COLORKEY = 0x1,
/// <summary>
/// Use crKey as the transparency color.
/// </summary>
LWA_ALPHA = 0x2
}
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
private static extern int User32_GetWindowLong(IntPtr hWnd, GetWindowLong nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
private static extern int User32_SetWindowLong(IntPtr hWnd, GetWindowLong nIndex, int dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
private static extern bool User32_SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte bAlpha, LayeredWindowAttributes dwFlags);
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
//Click through
int wl = User32_GetWindowLong(this.Handle, GetWindowLong.GWL_EXSTYLE);
User32_SetWindowLong(this.Handle, GetWindowLong.GWL_EXSTYLE, wl | (int)ExtendedWindowStyles.WS_EX_LAYERED | (int)ExtendedWindowStyles.WS_EX_TRANSPARENT);
//Change alpha
User32_SetLayeredWindowAttributes(this.Handle, (TransparencyKey.B << 16) + (TransparencyKey.G << 8) + TransparencyKey.R, _alpha, LayeredWindowAttributes.LWA_COLORKEY | LayeredWindowAttributes.LWA_ALPHA);
}
関連する問題
- 1. ハイチャート5では、チャートの一番上にポイントをプロットすることは可能ですか?
- 2. 国を地図上でクリック可能にすることはできますか?
- 3. PC上でホバリング可能だが他のデバイスメニューでクリック可能
- 4. クリックしないでDataGridViewから一番上の行を削除
- 5. アクティビティの2つのインスタンスを一番上に置くことは可能ですか?
- 6. スクロールビュー内でクリック可能ですか?
- 7. TopMostではなくフォームを別のフォームの上に置くことは可能ですか?
- 8. フォーム全体をエスケープすることは可能ですか?
- 9. ExtJSスライダの親指がクリックで一番上へ
- 10. フォームを一番上に置き、他のフォームを無効にする
- 11. Windowsフォームのインラインボタンは可能ですか?
- 12. IE:アンカーの一部のみがクリック可能です
- 13. タイムラインの一部をループすることは可能ですか?
- 14. javascriptでdivをクリック可能にする
- 15. LoadユーザーがCursorAdapterでリストビューの一番下までスクロールすることは可能ですか?
- 16. リンクはクリック可能ですか?
- 17. Firebaseの機能とホスティングでJQueryボタンをクリック/フォーム送信する
- 18. カードビュー内でリサイクル可能なビューをクリック可能にする
- 19. SSHはリモートネットワーク上で可能ですか?
- 20. Bokehプロット上のクリック可能なドット
- 21. EditTextの一部をクリック可能にしますか?
- 22. 普通のC++実行可能ファイルでクリック可能です
- 23. Xamarinフォーム複合語クリック可能なラベル
- 24. 「フォーカス可能」と「クリック可能」の違い
- 25. 透明、クリック可能、テキスト表示可能なフォームc#
- 26. Tupleプロパティを一般化することは可能ですか?
- 27. Mapbox GLのクリック可能なポリゴンの上にクリック可能なマーカーを配置する方法JS
- 28. Androidはレイアウトの一部をスクロール可能にすることが可能です
- 29. 要点上の行を壊すことは可能ですか?
- 30. 単一のTextViewでクリック可能なループを作成しますか?
もう少し詳細を教えてください。私はこの低レベルのAPIで経験していない、ありがとう! – Petr
ありがとう、これは本当に素晴らしい場所、そのような迅速な答えです。 – Petr
SetLayeredWindowAttributesを使用すると、以前にVS Designerで設定された透明度が失われ、フォームが半透明になりました。 しかし、この行を無効にすることは "クリック可能"なエフェクトには影響しません。 – Petr