CF utilizzare le api di Windows Mobile, per effettuare le telefonate o rilevare informazioni alla SIM tramite C#

Questo esempio di codice, illustra come utilizzare le api di Windows Mobile, per effettuare delle telefonate e rilevare informazioni della SIM.

Effettuare una telefonata:

Namespace:

 

using

 

System.Runtime.InteropServices;

A livello di classe creare la seguente struttura e i due campi.

 

 

 

 

 

private static long PMCF_DEFAULT = 0×00000001;private static long PMCF_PROMPTBEFORECALLING = 0×00000002;private struct PhoneMakeCallInfo{

 

 

 

 

 

 

}

 

public IntPtr cbSize;public IntPtr dwFlags;public IntPtr pszDestAddress;public IntPtr pszAppName;public IntPtr pszCalledParty;public IntPtr pszComment;

Dichiarazione di api per effettuare la telefonata

 

[

 

 

DllImport("phone.dll")]private static extern IntPtr PhoneMakeCall(ref PhoneMakeCallInfo ppmci);

Funzione che effettua la chiamata

 

unsafe

{

 

 

 

 

private void Telefona(string numero)bool avvisa = true;IntPtr res;//numero += ”; 

 

{

 

info.cbSize = (

info.pszDestAddress = (

 

{

info.dwFlags = (

}

 

 

char[] cPhoneNumber = numero.ToCharArray();fixed (char* pAddr = cPhoneNumber)PhoneMakeCallInfo info = new PhoneMakeCallInfo();IntPtr)Marshal.SizeOf(info);IntPtr)pAddr;if (avvisa)IntPtr)PMCF_PROMPTBEFORECALLING;else{

info.dwFlags = (

}

res = PhoneMakeCall(

}

}

 

IntPtr)PMCF_DEFAULT;ref info);

Eseguire la funzione per effettuare la chiamata

 

 

{

Telefona(

}

 

private void btnChiama_Click(object sender, EventArgs e)“4250010001″);

 

Rilevare il numero di telefono, individuare gli sms che si possono ricevere ed il numeri di quelli ricevuti.

Dichiarazione a livello di classe

 

//Identificazione numero

 

 

 

public enum AddressType{

 

 

Unknown,

 

 

International,

 

 

National,

 

 

NetworkSpecific,

 

 

Subscriber,

 

 

Alphanumeric,

 

 

Abbreviated

}

 

 

//informazioni numero 

 

public struct PhoneAddress{

 

 

/// <summary>The address type.</summary> 

 

 

public AddressType AddressType;/// <summary>The phone number in string format.</summary> 

}

 

[

 

 

public String Address;private static long SERVICE_PROVIDER = 0x00006F46;StructLayout(LayoutKind.Sequential)]private struct SimRecord{

 

 

 

 

 

}

 

public IntPtr cbSize;public IntPtr dwParams;public IntPtr dwRecordType;public IntPtr dwItemCount;public IntPtr dwSize;Dichiarazione api

 

[

 

[DllImport("cellcore.dll")]

public static extern int SimInitialize(uint dwFlags, int lpfnCallBack, uint dwParam, ref int lphSim);

//private static extern IntPtr SimInitialize(IntPtr dwFlags, IntPtr lpfnCallBack, IntPtr dwParam, out IntPtr lphSim);[DllImport("cellcore.dll")]

private static extern IntPtr SimGetRecordInfo(IntPtr hSim, IntPtr dwAddress, ref SimRecord lpSimRecordInfo);

[DllImport("cellcore.dll")]

private static extern IntPtr SimReadRecord(IntPtr hSim, IntPtr dwAddress, IntPtr dwRecordType, IntPtr dwIndex, byte[] lpData, IntPtr dwBufferSize, ref IntPtr lpdwBytesRead);

[DllImport("cellcore.dll")]

private static extern IntPtr SimDeinitialize(IntPtr hSim);

[DllImport("cellcore.dll")]

public static extern int SimGetSmsStorageStatus(int hSim, uint dwStorage, ref uint lpdwUsed, ref uint lpdwTotal);

 

 

DllImport(“sms.dll”)]private static extern IntPtr SmsGetPhoneNumber(IntPtr psmsaAddress);Funzione che rileva il numero del telefono e tipo

 

unsafe private PhoneAddress GetPhoneNumber()

