Скрытие приложения VB.Net из списка задач и порядка ALT+TAB?

Я создаю небольшое приложение для проверки, которое я хочу запускать в фоновом режиме, у него просто есть простой таймер, который проверяет, что определенный процесс запущен, однако я хочу скрыть это от переключателя Alt-Tab, и список задач возможен слишком. Я наткнулся на некоторый код от Microsoft, но он с 2003 года и больше не работает в последней версии VB.Net, я получаю сообщение об ошибке:

OwnerhWnd = GetWindow(Me.hWnd, GW_OWNER)

Я изучил это в Интернете и следил за тем, что говорили люди, но безрезультатно. Многие предлагали другим использовать Me.Handle, но я тоже не смог заставить это работать, просто продолжайте получать ту же ошибку:

A first chance exception of type 'System.DllNotFoundException' occurred in Checkr.exe

Вот предоставленный код:

Public Class Form1

  Declare Function ShowWindow Lib "User" (ByVal hWnd As Integer,
  ByVal nCmdShow As Integer) As Integer
  Declare Function GetWindow Lib "User" (ByVal hWnd As Integer,
  ByVal wCmd As Integer) As Integer
  Const SW_HIDE = 0
  Const GW_OWNER = 4

Sub Form_Load ()
  Dim OwnerhWnd As Integer
  Dim ret As Integer

  ' Make sure the form is invisible:
  form1.Visible = False

  ' Set interval for timer for 5 seconds, and make sure it is enabled:
  timer1.Interval = 5000
  timer1.Enabled = True

  ' Grab the background or owner window:
  OwnerhWnd = GetWindow(Me.hWnd, GW_OWNER)
  ' Hide from task list:
  ret = ShowWindow(OwnerhWnd, SW_HIDE)

End Sub


Sub Timer1_Timer ()
  Dim ret As Integer
  ' Display a message box:
ret = MsgBox("Visible by Alt+Tab. Cancel to Quit", 1, "Invisible Form")
  ' If cancel clicked, end the program:
  If ret = 2 Then
     timer1.Enabled = False
     Unload Me
     End
  End If
End Sub

Оригинальную статью Microsoft можно найти здесь, если это поможет.


person Community    schedule 14.02.2015    source источник
comment
Нет, этот код ерунда. Скрыть из списка задач очень расплывчато. Вы просто не хотите создавать окно вообще? Затем напишите приложение консольного режима и используйте Project + Properties, вкладку Application и измените параметр Application Type на Windows Forms Application.   -  person Hans Passant    schedule 14.02.2015


Ответы (3)


Избавьтесь от этого старого кода...

Все, что вам нужно сделать в VB.Net, это установить FormBorderStyle формы в FixedToolWindow и установите ShowInTaskBar в False:

FixedToolWindow — граница окна инструментов, размеры которой не изменяются. Окно инструментов не отображается на панели задач или в окне, которое появляется, когда пользователь нажимает клавиши ALT+TAB. Хотя формы, в которых указано FixedToolWindow, обычно не отображаются на панели задач, необходимо также убедиться, что для свойства ShowInTaskbar установлено значение false, поскольку его значение по умолчанию равно true.

person Idle_Mind    schedule 14.02.2015
comment
Это решает проблему скрытия его от переключателя Alt-Tab! - person ; 14.02.2015

Попробуйте это в своем событии загрузки формы:

Call SetWindowLong(Me.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW)

Вам нужно будет импортировать следующее пространство имен:

Imports System.Runtime.InteropServices

А также добавьте эту функцию user32:

<DllImport("user32.dll", _
EntryPoint:="SetWindowLong")> _
Private Shared Function SetWindowLong(ByVal hWnd As IntPtr, _
                                     ByVal nIndex As Integer, _
                                     ByVal dwNewLong As Integer) _
                                 As Integer
End Function

Кроме того, вам нужно где-то объявить константы для WS_EX_TOOLWINDOW и GWL_EXSTYLE:

Dim WS_EX_TOOLWINDOW as Integer = &H80
Dim GWL_EXSTYLE as Integer = -20

Теперь ваша форма будет скрыта как на панели задач, так и в меню Alt-Tab. Подробнее об этом читайте по адресу: http://www.pinvoke.net/default.aspx/Enums/WindowStylesEx.html

Другие константы можно найти на том же сайте, к сожалению, я не могу размещать больше ссылок. Надеюсь, это ответило на ваш вопрос (если на него еще не ответили)!

person Dystopic    schedule 18.05.2015

<сильный>1. Создайте модуль или класс ¹, используя приведенный ниже код.

<сильный>2. Вызовите класс в каждой форме, которую необходимо скрыть, как показано ниже.

Dim x_cl_HideTaskView As _cl_HideTaskView = New _cl_HideTaskView(Me)

¹ Код для создания модуля/класса (как указано в шаге 1)

Imports System.Runtime.InteropServices
Module _g_ui_Fn_HideTaskView

Public Class _cl_HideTaskView
    Dim WithEvents x_form As Form
    Public Sub New(ByVal _form As Object)
        x_form = _form
    End Sub

    Private Sub x_form_Load(sender As Object, e As EventArgs) Handles x_form.Load
        _sub_hideTaskView()
    End Sub

#Region "Hide this form from Task View Window (ALT + TAB)"
    'Imports System.Runtime.InteropServices
    <DllImport("user32.dll", EntryPoint:="SetWindowLong")>
    Private Shared Function SetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
    End Function
    Private Sub _sub_hideTaskView()
        Dim WS_EX_TOOLWINDOW As Integer = &H80
        Dim GWL_EXSTYLE As Integer = -20
        Call SetWindowLong(x_form.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW)
    End Sub
#End Region
End Class
End Module
person Pinto Anto    schedule 08.10.2020