28 12
发新话题
打印

[讨论]打造最小C程序

谢谢sunwear、代码罐头,现在可以把程序传上来了

只是简单修改了几个地方,比如将strcat改成lstrcat、将楼主原来的atoi(GetWindowText)改成了GetDlgItemInt,BUT,效果显著……

哪位DX有时间接着改吧……
引用:
/*----------------------------------------------------------------
* File    :  shutdown.cpp
* Author  :  HuaiHuai  http://hhuai.cn
* Vesion  :  V 0.1
* Date    :  2006.04.03
* Comment  :  一个定时关机小程序
*---------------------------------------------------------------*/


#include <windows.h>
#include "resource.h"
#include "shutdown.h"

void main()   //反正楼主原来的参数也没有用,干脆去掉了,直接将程序入口定义到这里
{
   OSVERSIONINFO osv;
   osv.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
   GetVersionEx(&osv);
   if (osv.dwPlatformId==VER_PLATFORM_WIN32_NT)
   {
      if(!TiQuan())
      {
        MessageBox(0,"提取关机权限不成功!","程序退出",MB_OK);
        return;      // 将原来的exit去掉,目的是不使用C库
      }
   }
   
   DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG1),0,DialogProc);
   return;
}

int i=1;

BOOL CALLBACK DialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,    // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
)
{
   DlgHandle=hwndDlg;   
   switch(uMsg) {
   case WM_INITDIALOG:
        SetTimer(hwndDlg,1,1000,NULL);   
      break;   
   case WM_COMMAND:

      if (LOWORD(wParam)==IDCANCEL)   
        EndDialog(hwndDlg,0);
   
      if (LOWORD(wParam)==IDOK)
       IDOK_Proc();

      break;
   case WM_TIMER:
      time=time-1;
      InvalidateRect(hwndDlg,NULL,FALSE);
      break;

   case WM_PAINT:
      Show_Time();
      break;
   }
   return FALSE;
}

BOOL TiQuan()
{
   HANDLE hProcess,hToken;
   TOKEN_PRIVILEGES Privileges;
   LUID luid;

   hProcess=GetCurrentProcess();
   OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
   Privileges.PrivilegeCount=1;
   LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
   Privileges.Privileges[0].Luid=luid;
   Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
   if (!AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL)) {
      return 0;
   }
   else
      return 1;
}

VOID CALLBACK TimerProc(
  HWND hwnd,    // handle of window for timer messages
  UINT uMsg,    // WM_TIMER message
  UINT idEvent,  // timer identifier
  DWORD dwTime  // current system time
  )
{
ExitWindowsEx(EWX_POWEROFF || EWX_FORCE,0);
}

void IDOK_Proc()
{
      if(!IsShutDown)
        {
           time=GetDlgItemInt(DlgHandle, IDC_EDIT1, NULL, FALSE)*60;   //嘿嘿,其实主要改动的就是这一个地方,很有效啊~
           TimeId=SetTimer(DlgHandle,0,time*1000,TimerProc);
           SetWindowText(GetDlgItem(DlgHandle,IDOK),"Stop");
           SetWindowText(GetDlgItem(DlgHandle,IDC_Time),"OverTime:");
           IsShutDown=TRUE;   
           
           ShowWindow(GetDlgItem(DlgHandle,IDC_EDIT1),SW_HIDE);
        }
        else
        {
           KillTimer((HWND)TimeId,0);
           SetWindowText(GetDlgItem(DlgHandle,IDOK),"Start");
           SetWindowText(GetDlgItem(DlgHandle,IDC_Time),"Timer:");
           IsShutDown=FALSE;

           ShowWindow(GetDlgItem(DlgHandle,IDC_EDIT1),SW_SHOW);
        }
}


VOID Show_Time()
{
   if(!IsShutDown)
   {
      ShowWindow(GetDlgItem(DlgHandle,IDC_M1),SW_SHOW);
      ShowWindow(GetDlgItem(DlgHandle,IDC_EDIT1),SW_SHOW);
      ShowWindow(GetDlgItem(DlgHandle,IDC_H),SW_HIDE);
      ShowWindow(GetDlgItem(DlgHandle,IDC_M),SW_HIDE);
      ShowWindow(GetDlgItem(DlgHandle,IDC_S),SW_HIDE);
   }
   else
   {
      ShowWindow(GetDlgItem(DlgHandle,IDC_M1),SW_HIDE);
      ShowWindow(GetDlgItem(DlgHandle,IDC_EDIT1),SW_HIDE);
      ShowWindow(GetDlgItem(DlgHandle,IDC_H),SW_SHOW);
      ShowWindow(GetDlgItem(DlgHandle,IDC_M),SW_SHOW);
      ShowWindow(GetDlgItem(DlgHandle,IDC_S),SW_SHOW);

      int h=0,m=0,s=0;
      char pTime_M[10]={&#39;\0&#39;};
      char pTime_H[10]={&#39;\0&#39;};
      char pTime_S[10]={&#39;\0&#39;};
      

      if(time>3600)
      {
        h=time/3600;        
        wsprintf(pTime_H,"%d",h);      //改成调用API实现
      }

      if ((time-(h*3600))>60)
      {        
        m=(time-(h*3600)) /60;
        wsprintf(pTime_M,"%d",m);      //改成调用API实现
      }

      if ((time - (h*3600) - (m*60))>0)
      {
        s=time - (h*3600) - (m*60);
        wsprintf(pTime_S,"%d",s);      //改成调用API实现
      }

      SetWindowText(GetDlgItem(DlgHandle,IDC_H),lstrcat(pTime_H," H"));   // strcat改成调用API lstrcat
      SetWindowText(GetDlgItem(DlgHandle,IDC_M),lstrcat(pTime_M," M"));   // strcat改成调用API lstrcat
      SetWindowText(GetDlgItem(DlgHandle,IDC_S),lstrcat(pTime_S," S"));   // strcat改成调用API lstrcat
   }
   
}

附件

shutdown.exe.rar (2 KB)

2006-4-12 08:15, 下载次数: 47

编译后的程序

TOP

受益非浅啊,等了这么久...
就是等楼上的一席代码,跟我说理论没用,如今会策的人多,我要的就是这个,嘿嘿,超级感谢啊.

题外话:楼上的大侠是超级水手啊...
2004年注的册,2006年来发一帖...

TOP

[s:51]  [s:51]  [s:51] 原来的八进制不是不允许发帖么?偶又不喜欢水帖,所以就…… [s:69]

TOP

 28 12
发新话题