2011-06-16 13 views
5

Estoy tratando de evitar que el usuario fije mi aplicación .NET a la barra de tareas. Encontré un código en el Old New Thing que hace precisamente eso. Sin embargo, está en C++.¿Cómo evitar que una aplicación se fije en Windows 7?

#include <shellapi.h> 
#include <propsys.h> 
#include <propkey.h> 

HRESULT MarkWindowAsUnpinnable(HWND hwnd) 
{ 
IPropertyStore *pps; 
HRESULT hr = SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(&pps)); 
if (SUCCEEDED(hr)) { 
    PROPVARIANT var; 
    var.vt = VT_BOOL; 
    var.boolVal = VARIANT_TRUE; 
    hr = pps->SetValue(PKEY_AppUserModel_PreventPinning, var); 
    pps->Release(); 
} 
return hr; 
} 


BOOL 
OnCreate(HWND hwnd, LPCREATESTRUCT lpcs) 
{ 
MarkWindowAsUnpinnable(hwnd); 
return TRUE; 
} 

Estoy teniendo muy poca suerte convirtiéndolo en C#. ¿Alguien puede ayudar?

+0

¿Tiene el código C# para esto? Solo estoy haciendo referencia al paquete de código API de Windows, así que creo que solo necesito el código que es tu formulario principal. Gracias por adelantado. –

Respuesta

8

Puede descargar el Windows API Code Pack que tiene las llamadas p/invoke necesarias que necesita para traducir el código en su publicación a C#.

O usa la biblioteca en su totalidad o encuentra las llamadas y definiciones específicas que requieres (búscalo en SHGetPropertyStoreForWindow y luego en sus otras dependencias).

+0

Ese vaso solo está medio lleno, TaskbarNativeMethods es una clase interna. –

+0

@ Hans Passant: ¿Este es un comentario relacionado con el tema de licencias? Él podría usar su implementación como una pista para la suya. De todos modos, la clase interna está expuesta a través de WindowProperties que es público. – Andrei

+0

Nada que ver con la licencia. Sí, tendrá que copiar y pegar declaraciones del código fuente del paquete de código. –

0

En la pregunta, la publicación Old New Thing también habla de cómo puede establecer algunas configuraciones de registro por aplicación, lo que evitará que se fije una aplicación en la barra de tareas.

Todo lo que tiene que hacer es agregar el valor de "NoStartPage" a una clave para su aplicación en Root \ Applications. El valor puede estar en blanco y de cualquier tipo, si Windows solo ve que está allí no mostrará la capacidad de anclar la aplicación, cuando el usuario haga clic derecho en la barra de tareas.

Aquí está la documentación de Microsoft acerca de esta característica: Use Registry to prevent pinning of an application

La única salvedad a esto es que en Windows 7, debido a la UAC, usted tiene que ejecutar como administrador para actualizar el registro. Hice esto a través de la aplicación. Manifest.

El código para encontrar la derecha y actualizar las claves del Registro correcta es a continuación (esperemos que no sea demasiado detallado):

public static void Main(string[] args) 
    { 
     // Get Root 
     var root = Registry.ClassesRoot; 

     // Get the Applications key 
     var applicationsSubKey = root.OpenSubKey("Applications", true); 

     if (applicationsSubKey != null) 
     { 
      bool updateNoStartPageKey = false; 

      // Check to see if your application already has a key created in the Applications key 
      var appNameSubKey = applicationsSubKey.OpenSubKey("MyAppName.exe", true); 

      if (appNameSubKey != null) 
      { 
       // Check to see if the NoStartPage value has already been created 
       if (!appNameSubKey.GetValueNames().Contains("NoStartPage")) 
       { 
        updateNoStartPageKey = true; 
       } 
      } 
      else 
      { 
       // create key for your application in the Applications key under Root 
       appNameSubKey = applicationsSubKey.CreateSubKey("MyAppName.exe", RegistryKeyPermissionCheck.Default); 

       if (appNameSubKey != null) 
       { 
        updateNoStartPageKey = true; 
       } 
      } 

      if (updateNoStartPageKey) 
      { 
       // Create/update the value for NoStartPage so Windows will prevent the app from being pinned. 
       appNameSubKey.SetValue("NoStartPage", string.Empty, RegistryValueKind.String);      
      } 
     } 
    } 
0

Utilizando el WindowsAPICodePack (a través de NuGet) que necesita código similar:

// Ensure the handle is available 
new WindowInteropHelper(window).EnsureHandle(); 

// Prevent the window from being pinned to the task bars 
var preventPinningProperty = new PropertyKey(
     new Guid("9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3"), 9); 
WindowProperties.SetWindowProperty(window, preventPinningProperty, "1"); 
Cuestiones relacionadas