刁琳琳太丑了:关于VC编程实现explorer刷新问题
来源:百度文库 编辑:中财网 时间:2024/05/27 11:04:49
关于VC编程实现explorer刷新问题
我想修改注册表,是系统显示文件的后缀名,但是程序执行后,需要手动刷新才能看到效果。可以用程序实现吗?
杀explorer进程就别说了。
貌似在文件夹选项里面修改以后,立刻就会生效,
SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE ...,)
或者SystemParametersInfo(..,WM_SETTINGCHANGE)
试试看
用SHDocVw::IShellWindowsPtr来实现。
简单的核心代码:
class CAutoRefreshDlg : public CDialog
{
...........
CListCtrlm_ctrlIE;
SHDocVw::IShellWindowsPtr m_spSHWinds;
...........
};
BOOL CAutoRefreshDlg::OnInitDialog()
{
CoInitialize(NULL);
...............
if (m_spSHWinds == NULL){
if (m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK){
MessageBox( "Failed ");
CoUninitialize();
EndDialog(1);
}
}
m_ctrlIE.SetExtendedStyle(LVS_EX_CHECKBOXES|LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_ctrlIE.InsertColumn(0, "IE ", LVCFMT_LEFT, 500, -1);
OnButtonRefresh();
m_uTimerRefresh = SetTimer(1, m_uFreq*1000, NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CAutoRefreshDlg::OnButtonRefresh()
{
// TODO: Add your control notification handler code here
int n = m_ctrlIE.GetItemCount();//GetCount();
for (int i = 0; i < n; i ++){
IWebBrowser2 *pBrowser = (IWebBrowser2 *)m_ctrlIE.GetItemData(i);
if (pBrowser){
pBrowser-> Release();
}
}
m_ctrlIE.DeleteAllItems();
if (m_spSHWinds){
int n = m_spSHWinds-> GetCount();
for (int i = 0; i < n; i++){
_variant_t v = (long)i;
IDispatchPtr spDisp = m_spSHWinds-> Item(v);
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
if (spBrowser){
_bstr_t bsName = spBrowser-> GetLocationName();
int nPos = m_ctrlIE.InsertItem(0, bsName);
spBrowser-> AddRef();
void * pData = spBrowser;
m_ctrlIE.SetItemData(nPos, (DWORD)(pData));
}
}
}
}
void CAutoRefreshDlg::DoClose()
{
int n = m_ctrlIE.GetItemCount();//GetCount();
for (int i = 0; i < n; i ++){
IWebBrowser2 *pBrowser = (IWebBrowser2 *)m_ctrlIE.GetItemData(i);
if (pBrowser){
pBrowser-> Release();
}
}
m_ctrlIE.DeleteAllItems();
if (m_spSHWinds){
m_spSHWinds.Release();
m_spSHWinds = 0;
}
CoUninitialize();
EndDialog(0);
}
void CAutoRefreshDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent == 1){
int n = m_ctrlIE.GetItemCount();
for (int i = 0; i < n; i++){
if (m_ctrlIE.GetCheck(i)){
IWebBrowser2 *pBrowser = (IWebBrowser2 *)m_ctrlIE.GetItemData(i);
if (pBrowser){
pBrowser-> Refresh();
}
}
}
}
CDialog::OnTimer(nIDEvent);
}
我想修改注册表,是系统显示文件的后缀名,但是程序执行后,需要手动刷新才能看到效果。可以用程序实现吗?
杀explorer进程就别说了。
貌似在文件夹选项里面修改以后,立刻就会生效,
SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE ...,)
或者SystemParametersInfo(..,WM_SETTINGCHANGE)
试试看
用SHDocVw::IShellWindowsPtr来实现。
简单的核心代码:
class CAutoRefreshDlg : public CDialog
{
...........
CListCtrlm_ctrlIE;
SHDocVw::IShellWindowsPtr m_spSHWinds;
...........
};
BOOL CAutoRefreshDlg::OnInitDialog()
{
CoInitialize(NULL);
...............
if (m_spSHWinds == NULL){
if (m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK){
MessageBox( "Failed ");
CoUninitialize();
EndDialog(1);
}
}
m_ctrlIE.SetExtendedStyle(LVS_EX_CHECKBOXES|LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_ctrlIE.InsertColumn(0, "IE ", LVCFMT_LEFT, 500, -1);
OnButtonRefresh();
m_uTimerRefresh = SetTimer(1, m_uFreq*1000, NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CAutoRefreshDlg::OnButtonRefresh()
{
// TODO: Add your control notification handler code here
int n = m_ctrlIE.GetItemCount();//GetCount();
for (int i = 0; i < n; i ++){
IWebBrowser2 *pBrowser = (IWebBrowser2 *)m_ctrlIE.GetItemData(i);
if (pBrowser){
pBrowser-> Release();
}
}
m_ctrlIE.DeleteAllItems();
if (m_spSHWinds){
int n = m_spSHWinds-> GetCount();
for (int i = 0; i < n; i++){
_variant_t v = (long)i;
IDispatchPtr spDisp = m_spSHWinds-> Item(v);
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
if (spBrowser){
_bstr_t bsName = spBrowser-> GetLocationName();
int nPos = m_ctrlIE.InsertItem(0, bsName);
spBrowser-> AddRef();
void * pData = spBrowser;
m_ctrlIE.SetItemData(nPos, (DWORD)(pData));
}
}
}
}
void CAutoRefreshDlg::DoClose()
{
int n = m_ctrlIE.GetItemCount();//GetCount();
for (int i = 0; i < n; i ++){
IWebBrowser2 *pBrowser = (IWebBrowser2 *)m_ctrlIE.GetItemData(i);
if (pBrowser){
pBrowser-> Release();
}
}
m_ctrlIE.DeleteAllItems();
if (m_spSHWinds){
m_spSHWinds.Release();
m_spSHWinds = 0;
}
CoUninitialize();
EndDialog(0);
}
void CAutoRefreshDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent == 1){
int n = m_ctrlIE.GetItemCount();
for (int i = 0; i < n; i++){
if (m_ctrlIE.GetCheck(i)){
IWebBrowser2 *pBrowser = (IWebBrowser2 *)m_ctrlIE.GetItemData(i);
if (pBrowser){
pBrowser-> Refresh();
}
}
}
}
CDialog::OnTimer(nIDEvent);
}