programing

Alt-Tab 프로그램 전환기에서 창을 숨기는 가장 좋은 방법은 무엇입니까?

megabox 2023. 5. 14. 10:30
반응형

Alt-Tab 프로그램 전환기에서 창을 숨기는 가장 좋은 방법은 무엇입니까?

저는 지금까지.NET 개발자는 몇 년째 계속되고 있으며, 이것은 여전히 제가 제대로 하는 방법을 모르는 것들 중 하나입니다.Windows Forms와 WPF 모두에서 속성을 통해 작업 표시줄에서 창을 숨기는 것은 쉽지만, 제가 알기로는 창이 ↹Tab+ 대화 상자에서 숨겨지는 것을 보장하지 않습니다(또는 영향을 미칠 수도 있습니다).+에 보이지 않는 ↹Tab창이 표시되는 을 본 적이 있는데 ↹Tab+ 대화 상자에 창이 표시되지 않거나 표시되지 않을 것을 보장하는 가장 좋은 방법이 무엇인지 궁금합니다.

업데이트: 아래 제가 게시한 솔루션을 참조하십시오.저는 제 자신의 답을 해결책으로 표시하는 것이 허용되지 않지만, 지금까지는 그것이 작동하는 유일한 방법입니다.

업데이트 2: 이제 프란치 페노프가 만든 꽤 좋아 보이지만 직접 시도해보지는 않은 적절한 솔루션이 있습니다.일부 Win32를 포함하지만 화면 밖의 창을 만드는 번거로운 작업은 피합니다.

업데이트:

@donovan에 따르면, 현대 WPF는 설정을 통해 이를 기본적으로 지원합니다.ShowInTaskbar="False"그리고.Visibility="Hidden" ( 댓글 로 결정했습니다.)AML에서. (아직 테스트하지 않았지만 그럼에도 불구하고 댓글 가시성을 뛰어넘기로 결정했습니다.)

원답:

Win32 API의 작업 전환기에서 창을 숨기는 두 가지 방법이 있습니다.

  1. 가로를 WS_EX_TOOLWINDOW확장 창 스타일 - 올바른 접근 방식입니다.
  2. 다른 창의 하위 창으로 만들기 위해.

창 유연한 하지 않기 에 "WPF" Win32를 사용하는 이 있습니다. 따라서 창은WindowStyle=ToolWindow인 " 값으로끝다니납기"로 끝납니다.WS_CAPTION그리고.WS_SYSMENU스타일: 캡션과 닫기 단추가 있습니다.반면에, 이 두 가지 스타일은 다음과 같이 설정하여 제거할 수 있습니다.WindowStyle=None그러나 그것이 설정하지는 않을 것입니다.WS_EX_TOOLWINDOW확장된 스타일을 사용하면 창이 작업 전환기에서 숨겨지지 않습니다.

를 사용하는 WindowStyle=None이는 작업 전환기에서도 숨겨져 있으며, 다음 두 가지 방법 중 하나를 사용할 수 있습니다.

  • 위의 샘플 코드로 이동하여 창을 작은 숨겨진 도구 창의 하위 창으로 만듭니다.
  • 하여 창스일다포음함합다니을수정여하을타▁the도 포함합니다.WS_EX_TOOLWINDOW확장된 문체

저는 개인적으로 두 번째 접근법을 선호합니다.한편, 저는 클라이언트 영역에서 유리를 확장하고 캡션에서 WPF 드로잉을 활성화하는 것과 같은 고급 작업을 수행하므로 약간의 상호 작용은 큰 문제가 되지 않습니다.

다음은 Win32 interop 솔루션 접근 방식의 샘플 코드입니다.먼저, XAML 부분:

<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 interop입니다.샘플 코드를 작게 유지하기 위해 불필요한 스타일을 열거나 삭제했습니다.또한, 불행하게도.SetWindowLongPtr "" user32.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

양식 클래스 내에 다음을 추가합니다.

protected override CreateParams CreateParams
{
    get
    {
        var Params = base.CreateParams;
        Params.ExStyle |= WS_EX_TOOLWINDOW;
        return Params;
    }
}

그것은 그것만큼 쉽습니다; 매력적으로 작용합니다!

해결책을 찾았지만, 그것은 예쁘지 않습니다.지금까지 제가 시도한 것은 이것이 실제로 효과가 있는 유일한 것입니다.

Window w = new Window(); // Create helper window
w.Top = -100; // Location of new window is outside of visible part of screen
w.Left = -100;
w.Width = 1; // size of window is enough small to avoid its appearance at the beginning
w.Height = 1;
w.WindowStyle = WindowStyle.ToolWindow; // Set window style as ToolWindow to avoid its icon in AltTab 
w.Show(); // We need to show window before set is as owner to our main window
this.Owner = w; // Okey, this will result to disappear icon for main window.
w.Hide(); // Hide helper window just in case

여기서 찾았어요.

좀 더 일반적이고 재사용 가능한 솔루션이 좋을 것입니다.단일 창 ↹Tab'w'를 생성하여 +에서 숨겨야 하는 앱의 모든 창에 다시 사용할 수 있습니다.

업데이트: 네, 그래서 제가 한 것은 위의 코드를 제거한 것입니다.this.Owner = w비트 (그리고 움직이는)w.Hide()w.Show()하는 경우를 내 생성자에 정적인 " " " " " 를 합니다.Window라고 하는OwnerWindow이 동작을 표시할 창을 원할 때마다 설정합니다.this.Owner = App.OwnerWindow잘 작동하며 하나의 추가 창(보이지 않는 창)만 생성합니다.설정할 수도 있습니다.this.Owner = null창을 + ↹Tab대화 상자에 다시 표시하려면 를 누릅니다.

