হালনাগাদ:
@ ডোনোভানের মতে, আধুনিক দিনগুলি ডাব্লুপিএফ সেটআপ ShowInTaskbar="False"
এবং Visibility="Hidden"
এক্সএএমএল-এর মাধ্যমে এটিকে স্থানীয়ভাবে সমর্থন
করে। (আমি এটি এখনও পরীক্ষা করে দেখিনি, তবে তবুও মন্তব্যটির দৃশ্যমানতাকে টুকরো টুকরো করার সিদ্ধান্ত নিয়েছি)
আসল উত্তর:
উইন 32 এপিআইতে টাস্ক সুইচার থেকে উইন্ডোটি আড়াল করার দুটি উপায় রয়েছে:
- যোগ করার জন্য
WS_EX_TOOLWINDOW
সঠিক পন্থা যে - বর্ধিত জানালা শৈলী।
- এটিকে অন্য উইন্ডোর চাইল্ড উইন্ডো তৈরি করতে।
দুর্ভাগ্যক্রমে, ডাব্লুপিএফ উইন্ডো স্টাইলের উপর উইন 32 এর মতো নমনীয় নিয়ন্ত্রণ সমর্থন করে না, এইভাবে একটি উইন্ডোটি WindowStyle=ToolWindow
ডিফল্ট WS_CAPTION
এবং WS_SYSMENU
শৈলীর সমাপ্ত হয় , যার ফলে এটি একটি ক্যাপশন এবং একটি বন্ধ বোতাম রাখে to অন্যদিকে, আপনি সেট করে এই দুটি শৈলী মুছে ফেলতে পারেন WindowStyle=None
, তবে এটি WS_EX_TOOLWINDOW
প্রসারিত শৈলী সেট করবে না এবং উইন্ডোটি কার্য স্যুইচার থেকে গোপন করা হবে না।
এটির সাথে ডাব্লুপিএফ উইন্ডোটি WindowStyle=None
টাস্ক স্যুইচার থেকেও গোপন রাখা, দুটি উপায়ের মাধ্যমে যে কোনও একটি হতে পারে:
- উপরের নমুনা কোডটি নিয়ে যান এবং উইন্ডোটিকে একটি ছোট লুকানো সরঞ্জাম উইন্ডোর একটি শিশু উইন্ডো করুন
WS_EX_TOOLWINDOW
বর্ধিত শৈলী অন্তর্ভুক্ত করতে উইন্ডো শৈলীটি পরিবর্তন করুন ।
আমি ব্যক্তিগতভাবে দ্বিতীয় পদ্ধতির পছন্দ করি। তারপরে আবার আমি ক্লায়েন্ট এরিয়ায় কাঁচ বাড়ানো এবং যেভাবেই ক্যাপশনে ডাব্লুপিএফ অঙ্কন সক্ষম করে দেওয়া উচিত তাই কিছুটা আন্তঃব্যবস্থা বড় সমস্যা নয় inter
উইন 32 ইন্টারপ সমাধান পদ্ধতির জন্য নমুনা কোডটি এখানে। প্রথম, এক্সএএমএল অংশ:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300"
ShowInTaskbar="False" WindowStyle="None"
Loaded="Window_Loaded" >
এখানে খুব বেশি অভিনব কিছু নয়, আমরা কেবল WindowStyle=None
এবং সাথে একটি উইন্ডো ঘোষণা করি ShowInTaskbar=False
। আমরা লোড ইভেন্টে একটি হ্যান্ডলারও যুক্ত করি যেখানে আমরা বর্ধিত উইন্ডো স্টাইলটি সংশোধন করব। আমরা কনস্ট্রাক্টরে সেই কাজটি করতে পারি না, কারণ এখনও পর্যন্ত সেই মুহুর্তে কোনও উইন্ডো হ্যান্ডেল নেই। ইভেন্ট হ্যান্ডলারটি নিজেই খুব সাধারণ:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WindowInteropHelper wndHelper = new WindowInteropHelper(this);
int exStyle = (int)GetWindowLong(wndHelper.Handle, (int)GetWindowLongFields.GWL_EXSTYLE);
exStyle |= (int)ExtendedWindowStyles.WS_EX_TOOLWINDOW;
SetWindowLong(wndHelper.Handle, (int)GetWindowLongFields.GWL_EXSTYLE, (IntPtr)exStyle);
}
এবং Win32 ইন্টারপ ঘোষণা। আমি এখানে নমুনা কোডটি ছোট রাখার জন্য এনামগুলি থেকে সমস্ত অপ্রয়োজনীয় শৈলী সরিয়েছি। এছাড়াও, দুর্ভাগ্যক্রমে SetWindowLongPtr
উইন্ডোজ এক্সপিতে ব্যবহারকারীর 32.dll এন্ট্রি পয়েন্টটি খুঁজে পাওয়া যায় নি, এর SetWindowLong
পরিবর্তে কলটি রাউটিং করার কৌশল ।
#region Window styles
[Flags]
public enum ExtendedWindowStyles
{
// ...
WS_EX_TOOLWINDOW = 0x00000080,
// ...
}
public enum GetWindowLongFields
{
// ...
GWL_EXSTYLE = (-20),
// ...
}
[DllImport("user32.dll")]
public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);
public static IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
{
int error = 0;
IntPtr result = IntPtr.Zero;
// Win32 SetWindowLong doesn't clear error on success
SetLastError(0);
if (IntPtr.Size == 4)
{
// use SetWindowLong
Int32 tempResult = IntSetWindowLong(hWnd, nIndex, IntPtrToInt32(dwNewLong));
error = Marshal.GetLastWin32Error();
result = new IntPtr(tempResult);
}
else
{
// use SetWindowLongPtr
result = IntSetWindowLongPtr(hWnd, nIndex, dwNewLong);
error = Marshal.GetLastWin32Error();
}
if ((result == IntPtr.Zero) && (error != 0))
{
throw new System.ComponentModel.Win32Exception(error);
}
return result;
}
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", SetLastError = true)]
private static extern IntPtr IntSetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetWindowLong", SetLastError = true)]
private static extern Int32 IntSetWindowLong(IntPtr hWnd, int nIndex, Int32 dwNewLong);
private static int IntPtrToInt32(IntPtr intPtr)
{
return unchecked((int)intPtr.ToInt64());
}
[DllImport("kernel32.dll", EntryPoint = "SetLastError")]
public static extern void SetLastError(int dwErrorCode);
#endregion