修改 OleInsertDialog 显示内容

本文介绍了一个使用Windows钩子(CBT钩子)来修改和控制标准插入对象对话框的示例。通过钩子过程和自定义窗口过程,演示了如何隐藏特定控件、更改文件路径以及调整窗口大小等操作。

转贴指明作者

 

BOOL bFirst = TRUE;
HHOOK hKook;
WNDPROC hOldProc;

LRESULT CALLBACK
WndProcDlg(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
 TRACE( "%x/n", nMsg);
 if( nMsg == WM_INITDIALOG )
 {
  LRESULT lRet = hOldProc( hWnd, nMsg, wParam, lParam );
  HWND hSub = ::GetDlgItem( hWnd, 0x834 );
  ::ShowWindow( hSub, SW_HIDE );
  hSub = ::GetDlgItem( hWnd, 0x835 );
  ::ShowWindow( hSub, SW_HIDE );

  ::PostMessage(hSub, WM_LBUTTONDOWN, 0, 20 + (10 << 16) );
  ::PostMessage(hSub, WM_LBUTTONUP, 0, 20 + (10 << 16) );
  ::PostMessage(hWnd, WM_USER+1, 0, 0 );

  return  lRet;
 }

 if( WM_USER+1 == nMsg )
 {
  HWND hSub = ::GetDlgItem( hWnd, 0x836 );
  ::PostMessage(hSub, WM_LBUTTONDOWN, 0, 20 + (10 << 16) );
  ::PostMessage(hSub, WM_LBUTTONUP, 0, 20 + (10 << 16) );
  ::ShowWindow( hSub, SW_HIDE );

  hSub = ::GetDlgItem( hWnd, 0x83B );

  TCHAR *szPath = new TCHAR [_MAX_PATH];
  ::GetWindowText( hSub, szPath, _MAX_PATH );

  WIN32_FIND_DATA fd;
  HANDLE hFind = ::FindFirstFile( "c://A.tmp", &fd );
  if( hFind == INVALID_HANDLE_VALUE )
  {
   system( "cd > c://A.tmp" );
  }
  else
  {
   ::FindClose( hFind );
  }

  ::SetWindowText( hSub, "C://A.tmp" );

  hSub = ::GetDlgItem( hWnd, 0x838 );
  ::PostMessage(hSub, WM_LBUTTONDOWN, 0, 20 + (10 << 16) );
  ::PostMessage(hSub, WM_LBUTTONUP, 0, 20 + (10 << 16) );
  ::ShowWindow( hSub, SW_HIDE );
  ::PostMessage(hWnd, WM_USER+2, (WPARAM)szPath, 0 );

 }

 if( WM_USER+2== nMsg )
 {
  TCHAR * szPath = (TCHAR*) wParam;
  HWND hSub = ::GetDlgItem( hWnd, 0x83B );
  ::SetWindowText( hSub, szPath );
  delete szPath;

  hSub = ::GetDlgItem( hWnd, 0x83B );
  RECT rc;
  ::GetWindowRect( hSub, &rc );
  ::ScreenToClient( hWnd, (POINT*)&rc );
  ::ScreenToClient( hWnd, ((POINT*)&rc) + 1 );
  rc.left -= 40;
  ::MoveWindow( hSub, rc.left,  rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE );
  ::SetWindowLong( hWnd, GWL_WNDPROC, (LONG)hOldProc );
 }


 LRESULT lRet = hOldProc( hWnd, nMsg, wParam, lParam );
 return lRet;
}

 

LRESULT CALLBACK CBTProcDlg(  int code, WPARAM wParam,  LPARAM lParam )
{
 if (code != HCBT_CREATEWND)
 {
  return CallNextHookEx(hKook, code,
   wParam, lParam);
 }

 ASSERT(lParam != NULL);
 LPCREATESTRUCT lpcs = ((LPCBT_CREATEWND)lParam)->lpcs;
 ASSERT(lpcs != NULL);

 HWND hWnd = (HWND)wParam;
 TCHAR sz[100];
 ::GetClassName( hWnd, sz,  100 );

 if( 0 == strcmp( "#32770", sz ) )
 {
  if( bFirst )
   hOldProc = (WNDPROC)::SetWindowLong( hWnd, GWL_WNDPROC, (LONG)WndProcDlg );
  bFirst = FALSE;
 }

 LRESULT lResult = CallNextHookEx( hKook, code,
  wParam, lParam);

 return lResult;

}


void CTsolView::OnInsertObject()
{
 // Invoke the standard Insert Object dialog box to obtain information
 //  for new CTsolCntrItem object.
 HHOOK hKook= ::SetWindowsHookEx(WH_CBT,
  CBTProcDlg, NULL, ::GetCurrentThreadId());
 if ( hKook == NULL)
 {
  return;
 }
 bFirst = TRUE;


 COleInsertDialog dlg;
#if 0
 dlg.m_io.dwFlags &= ~IOF_SELECTCREATENEW;
 dlg.m_io.dwFlags |= IOF_SELECTCREATEFROMFILE;
 dlg.m_io.dwFlags |= IOF_CHECKLINK;
 dlg.m_io.dwFlags |= IOF_DISABLELINK;
 dlg.m_io.dwFlags |= IOF_CHECKDISPLAYASICON ;
 dlg.m_io.dwFlags |= IOF_DISABLEDISPLAYASICON;
#endif
 if (dlg.DoModal() != IDOK)
  return;

 ::UnhookWindowsHookEx( hKook );
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值