{

PhoneAddress phoneaddr = new PhoneAddress();

Byte[] buffer = new Byte[516];

fixed (byte* pAddr = buffer)

{

IntPtr res = SmsGetPhoneNumber((IntPtr)pAddr);

if (res != IntPtr.Zero)

throw new Exception(“Could not get phone number from SIM”);

byte* pCurrent = pAddr;

phoneaddr.AddressType = (AddressType)Marshal.ReadInt32((IntPtr)pCurrent);

pCurrent += Marshal.SizeOf(phoneaddr.AddressType);

phoneaddr.Address = Marshal.PtrToStringUni((IntPtr)pCurrent);

}

return phoneaddr;

}

 

Richiamare la funzione da un evento click del pulsante (numero telefono e tipo)

 

private void btnnumero_Click(object sender, EventArgs e)

{

string informazioni = “Numero: “ + GetPhoneNumber().Address + ” Tipo: “ + GetPhoneNumber().AddressType;

MessageBox.Show(informazioni);

}

 

Richiamare la funzione da un evento click di un pulsante per la gestione degli sms (totali e ricevuti)

 

private

{

 

 

 

 

SimInitialize(0, 0, 0,

SimGetSmsStorageStatus(hSim, SIM_SMSSTORAGE_SIM,

 

 

}

 

void btnSms_Click(object sender, EventArgs e)int hSim = 0;uint smsUsed = 0;uint smsTotal = 0;uint SIM_SMSSTORAGE_SIM = 0×2;ref hSim);ref smsUsed, ref smsTotal);MessageBox.Show(“Sms Usati: “ + smsUsed.ToString());MessageBox.Show(“Sms Totali: “ + smsTotal.ToString());Tramite la parola download è possibile scaricare il file di esempio

Download

       

CF avviare un processo

In questo esempio di codice, vedremo come utilizzare le api di Windows Mobile, per avviare un programma eseguibile.
In alternativa al metodo start della classe process (il cf 1.1 non ne dispone) per avviare i vari processi, si può ricorrere alla dichiarazione di api (CreateProcess) per avviare un determinato programma.
Di seguito si riporta un esempio di codice.

Dichiarazione di Api e struttura

 

VB.Net

Declare Function CreateProcess Lib “coredll.dll” (ByVal imageName As String, ByVal cmdLine As String, ByVal lpProcessAttributes As IntPtr, ByVal lpThreadAttributes As IntPtr, ByVal boolInheritHandles As Int32, ByVal dwCreationFlags As Int32, ByVal lpEnvironment As IntPtr, ByVal lpszCurrentDir As IntPtr, ByVal si As Byte(), ByVal pi As ProcessInfo) As Integer

Public Class ProcessInfo

Public hProcess As IntPtr

Public hThread As IntPtr

Public ProcessId As Int32

Public ThreadId As Int32

End Class

C#

[DllImport("coredll.dll", SetLastError = true)]

static extern bool CreateProcess(String imageName,

String cmdLine,

IntPtr lpProcessAttributes,

IntPtr lpThreadAttributes,

bool boolInheritHandles,

Int32 dwCreationFlags,

IntPtr lpEnvironment,

IntPtr lpszCurrentDir,

byte[] si,

ProcessInfo pi);

public class ProcessInfo

{

public IntPtr hProcess;

public IntPtr hThread;

public Int32 ProcessId;

public Int32 ThreadId;

}

Codice da inserire in un evento click di un pulsante

VB.Net

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

Dim pi As New ProcessInfo

Dim si(128) As Byte

Dim resultato As Int32

 

resultato = CreateProcess(“calc.exe”, “”, IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero, IntPtr.Zero, si, pi)

 

 

 

End Sub

C#

private void button1_Click(object sender, EventArgs e)

{

ProcessInfo pi = new ProcessInfo();

byte[] si = new byte[128];

bool resultato = CreateProcess(“calc.exe”, ” “, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, IntPtr.Zero, si, pi);

 

}

Tramite la parola download è possibile scaricare il file di esempio.

Download esempio

Paginazione di un controllo gridview in Asp.Net 2.0

Per il sito iprogrammatori http://www.iprogrammatori.it/articoli/programmazione/paginazione_controllo_gridview.asp

Figura 1

Introduzione:

In questo articolo, vedremo come applicare ad un controllo GridView (Asp.Net) la paginazione ed inserire nella prima colonna un pulsante per il rilevamento del dato della riga a cui si è fatto click. Si crea un nuovo progetto Web, inseriamo nella nuova pagina, un controllo gridView ed una label, l’aspetto dev’essere simile come mostrato in figura 1.

Fatto ciò si creano tre colonne per il controllo gridView, due di tipo boundfield ed una tipo buttonField

Di seguito è riportato il frammento di codice delle suddette operazioni.

<Columns>

 

<asp:ButtonField ButtonType=”Button” CommandName=”Seleziona” Text=”Seleziona” />

