最近开发的Web项目,为了解决PDF文件自动静默打印问题,思考多时,使用了ActiveX全局钩子。 static HHOOK g_hHook = NULL; static LRESULT CALLBACK MyProc(int nCode, WPARAM wParam, LPARAM lParam); class InitClass { public: InitClass(){} ~InitClass() { if (g_hHook) UnhookWindowsHookEx(g_hHook);//去除挂钩 } }; static InitClass InitClass; LRESULT CALLBACK MyProc(int nCode, WPARAM wParam, LPARAM lParam) { switch (nCode) { case HCBT_CREATEWND: { HWND hWnd = (HWND)wParam; LPCBT_CREATEWND pcbt = (LPCBT_CREATEWND)lParam; LPCREATESTRUCT pcs = pcbt->lpcs; if ((DWORD)pcs->lpszClass == 0x00008002)//对话框类名 { TRACE(pcs->lpszName); if (strcmp(pcs->lpszName,"打印")==0){ keybd_event(13,0,0,0);//直接发了个回车,偷懒,也确实是adobe的控件没研究好。 } break; } /* case HCBT_DESTROYWND: { HWND hwnd = (HWND)wParam; if (hwnd == g_hWndDialog) { UnhookWindowsHookEx(g_hHook);//去除挂钩 } break; } */ } return CallNextHookEx(g_hHook, nCode, wParam, lParam); } //...加载 TRACE("CStarPrinterCtrl"); if (!g_hHook) g_hHook = ::SetWindowsHookEx(WH_CBT, MyProc, ::AfxGetInstanceHandle(), 0);//GetCurrentThreadId()); if (!g_hHook) { TRACE("加载WH_CBT钩子错误!"); } //... 应该解决的问题: HWND phwnd = ::GetDlgItem(hWnd, 1); if (phwnd) { PostMessage(phwnd, BM_CLICK, 0, 0); } //模拟点击打印按钮}//这里就是找不到HWND的ID,不知道是不是控件问题,只好发了个回车。