솔루션을 위한 MSDN 포럼에 참석한 Ivan Onuchin에게 감사드립니다.

업데이트 2: 또한 설정해야 합니다.ShowInTaskBar=falsew표시될 때 작업 표시줄에서 잠시 깜박이는 것을 방지합니다.

+↹Tab에서 숨기려는 창의 스타일에 관계없이 다음과 같은 방법이 있습니다.

다음을 양식의 생성자에 배치합니다.

// Keep this program out of the Alt-Tab menu

ShowInTaskbar = false;

Form form1 = new Form ( );

form1.FormBorderStyle = FormBorderStyle.FixedToolWindow;
form1.ShowInTaskbar = false;

Owner = form1;

기본적으로 양식을 Alt-Tab 목록에서 제외할 올바른 스타일과 ShowInTaskbar 설정을 가진 보이지 않는 창의 자식으로 만듭니다.또한 양식의 ShowInTaskbar 속성을 false로 설정해야 합니다.무엇보다도, 메인 폼의 스타일은 중요하지 않으며 숨김을 수행하기 위해 조정하는 모든 작업은 생성자 코드의 몇 줄에 불과합니다.

왜 그렇게 복잡하죠?사용해 보십시오.

me.FormBorderStyle = FormBorderStyle.SizableToolWindow
me.ShowInTaskbar = false

여기서 가져온 아이디어: http://www.csharp411.com/hide-form-from-alttab/

참조:(http://bytes.com/topic/c-sharp/answers/442047-hide-alt-tab-list#post1683880) 에서)

[DllImport("user32.dll")]
public static extern int SetWindowLong( IntPtr window, int index, int
value);
[DllImport("user32.dll")]
public static extern int GetWindowLong( IntPtr window, int index);


const int GWL_EXSTYLE = -20;
const int WS_EX_TOOLWINDOW = 0x00000080;
const int WS_EX_APPWINDOW = 0x00040000;

private System.Windows.Forms.NotifyIcon notifyIcon1;


// I use two icons depending of the status of the app
normalIcon = new Icon(this.GetType(),"Normal.ico");
alertIcon = new Icon(this.GetType(),"Alert.ico");
notifyIcon1.Icon = normalIcon;

this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
this.Visible = false;
this.ShowInTaskbar = false;
iconTimer.Start();

//Make it gone frmo the ALT+TAB
int windowStyle = GetWindowLong(Handle, GWL_EXSTYLE);
SetWindowLong(Handle, GWL_EXSTYLE, windowStyle | WS_EX_TOOLWINDOW);

왜 그렇게 많은 코드를 시도합니까?설정만 하면 됩니다.FormBorderStyle에 적합한.FixedToolWindow도움이 되길 바랍니다.

기본 양식이 true로 자동 변경될 때마다 기본 양식의 가시성을 false로 설정하려고 했습니다.

private void Form1_VisibleChanged(object sender, EventArgs e)
{
    if (this.Visible)
    {
        this.Visible = false;
    }
}

완벽하게 작동합니다 :)

양식을 경계가 없는 상태로 만들려면 양식의 생성자에 다음 문을 추가해야 합니다.

this.FormBorderStyle = FormBorderStyle.None;
this.ShowInTaskbar = false;

그리고 파생된 Form 클래스에 다음 메서드를 추가해야 합니다.

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        // turn on WS_EX_TOOLWINDOW style bit
        cp.ExStyle |= 0x80;
        return cp;
    }
}

더 자세한 정보

XAML에서 ShowInTaskbar="False" 설정:

<Window x:Class="WpfApplication5.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    ShowInTaskbar="False"    
    Title="Window1" Height="300" Width="300">
    <Grid>

    </Grid>
</Window>

편집: 작업 표시줄이 아닌 Alt+Tab에 여전히 표시됩니다.

이거 해봤어요.저한테는 효과가 있어요.

  private void Particular_txt_KeyPress(object sender, KeyPressEventArgs e)
    {
        Form1 frm = new Form1();         
        frm.Owner = this;
        frm.Show();
    }

양식을 표시하지 않습니다.투명도를 사용합니다.

더 많은 정보: http://code.msdn.microsoft.com/TheNotifyIconExample

Alt+Tab 스위처에서 숨긴 상태에서 WPF 창을 계속 표시할 수 있는 솔루션:

Alt+Tab에서 WPF 창 숨기기

개인적으로 어떤 방식으로든 창문을 닫지 않고는 이것이 불가능하다는 것을 아는 한, 저는 그것이 어떻게 이루어질지 또는 가능한지조차 확신할 수 없습니다.

필요에 따라 응용프로그램 컨텍스트를 알림으로 개발아이콘(시스템 트레이) 응용 프로그램을 사용하면 Alt + Tab에 표시되지 않고 실행할 수 있습니다.그러나 양식을 열어도 해당 양식은 여전히 표준 기능을 따릅니다.

알림 전용 응용 프로그램을 만드는 것에 대한 블로그 기사를 찾을 수 있습니다.원하는 경우 기본 아이콘입니다.

양식 1 속성:
양식 테두리 스타일: 대형
창 상태: 최소화됨
작업 표시줄에 표시:거짓의

private void Form1_Load(object sender, EventArgs e)
{
   // Making the window invisible forces it to not show up in the ALT+TAB
   this.Visible = false;
}>

언급URL : https://stackoverflow.com/questions/357076/best-way-to-hide-a-window-from-the-alt-tab-program-switcher

반응형