PKEY_EdgeGesture_DisableTouchWhenFullscreen未声明的标识符

时间:2014-06-05 03:45:11

标签: c++ visual-studio-2010 windows-8 mfc

这是vs2010 MFC对话应用程序。除了以下代码,我还尝试包括以下libs,ehstorguids.lib Uuid.Lib。我的目标是杀死windows 8 Charms Bar。我错过了什么导致这个未声明的标识符。

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <propsys.h>
#include <propkey.h>

using namespace std;

HRESULT SetTouchDisableProperty(HWND hwnd, BOOL fDisableTouch)
{
    IPropertyStore* pPropStore;
    HRESULT hrReturnValue = SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(&pPropStore));
    if (SUCCEEDED(hrReturnValue))
    {
        PROPVARIANT var;
        var.vt = VT_BOOL;
        var.boolVal = fDisableTouch ? VARIANT_TRUE : VARIANT_FALSE;
        hrReturnValue = pPropStore->SetValue(PKEY_EdgeGesture_DisableTouchWhenFullscreen, var);
        pPropStore->Release();
    }
    return hrReturnValue;
}

BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam)
{
    TCHAR title[500];
    ZeroMemory(title, sizeof(title));    

    GetWindowText(hWnd, title, sizeof(title)/sizeof(title[0]));

    if (!_tcscmp(title, _T("helloworld")))
    {
        SetTouchDisableProperty(hWnd,true);
    }

    return TRUE;
}

void mymfcdialog::ObBnClickedOk()
{   
    EnumWindows(MyEnumProc, 0);
}

3 个答案:

答案 0 :(得分:1)

Windows 8 SDK是声明所必需的,即使VS并没有抱怨每个MSDN所需的库,包括在内。

这种隐藏/禁用超级按钮的方法仅适用于桌面应用,当它们是全屏并具有标题栏时。所以在我的情况下,这不起作用。当不需要魅力条/手势时杀死“资源管理器”进程,然后重新启动资源管理器进程是唯一的选择。如果MS读到这个,你真的应该环顾四周,这不应该被要求隐藏/禁用魅力/手势。但话又说回来,看看Windows 8的Windows ......我的意思是8.1 ......仍然没有做对。

答案 1 :(得分:0)

您的原始代码对我来说并不错。事实上,网上有这方面的工作实例。

我找到的最好的是https://github.com/Kuqd/DisableCharmBar,它展示了一个有效的例子。

您在自己的答案中提到的窗口标题栏的限制可能与您的GetWindowText检查有关。 Kuqd的例子在没有标题栏的情况下工作。

答案 2 :(得分:0)

我在我的代码中使用它,我希望它可以帮助你:

    static Guid DISABLE_TOUCH_SCREEN = new Guid("32CE38B2-2C9A-41B1-9BC5-B3784394AA44"), // PKEY_EdgeGesture_DisableTouchWhenFullscreen
                IID_PROPERTY_STORE = new Guid("886d8eeb-8cf2-4446-8d02-cdba1dbdcf99"); // PropertyStore
    static short VT_BOOL = 11;   
    private const int GC_ALLGESTURES = 0x00000001;

    public static void DisableEdgeGestures(IntPtr hwnd)
    {
        win32.IPropertyStore pPropStore = null;
        int hr = 0;
        hr = win32.SHGetPropertyStoreForWindow(hwnd, ref IID_PROPERTY_STORE, out pPropStore);
        if (hr == 0)
        {
            win32.PropertyKey propKey = new win32.PropertyKey();
            propKey.fmtid = DISABLE_TOUCH_SCREEN;
            propKey.pid = 2;
            win32.PropVariant var = new win32.PropVariant();
            var.vt = VT_BOOL;
            var.boolVal = true;
            pPropStore.SetValue(ref propKey, ref var);
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(pPropStore);
        }
    }