这是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);
}
答案 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);
}
}