Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何禁用MFC将工作区设置写入注册表? 默认情况下,VisualStudio 2010中的基本MFC C++项目将在用户可配置的密钥名称下存储HKCU注册表HIVE中的所有工作空间设置。这包括最后一个窗口大小/位置、功能区设置、状态栏等_C++_Mfc_Registry - Fatal编程技术网

如何禁用MFC将工作区设置写入注册表? 默认情况下,VisualStudio 2010中的基本MFC C++项目将在用户可配置的密钥名称下存储HKCU注册表HIVE中的所有工作空间设置。这包括最后一个窗口大小/位置、功能区设置、状态栏等

如何禁用MFC将工作区设置写入注册表? 默认情况下,VisualStudio 2010中的基本MFC C++项目将在用户可配置的密钥名称下存储HKCU注册表HIVE中的所有工作空间设置。这包括最后一个窗口大小/位置、功能区设置、状态栏等,c++,mfc,registry,C++,Mfc,Registry,如何完全禁用此功能以完全不写入注册表 我尝试不设置SetRegistryKey(),这在第一次读/写注册表时给了我一个来自框架的调试断言SetRegistryKey((LPCTSTR)NULL)给出了相同的结果SetRegistryBase()似乎没有效果。CWinApp/CWinAppEx中的其他方法似乎没有帮助。编辑:我原来的答案是错误的。我已经编辑了答案 您可以告诉MFC将设置存储在.ini文件而不是注册表中。看见(更新:仅当您未使用CWinAppEx时,此选项才有效) 如果要阻止MFC

如何完全禁用此功能以完全不写入注册表


我尝试不设置
SetRegistryKey()
,这在第一次读/写注册表时给了我一个来自框架的调试断言
SetRegistryKey((LPCTSTR)NULL)
给出了相同的结果
SetRegistryBase()
似乎没有效果。
CWinApp
/
CWinAppEx
中的其他方法似乎没有帮助。

编辑:我原来的答案是错误的。我已经编辑了答案


您可以告诉MFC将设置存储在
.ini
文件而不是注册表中。看见(更新:仅当您未使用
CWinAppEx
时,此选项才有效)

如果要阻止MFC同时保存菜单和工具栏的某些状态,请将以下内容添加到应用程序的构造函数中:

m_bSaveState = FALSE;
仅当您的应用程序源自
CWinAppEx
时,才会定义
m_bSaveState
成员

或者,您可以覆盖
CWinAppEx::SaveState
CWinAppEx::LoadState


要消除
WindowPlacement
注册表项,请覆盖
CWinAppEx::StoreWindowPlacement


您仍然可能会得到其他正在写入的注册表项。完整的解决方案包括子类化
CSettingsStore
,然后在应用程序中调用
CSettingsStoreSP::SetRuntimeClass
。(有关更多信息。)这是相当困难的,因为在自定义的
csettingstore
类中,有一大堆虚拟函数需要重写。

我知道这对很多人来说已经晚了,但我发现CFrameWndEx——它将在您的CMainFrame类中——使用WM_CLOSE窗口保存应用程序的默认位置。我不知道什么加载位置。但是,如果覆盖WM_CLOSE,则退出程序时将永远不会保存该窗口状态。它将尝试重新加载上一个窗口状态,但由于一开始没有保存任何窗口状态,因此无需担心

抓住机会的情况: 由于框架仍然调用某种WM_INIT函数来加载最后一个位置,如果您按照正常方式编译代码,最大化应用程序窗口,用X关闭程序,WM_CLOSE会将应用程序状态保存为最大化。如果你像上面提到的那样重写WM_CLOSE来重新编译应用程序,重新启动应用程序,你会发现它开始时最大化了!显然不是你想要的。因此,您必须重新激活(注释掉WM_CLOSE),让程序在作为正常窗口关闭时通过重新启动程序来保存应用程序状态。允许覆盖的WM_CLOSE再次工作,您将看到正常窗口重新出现

代码:

在您的CMainFrame.h中

公众: afx_msg void OnClose()

在您的CMainFrame.cpp中。。。扩展您的信息地图

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)



*ON_WM_CLOSE() // <<< I ADDED THIS*
BEGIN\u MESSAGE\u MAP(CMainFrame,CFrameWndEx)

*ON_WM_CLOSE()//这部分起作用。设置为
FALSE
禁用了许多注册表键,但仍保留了一些注册表键。将
SaveState()
/
LoadState()
重写为不做任何事情会将其简化为只保存“WindowPosition”。参考问题中的答案不起作用。通过省略对
SetRegistryKey()
的调用获得断言,即使没有,也没有创建.ini文件。可能是VS2010的不同?是的。我使用的是
CWinApp
派生类,而不是
CWinAppEx
。谢谢你的提醒。我更新了答案,以显示如何摆脱
WindowPlacement
。(这就是你说的“窗口位置”的意思吗?)
PostQuitMessage(0);
//CFrameWndEx::OnClose(); << WE DO NOT WANT TO HAVE THIS CALLED!