//第一个问题:
void CImpulseDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
m_stic-=1;          //m_stic是我在头文件类定义的int类型变量
CString num;
num.Format("%16d",m_stic);
num.TrimLeft();
CWnd *pWnd=this->GetDlgItem(IDC_STATIC_MY);    //IDC_STATIC_MY是文本框控件ID
pWnd->SetWindowText(num);
if(m_stic==0)
{
PostMessage(WM_CLOSEWINDOWS_MESSAGE);
}
CDialog::OnTimer(nIDEvent);
}
为什么我在把文本框控件调小一点就显示不出来数字了呢?调得很大的时候没什么问题!//第二个问题
怎么样在一个类中给另外一个类发送消息!请详细说明,用不用加另一个类的头文件等等!
//第三个问题
我在程序中调用ExWindowsEx(EWX_REBOOT,0)和ExWindowsEx(EWX_FORCE,0)电脑都会注销,而不是重新启动或者关闭计算机,而ExWindowsEx(EWX_SHUNDOWN,0)却没什么反应,但我用关闭计算机却可以正常工作,请问这是怎么会事啊?

解决方案 »

  1.   

    2.自定义一个消息,可用sendMessage来发送即可
      

  2.   

    3.
    BOOL MySystemShutdown()
    {
       HANDLE hToken; 
       TOKEN_PRIVILEGES tkp; 
     
       // Get a token for this process. 
     
       if (!OpenProcessToken(GetCurrentProcess(), 
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
          return( FALSE ); 
     
       // Get the LUID for the shutdown privilege. 
     
       LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
            &tkp.Privileges[0].Luid); 
     
       tkp.PrivilegeCount = 1;  // one privilege to set    
       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
     
       // Get the shutdown privilege for this process. 
     
       AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
            (PTOKEN_PRIVILEGES)NULL, 0); 
     
       if (GetLastError() != ERROR_SUCCESS) 
          return FALSE; 
     
       // Shut down the system and force all applications to close. 
     
       if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) 
          return FALSE;    return TRUE;
    }
      

  3.   

    2.
     如果第二个类是一个窗口,用SendMessage/PostMessage
     如果第二个类是一个线程,用PostThreadMessage
     如果第二个类什么都不是,直接调用函数
      

  4.   

    用sendMessage发送自己定义的消息!
      

  5.   

    1.你最好设置一个变量,直接赋值就可以了。显示不出来数字的原因很多的。比如你的文本框太小?不是自调整大小的?不是你的数字太大?等等。一般的做法是给一个很大的文本框,然后定义这个文本框的一个变量,随时赋值就可以了。2。在一个类中给另外一个类发送消息的方法很多,比如自定义消息,回调函数,最简单的是直接调用对方的成员函数。3。查MSDN的ExWindowsEx函数,有一个很好用的例子,不过最好的办法函数模拟键盘,因为使用函数无法关闭电源,只有模拟键盘的方法才是比较安全的。
      

  6.   

    1:估计数字是显示出来了的,你有鼠标在输入框中拖一下,看有没有选中东西。
    2:如果晓得另个窗口的句柄,可以用句柄来发消息。(不是类向类发消息,类是不能发消息或收消息的,在有窗口可以)
    ::SendMessage(HWND,MESSAGE,WPARAM,LPARAM);
    eg.
    ::SendMessage(hWnd,WM_CLOSE,0,0);
    3:程序的权限不够,需要自己修改权限。
      

  7.   

    3.不一定是权限不够哦EWX_FORCE只是一个辅助样式,必须与其他退出样式按位或了后用
      

  8.   

    谢谢大家,用上面的方法确实可以关机了,但我不知道到底是什么原理呢?请好心的各位解释一下好么?
    BOOL MySystemShutdown()
    {
       HANDLE hToken; 
       TOKEN_PRIVILEGES tkp; 
     
       // Get a token for this process. 
     
       if (!OpenProcessToken(GetCurrentProcess(), 
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
          return( FALSE ); 
     
       // Get the LUID for the shutdown privilege. 
     
       LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
            &tkp.Privileges[0].Luid); 
     
       tkp.PrivilegeCount = 1;  // one privilege to set    
       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
     
       // Get the shutdown privilege for this process. 
     
       AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
            (PTOKEN_PRIVILEGES)NULL, 0); 
     
       if (GetLastError() != ERROR_SUCCESS) 
          return FALSE; 
     
       // Shut down the system and force all applications to close. 
     
       if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) 
          return FALSE;    return TRUE;
    }