<asp:BoundField DataField=”Valore A” HeaderText=”Valore A” />

<asp:BoundField DataField=”Valore B” HeaderText=”Valore B” />

Columns>

Impostare le proprietà del controllo GridView.

Per applicare la paginazione ad un controllo GridView, occorre impostare a true la proprietà “AllowPaging” del controllo, fatto ciò si imposta la proprietà EnabledSortingAndPagingCallBacks a true (figura 2), in questo modo ci permette di evitare di scrivere il codice per la gestione della paginazione, tale proprietà indica se deve essere eseguito il rendering dello script client per l’ordinamento e la paginazione ai client browser che supportano il callback. La proprietà pageSize, la impostiamo a 5, in questo modo avremo per ogni pagina 5 record.

Figura 2

A questo punto non ci resta, che scrivere nell’evento load della pagina, il codice per il caricamento dei dati nel controllo gridiview.

Di seguito si riporta il frammento di codice per il caricamento dei dati, il dataTable, verrà popolata con 15 righe.

VB.Net

 

Dim dtcColonnaA As New DataColumn(“Valore A”

)

Dim dtcColonnaB As New DataColumn(“Valore B”

)

Dim dttDati As New

DataTable()

dttDati.Columns.Add(dtcColonnaA)

dttDati.Columns.Add(dtcColonnaB)

For conta As Integer = 1 To

15

Dim dtrRiga As

DataRow = dttDati.NewRow()

dtrRiga(0) =

“Valore A di “

& conta

dtrRiga(1) =

“Valore B di “

& conta

dttDati.Rows.Add(dtrRiga)

Next

GridView1.DataSource = dttDati

GridView1.DataBind()

 

C#

 

DataColumn

dtcColonnaA = new DataColumn(“Valore A”

);

DataColumn dtcColonnaB = new DataColumn(“Valore B”

);

DataTable dttDati = new DataTable

();

dttDati.Columns.Add(dtcColonnaA);

dttDati.Columns.Add(dtcColonnaB);

for (int

conta = 1; conta < 16; conta++)

{

DataRow

dtrRiga = dttDati.NewRow();

dtrRiga[0] =

“Valore A di “

+ conta;

dtrRiga[1] =

“Valore B di “

+ conta;

dttDati.Rows.Add(dtrRiga);

}

GridView1.DataSource = dttDati;

GridView1.DataBind();

A questo punto non ci resta che eseguire la nostra pagina.

Altri consigli.

Con il metodo precedente, si è visto come dotare il controllo gridiview,di paginazione, se nel caso, lasciamo la proprietà EnabledSortingAndPagingCallBacks a false, possiamo gestire la paginazione da codice, nel seguente modo.

Nell’evento PageIndexChanging, del controllo GridView, assegniamo alla proprietà PageIndex, del gridiview il valore della proprietà NewPageIndex della classe GridViewPageEventArgs .

Di seguito si riporta il codice, che permette di gestire la paginazione del controllo.

VB.Net

 

Protected Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles

GridView1.PageIndexChanging

GridView1.PageIndex = e.NewPageIndex

GridView1.DataBind()

End Sub

C#

 

protected

void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs

e)

{

GridView1.PageIndex = e.NewPageIndex;

GridView1.DataBind();

}

Il pulsante buttonField

Tramite il pulsante buttonField, possiamo aggiungere al controllo GridView, un pulsante di comando. Di seguito si riporta un esempio di codice, che al click di tale pulsante, imposta la proprietà Text del controllo label, con il valore della prima colonna (A) della riga a cui si è fatto click sul pulsante.

VB.Net

 

Protected

Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles

GridView1.RowCommand

Verifo che il pulsante a cui si è fatto click è quello giusto

If e.CommandName = “Seleziona” Then

Dim intRiga As Integer = CType(e.CommandArgument, Integer

)

lbltesto.Text = GridView1.Rows(intRiga).Cells(1).Text

End If

End Sub

C#

 

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs

e)

{

 

//Verifo che il pulsante a cui si è fatto click èquello giusto

 

if(e.CommandName == “Seleziona”

)

{

int riga = Convert

.ToInt32(e.CommandArgument);

lbltesto.Text = GridView1.Rows[riga].Cells[1].Text;

}

}

 

Conclusioni:

In questo articolo, si è visto come applicare ad un controllo gridiview la paginazione senza scrivere un riga di codice, inoltre si è visto come aggiungere un pulsante di comando per rilevare determinati dati. Tramite la parola download è possibile scaricare il file di esempio.

Download

 

Pubblicato in Asp.Net. Tag: . Lascia un commento »