958317280 发表于 2015-9-12 14:02:41

我与OutLook有个约会

我们公司是实行弹性工作制的,一天工作满8小时即可。
我的记性不是太好,总忘记什么来上班的。所以琢磨着怎么自己搞一个这样的小工具。
这不,刚好这几天工作不是太忙,做了一个小工具。
当你登陆系统时,它会判断你今天是否是第一次登陆,如果是的话,则向Microsoft OutLook
发送一个8小时后的“约会”。这样到你下班的时候,OutLook 就会提醒你该下班了。
这个工具分成三部分。
第一:Windows登陆事件监视器,它是一个dll文件。是用C 开发的。部分源代码如下

__declspec(dllexport)   void   __stdcall   testlogon(DWORD   unknow)
{
      //到临时目录下查找文件login.log,
      //1.如果找到,查看该文件的修改时间
      //2.没有则创建一个空文件,并且执行一个创建OutLook Appointment 的程序
      char tempPath;
      char fileName[] = "login.log";
      int i = 0;
      DWORD len;
      FILE * FileHandle;
      struct tm *newtime;
      STARTUPINFO si;
      PROCESS_INFORMATION pi;
      ZeroMemory( &si, sizeof(si) );
      si.cb = sizeof(si);
      ZeroMemory( &pi, sizeof(pi) );
      ZeroMemory(tempPath,sizeof(tempPath));
      len = GetTempPath(sizeof(tempPath),tempPath);
      for(i = 0 ;i< sizeof(fileName);i++)
      {
            tempPath = fileName;
      }

      if(FileExists(tempPath) == 1)
      {
            //
            printf("login1");
            newtime = GetFileMofiedTime(tempPath);
            if( IsToday(*newtime) == 0)
            {
                //free(newtime);
                remove(tempPath);
            }
            else
            {
             //free(newtime);
            return 1;
         }
      }
      printf("login2");
//      Sleep(1000);
//      if(FileExists(tempPath) == 1)
//      {
//            FileHandle = fopen(tempPath,"r+");
//      }
//      else
      {
          FileHandle = fopen(tempPath,"w+");
      }
      if(FileHandle != NULL)
      {
            fwrite(".",1,1,FileHandle);
            fclose(FileHandle);
      }
      //MessageBox(NULL,"login3",tempPath,MB_OK);
      if(!CreateProcess(NULL,"NewAppoint.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
      {
          printf("login4");//,tempPath,MB_OK);
         return 1;
      }
      else
      {
            printf("login5");//"login5",tempPath,MB_OK);
             // Wait until child process exits.
             WaitForSingleObject( pi.hProcess, INFINITE );
             // Close process and thread handles.
             CloseHandle( pi.hProcess );
             CloseHandle( pi.hThread );
      }
      return 1;
}
第二:注册这个监视器dll,是用下面的注册表文件注册的


Windows Registry Editor Version 5.00


"DLLName"="LogIn.dll"
"Logon"="testlogon"
"Impersonate"=dword:00000001
"Asynchronous"=dword:00000001
"Unlock"="testlogon"


第三:向OutLook发送约会的程序,源文件是用C#开发的。如下:

Microsoft.Office.Interop.Outlook.ApplicationClass outLookApp = new Microsoft.Office.Interop.Outlook.ApplicationClass();
            AppointmentItemClass appointItem = (AppointmentItemClass)outLookApp.CreateItem(OlItemType.olAppointmentItem);
            //appointItem
            appointItem.Location = "RPC";            
            appointItem.Subject = "It's time to go home";
            appointItem.Importance = OlImportance.olImportanceNormal;
            appointItem.Body = "Shark Xu.";
            appointItem.BusyStatus = OlBusyStatus.olOutOfOffice;
            appointItem.Duration = 1;
            appointItem.Start = System.DateTime.Now.AddHours(8.0);
            appointItem.ReminderMinutesBeforeStart = 1;
            appointItem.Sensitivity = OlSensitivity.olNormal;
            
            appointItem.Save();

我还做了一个安装文件,它是一个批处理文件

copy Login.dll %SystemRoot%\System32\
copy newAppoint.exe %SystemRoot%\System32\
regedit /s GoHome.reg
完全下载(包括所有的源文件和编译后的程序)
页: [1]
查看完整版本: 我与OutLook有个约会