我用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);
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);
大概可以这样
enumchildwindows
遍历所有的控件
getwindowtext
得到每一个控件的标题
getclassname
得到控件的类名称
如果控件是按钮,而且标题是开始,getcursorpos得到目前鼠标的位置
设置新的位置
发送按钮被暗下的消息
重新设置鼠标
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盘,并且点取消的代码,稍微改动一下就可以点确定(开始)按钮了。