6

我试图阻止用户将我的 .NET 应用程序固定到任务栏。我在Old New Thing上找到了一些可以做到这一点的代码。但是,它是在 C++ 中的。

#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;
}

我把它转换成 c# 的运气很差。有人可以帮忙吗?

4

3 回答 3

9

您可以下载Windows API 代码包,其中包含将帖子中的代码转换为 C# 所需的 p/invoke 调用。

要么使用整个库,要么找到您需要的特定调用和定义(搜索它SHGetPropertyStoreForWindow,然后搜索它的其他依赖项)。

于 2011-06-16T20:48:32.657 回答
0

在这个问题中,Old New Thing 帖子还讨论了如何在每个应用程序的基础上设置一些注册表设置,从而防止将应用程序固定到任务栏。

您所要做的就是将“NoStartPage”的值添加到 Root\Applications 下您的应用程序的键中。该值可以是空白的,并且可以是任何类型,如果 Windows 只是看到它在那里,当用户在任务栏中右键单击它时,它不会显示固定应用程序的能力。

以下是 Microsoft 关于此功能的文档:使用注册表防止应用程序被固定

需要注意的是,在 Windows 7 中,由于 UAC,您必须以管理员身份运行才能更新注册表。我通过 app.manifest 做到了这一点。

查找正确并更新正确注册表项的代码如下(希望它不会太冗长):

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);                    
            }
        }
    }
于 2013-05-03T04:30:22.150 回答
0

使用 WindowsAPICodePack(通过 NuGet),您需要类似以下代码:

// 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");
于 2016-04-29T15:36:21.290 回答