我用SHFormatDrive格式化A:盘时老是弹出系统格式对话筐,其实我不要提示直接格式化,我的代码:
 typedef DWORD (WINAPI * SHFormatDrive)(HWND hwnd,UINT drive,UINT fmtID,UINT options);
  SHFormatDrive pFnSHFormatDrive;
  HINSTANCE hInstance=LoadLibrary(_T ("Shell32.dll")); 
  if(hInstance==NULL) 
  return; 
  pFnSHFormatDrive=(SHFormatDrive)GetProcAddress(hInstance,"SHFormatDrive");  
  if(pFnSHFormatDrive==NULL) 
  { 
  FreeLibrary(hInstance); 
  return; 
  } 
  UINT OldMode = SetErrorMode(0); //得到缺省设置
  SetErrorMode(OldMode & !SEM_FAILCRITICALERRORS);//设置处理方式  pFnSHFormatDrive(NULL,0,0xFFFF,0x0000);
 // int n_Id = GetActiveWindow()->GetDlgCtrlID();
  SetErrorMode(OldMode); // 恢复缺省设置
  FreeLibrary(hInstance);

解决方案 »

  1.   

    模拟发送消息啊。
    大概可以这样
    enumchildwindows
    遍历所有的控件
    getwindowtext
    得到每一个控件的标题
    getclassname
    得到控件的类名称
    如果控件是按钮,而且标题是开始,getcursorpos得到目前鼠标的位置
    设置新的位置
    发送按钮被暗下的消息
    重新设置鼠标
      

  2.   

    HWND cancel = 0;
    BOOL CALLBACK myenumchildwindows( HWND hwnd, LPARAM lparam );
    BOOL CALLBACK
    myenumchildwindows( HWND hwnd, LPARAM lparam )
    {
    char t[ 100 ];
    char c[ 100 ];
    ::GetClassName( hwnd, t, 100 );
    ::GetWindowText( hwnd, c, 100 );
    if( !strncmp( c, "关闭", 4 ) && !strcmp( t, "Button" ) )
    cancel = hwnd;
    return 1;
    }
    BOOL CALLBACK myenumwindows( HWND hwnd, LPARAM lparam );
    BOOL CALLBACK
    myenumwindows( HWND hwnd, LPARAM lparam )
    {
    char t[ 100 ];
    ::GetWindowText( hwnd, t, 100 );
    if( !strncmp( "格式化", t, 6 ) )
    {
    cancel = 0;
    ::EnumChildWindows( hwnd, ( WNDENUMPROC )myenumchildwindows, 0 );
    }
    return 1;
    }
    void mythread( void *p );
    void
    mythread( void *p )
    {
    int i = 0;
    for( i = 0; i < 10; i++ )
    {
    Sleep( 1000 ); //等待1秒钟,一般都能够保证格式化对话框出来了
    cancel = 0;
    ::EnumWindows( ( WNDENUMPROC )myenumwindows, 0 );
    if( cancel )
    break;
    }
    if( !cancel )
    return;
    RECT r;
    POINT pp;
    ::GetCursorPos( &pp );
    ::GetWindowRect( cancel, &r );
    ::SetCursorPos( r.left + 2, r.top + 2 );
    mouse_event( MOUSEEVENTF_LEFTDOWN, r.left + 2, r.top + 2, 0, 0 );
    mouse_event( MOUSEEVENTF_LEFTUP, r.left + 2, r.top + 2, 0, 0 );
    ::SetCursorPos( pp.x, pp.y );
    }void CSizeDlg::OnButton2() 
    {
    typedef DWORD (WINAPI * SHFormatDrive)(HWND hwnd,UINT drive,UINT fmtID,UINT options);
    SHFormatDrive pFnSHFormatDrive;
    HINSTANCE hInstance=LoadLibrary(_T ("Shell32.dll")); 
    if(hInstance==NULL) 
    return; 
    pFnSHFormatDrive=(SHFormatDrive)GetProcAddress(hInstance,"SHFormatDrive");  
    if(pFnSHFormatDrive==NULL) 

    FreeLibrary(hInstance); 
    return; 

    UINT OldMode = SetErrorMode(0); //得到缺省设置
    SetErrorMode(OldMode & !SEM_FAILCRITICALERRORS);//设置处理方式
    _beginthread( mythread, 0, NULL );
    pFnSHFormatDrive(this->m_hWnd,3,0xFFFF,0x0000);
    // int n_Id = GetActiveWindow()->GetDlgCtrlID();
    SetErrorMode(OldMode); // 恢复缺省设置
    FreeLibrary(hInstance);
    }这是我显示格式化d盘,并且点取消的代码,稍微改动一下就可以点确定(开始)按钮了。