问题:ICopyHook在Win7中没有起作用。我的使用:
1.接口继承
class ATL_NO_VTABLE CHookUtil :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CHookUtil, &CLSID_HookUtil>,
public ICopyHook, // ICopyHook interface.2.代码实现
//Unicode Version.
STDMETHODIMP_(UINT) CHookUtil::CopyCallback(HWND hwnd, UINT wFunc, UINT wFlags, LPCWSTR pszSrcFile, DWORD dwSrcAttribs,
LPCWSTR pszDestFile, DWORD dwDestAttribs)
{
::MessageBoxA(NULL, "...............!", "提示信息", MB_OK|MB_ICONINFORMATION); return IDYES;
}
3.注册表HKCR
{
PrinterHooker.HookUtil.1 = s 'HookUtil Class'
{
CLSID = s '{A1D1C568-E1FC-4389-B99D-074A11F3B660}'
}
PrinterHooker.HookUtil = s 'HookUtil Class'
{
CLSID = s '{A1D1C568-E1FC-4389-B99D-074A11F3B660}'
CurVer = s 'PrinterHooker.HookUtil.1'
}
NoRemove CLSID
{
ForceRemove {A1D1C568-E1FC-4389-B99D-074A11F3B660} = s 'HookUtil Class'
{
ProgID = s 'PrinterHooker.HookUtil.1'
VersionIndependentProgID = s 'PrinterHooker.HookUtil'
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
val AppID = s '%APPID%'
'TypeLib' = s '{8BA322D3-2632-4124-A1FF-C0E60B4B4656}'
}
}
Printers
{
ShellEx
{
CopyHookHandlers
{
PrinterHooker = s '{A1D1C568-E1FC-4389-B99D-074A11F3B660}'
}
}
}
}HKLM
{
NoRemove Software
{
NoRemove Microsoft
{
NoRemove Windows
{
NoRemove CurrentVersion
{
NoRemove 'Shell Extensions'
{
NoRemove Approved
{
val '{A1D1C568-E1FC-4389-B99D-074A11F3B660}' = s 'PrinterHooker'
}
}
}
}
}
}
}
1.接口继承
class ATL_NO_VTABLE CHookUtil :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CHookUtil, &CLSID_HookUtil>,
public ICopyHook, // ICopyHook interface.2.代码实现
//Unicode Version.
STDMETHODIMP_(UINT) CHookUtil::CopyCallback(HWND hwnd, UINT wFunc, UINT wFlags, LPCWSTR pszSrcFile, DWORD dwSrcAttribs,
LPCWSTR pszDestFile, DWORD dwDestAttribs)
{
::MessageBoxA(NULL, "...............!", "提示信息", MB_OK|MB_ICONINFORMATION); return IDYES;
}
3.注册表HKCR
{
PrinterHooker.HookUtil.1 = s 'HookUtil Class'
{
CLSID = s '{A1D1C568-E1FC-4389-B99D-074A11F3B660}'
}
PrinterHooker.HookUtil = s 'HookUtil Class'
{
CLSID = s '{A1D1C568-E1FC-4389-B99D-074A11F3B660}'
CurVer = s 'PrinterHooker.HookUtil.1'
}
NoRemove CLSID
{
ForceRemove {A1D1C568-E1FC-4389-B99D-074A11F3B660} = s 'HookUtil Class'
{
ProgID = s 'PrinterHooker.HookUtil.1'
VersionIndependentProgID = s 'PrinterHooker.HookUtil'
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
val AppID = s '%APPID%'
'TypeLib' = s '{8BA322D3-2632-4124-A1FF-C0E60B4B4656}'
}
}
Printers
{
ShellEx
{
CopyHookHandlers
{
PrinterHooker = s '{A1D1C568-E1FC-4389-B99D-074A11F3B660}'
}
}
}
}HKLM
{
NoRemove Software
{
NoRemove Microsoft
{
NoRemove Windows
{
NoRemove CurrentVersion
{
NoRemove 'Shell Extensions'
{
NoRemove Approved
{
val '{A1D1C568-E1FC-4389-B99D-074A11F3B660}' = s 'PrinterHooker'
}
}
}
}
}
}
}
另外如果是XP系统,在IE6、7、8环境下都运行正常。
HKLM这段注册表到底写进去没有咯看看是不是组件没注册成功
莫非 ICopyHook 有特别接口要实现?
interface, therefore it's currently disabled by default on Vista with a
policy control:You can turn it on by enabling POLID_EnableShellExecuteHooks. Set this
under
[HKLM|HKCU]\Softwaren\Microsoft\Windows\CurrentVersion\Policies\Explorer
EnableShellExecuteHooks=<DWORD>1. http://www.codeguru.com/forum/showthread.php?t=485132
“用户在右键属性对话框中修改打印机名称”的方式没有走系统的HOOK,所以没有控制住。高手支招啊。