转贴指明作者
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 );
}