Einzelnen Beitrag anzeigen

Towmuz

Registriert seit: 21. Sep 2016
Ort: Minden
127 Beiträge
 
Delphi 10.1 Berlin Professional
 
#11

AW: WinCE Batteriestatus in Delphi VCL Anwendung (über RDP)

  Alt 26. Sep 2016, 10:53
So hab ichs nun verbaut, vieleicht brauchts mal wer...

Für die Mini-Anwendung auf dem Handscanner mit Windows CE, wurden SharpDevelop(sone Art freies VisualStudio) und das CompactFramework verwendet. SharpDevelop V3.2 für .Net 3.5 und CompactFramework 3.5.
SharpDevelop 3.2 ist wohl die letzte Version, die das CompactFramework mit NET 3.5 unterstützt.

Generelle Funktionsweise CE Anwendung C#, schreibt jede Minute den Batteriestatus in eine Ini.
Code:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using System.Threading;

namespace JZPW1310_Battery
{
   public class SYSTEM_POWER_STATUS_EX
   {
       public byte ACLineStatus;
       public byte BatteryFlag;
       public byte BatteryLifePercent;
       public byte Reserved1;
       public uint BatteryLifeTime;
       public uint BatteryFullLifeTime;
       public byte Reserved2;
       public byte BackupBatteryFlag;
       public byte BackupBatteryLifePercent;
       public byte Reserved3;
       public uint BackupBatteryLifeTime;
       public uint BackupBatteryFullLifeTime;
   }
   
   public partial class MainForm : Form
   {      
      [DllImport("coredll")]
      private static extern uint GetSystemPowerStatusEx(SYSTEM_POWER_STATUS_EX lpSystemPowerStatus, bool fUpdate);
      
      public static void Main(string[] args)
      {
         System.Threading.Timer t = new System.Threading.Timer(TimerCb, null, 0, 60000);
         Console.ReadLine();
      }   
      
      private static void TimerCb(Object o)
      {
         try {
            SYSTEM_POWER_STATUS_EX status = new SYSTEM_POWER_STATUS_EX();         
            string dir = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            if (GetSystemPowerStatusEx(status, false) == 1)
            {                        
//               Console.WriteLine("BatteryLifePercent=" + status.BatteryLifePercent.ToString());
               StreamWriter sw = new StreamWriter(dir + @"\battery.status");            
               sw.WriteLine("[BatteryStatus]");
               sw.WriteLine("BatteryLifePercent=" + status.BatteryLifePercent.ToString());
               sw.Close();
               GC.Collect();
            }   
         } catch (Exception ex) {
//            Console.WriteLine(ex.Message + ' : ' + ex.StackTrace);
         }         
      }
   }
}
In WinCE RDP-Verbindungseigenschaften noch die Ordnerfreigabe definieren und auf dem RD-System (WinServ2003 in dem Fall oder sonst irgendnem Win) in der DelphiAnwendung über einen Timer die Ini auslesen.
Delphi-Quellcode:
uses IniFiles;

procedure Tfrm_bla_Programm.tmr1Timer(Sender: TObject);
var
  ini: TIniFile;
  percent: Integer;
  caption: string;
begin
  try
    begin
      ini := TIniFile.Create('\\tsclient\Files\Temp\battery.status');
      caption := ini.ReadString('BatteryStatus', 'BatteryLifePercent', '') + ' %';
      percent := StrToInt(ini.ReadString('BatteryStatus', 'BatteryLifePercent', ''));
      pb1.Position := percent;
      lbl1.Caption := caption;
      ini.Free;
    end;
  except on e: exception do
    begin
      pb1.Position := 100;
      lbl1.Caption := 'ERROR';
    end;
  end;
end;
Fals das hier zu Detail- oder Erleuterungsarm erscheint, schreib ichs gern ausführlicher bzw. aufgeräumter, habe noch nicht viel Programmierforenerfahrung .
Thomas
  Mit Zitat antworten Zitat