|
I have a single form application that runs in the systray. It is an audit trail logger that uses FileSystemWatcher to monitor file events in a directory. I can capture everything that I am looking to capture except when someone logs off the computer.
I tried using the Form1_Closing method, but it doesn't seem to activate when Windows is closing the application when a user logs off or shuts down the computer. Am I missing something?
Here is my code for the Form1_Closing method. I have no code pointing to this method, I just assume it finds the method when the application closes.
private void Form1_Closing(object sender, FormClosedEventArgs e)<br />
<br />
{<br />
MessageBox.Show("Closing Form");<br />
<br />
string _userName = Environment.UserName;<br />
string _date = DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss");<br />
string _eventType = "Logged Off";<br />
RegistryKey _regKey = Registry.LocalMachine;<br />
RegistryKey _subRegKey = _regKey.OpenSubKey("Software\\LAT_Systray");<br />
string _fileName = Convert.ToString(_subRegKey.GetValue("File_Name"));<br />
<br />
XmlDocument _xmlDoc = new XmlDocument();<br />
<br />
_xmlDoc.Load(_fileName);<br />
<br />
XmlElement _newEvent = _xmlDoc.CreateElement("Event");<br />
<br />
XmlElement _newDateNode = _xmlDoc.CreateElement("EventTime");<br />
_newDateNode.InnerText = _date;<br />
_newEvent.AppendChild(_newDateNode);<br />
<br />
XmlElement _newUserNode = _xmlDoc.CreateElement("UserName");<br />
_newUserNode.InnerText = Environment.UserName;<br />
_newEvent.AppendChild(_newUserNode);<br />
<br />
XmlElement _newTypeNode = _xmlDoc.CreateElement("EventType");<br />
_newTypeNode.InnerText = _eventType;<br />
_newEvent.AppendChild(_newTypeNode);<br />
<br />
_xmlDoc.DocumentElement.InsertAfter(_newEvent, _xmlDoc.DocumentElement.LastChild);<br />
<br />
FileStream _fsxml = new FileStream(_fileName, FileMode.Truncate, FileAccess.Write, FileShare.ReadWrite);<br />
_xmlDoc.Save(_fsxml);<br />
_fsxml.Close();<br />
<br />
}
Any help is greatly appreciated as you know.
Jeff
IT by necessity only
|
|
|
|
|
Did you look at SystemEvents class ?
|
|
|
|
|
What am I looking for in the SystemEvents Class? SessionEnding? And how would I use it?
Jeff
|
|
|
|
|
eb38335 wrote: SessionEnding
Yes.
In some discussions I read, it was stated that OnClosing does not always work
reliably. IIRC they claimed one should try using OnClosing, OnFormClosing and
SessionEnding; they probably each would call a single method that could handle
all kinds of exit scenarios.
It is my guess logoff will first generate a SessionEnding event, and
later on tries to close the forms, but may fail to do so, e.g. because
its time is limited, or for some reason it just decides to kill the processes.
Hope this helps.
|
|
|
|
|
I have downloaded the program Instant_Messenger_src .But i am little confused hoe to run that and how to add new client into that application and how to do IM with multiple clients?
Plz help me.
|
|
|
|
|
Please don't spam the entire site, just ask the right person, in the right place.
Christian Graus - Microsoft MVP - C++
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|
i m little bit confused as i m new in this site ...
sorry...
|
|
|
|
|
Well, like I said, if it's an article, no-one here knows what you're talking about. There's a forum under the text of the article, post your article specific question there.
Christian Graus - Microsoft MVP - C++
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|
Here is an example of a use of the TransactionScope class:
using (TransactionScope ts = new TransactionScope())
{
SqlConnection myConnection = new SqlConnection("server=(local)\\SQLExpress;Integrated Security=SSPI;database=northwind");
SqlCommand myCommand = new SqlCommand();
myConnection.Open();
myCommand.Connection = myConnection;
myCommand.CommandText = "DELETE FROM Region WHERE (RegionID = 100) OR (RegionID = 101)";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'MidWestern')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'MidEastern')";
myCommand.ExecuteNonQuery();
myConnection.Close();
ConsoleKeyInfo c;
while (true)
{
Console.Write("Complete the transaction scope? [Y|N] ");
c = Console.ReadKey();
Console.WriteLine();
if ((c.KeyChar == 'Y') || (c.KeyChar == 'y'))
{
ts.Complete();
break;
}
else if ((c.KeyChar == 'N') || (c.KeyChar == 'n'))
{
break;
}
}
}
The above piece of code is taken directly from MSDN. At one point, if the user answers 'Y', the ts.Complete() method is called, which makes the Dispose() method commit the transaction (or rollback it if the user answers 'N').
How is the SqlConnection instance associated with the TransactionScope ? Is this magic happening under the hood?
-----
If atheism is a religion, then not collecting stamps is a hobby. -- Unknown
|
|
|
|
|
Hi,
you can spend a lot of time and money, and have great fun not collecting stamps;
Of course it is a hobby.
|
|
|
|
|
Then I am not collecting a lot of things. I a man busy with millions of hobbies. I don't where I can find time to ask questions about TransactionScope
-----
If atheism is a religion, then not collecting stamps is a hobby. -- Unknown
|
|
|
|
|
Hello,
What I understand from the docu, it is really defined by the code-block, and it is recommended to use an using-block!
Le Centriste wrote: Is this magic happening under the hood?
I would say yes, MS magic!
All the best,
Martin
|
|
|
|
|
There's no magic, the using statement creates a code block which ends in calling Dispose, you can use this with any object that impliments IDisposable.
Christian Graus - Microsoft MVP - C++
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|
I don't think that this was the question, or at least I understood it different!
All the best,
Martin
|
|
|
|
|
Hi Christian
I was asking how does the TransactionScope instance is associated with the SqlConnection instance.
-----
If atheism is a religion, then not collecting stamps is a hobby. -- Unknown
|
|
|
|
|
There's nothing magic about it at all. You are seeing the behaviour because of a "hidden" connection string entry - Enlist. If Enlist is true then the SqlConnection will automatically enlist in the enclosing scope. Obviously, this only applies to Sql Server (2005) connections as the Sql Server (2005) data provider automatically checks (based on the Enlist) whether or not there is an open transaction to work under.
|
|
|
|
|
Ok, thanks, that is the answer I was looking for. I remember now from the documentation that the Enlist parameter defaults to true in the connection string, for the SQL Server 2005 provider.
Have a nice day.
-----
If atheism is a religion, then not collecting stamps is a hobby. -- Unknown
|
|
|
|
|
Hi Le Centriste,
I think the magic here is that System.Transactions uses COM+/Enterprise Library under the hood to enlist the SQL commands in a distributed transaction, and SQL knows this through the enlist parameter in the connection string. When Complete() is called, the transaction is committed, and if Dispose is called without a Complete() call, the transaction is rolled back.
*edit* oops, I see Pete already answered your question
|
|
|
|
|
Hello everybody,
I had an mdi from having an toolStrip on the click event of toolstrip button i want to close all the opened child form but i am unable to do so.
Regards,
rahul saini
|
|
|
|
|
Have you tried calling Close() on all forms in your Mdi Form's MdiChildren ?
Standards are great! Everybody should have one!
|
|
|
|
|
hi,
I've tried the following code at http://www.msnewsgroups.net/group/microsoft.public.dotnet.languages.csharp/topic6944.aspx
i've made the changes they say, but it still doesn't work when i insert a usb device (flashdisk).
I'm trying do detect when a device is inserted into a usb port. how can i do it? and if possible, which port it was inserted at. it's for a WPF app
EDIT: ok, it's working now, but i have the same questions that the person with the code posted:
1)Check if the device is inserted or removed..How do i do that??
2)also i want to check Total storage (capacity)of the device connected
c) storage(unused)available in the device
thanks donovan
-- modified at 6:54 Thursday 12th July, 2007
rather have something you don't need, than need something you don't have
|
|
|
|
|
Maybe this can help you http://www.codeproject.com/cs/system/DriveDetector.asp ?
As for storage Use GetDrives() function to get all drives and identify the drive you are interested in. Then you can use DriveInfo functions to get necessary information
|
|
|
|
|
Hello,
I'm using System.Management functionality for that!
WqlEventQuery q_creation = new WqlEventQuery();
q_creation.EventClassName = "__InstanceCreationEvent";
q_creation.WithinInterval = new TimeSpan(0,0,2);
q_creation.Condition = @"TargetInstance ISA 'Win32_DiskDriveToDiskPartition'";
mwe_creation = new ManagementEventWatcher(q_creation);
mwe_creation.EventArrived += new EventArrivedEventHandler(USBEventArrived_Creation);
mwe_creation.Start();
internal void USBEventArrived_Creation(object sender, EventArrivedEventArgs e)
{
}
WqlEventQuery q_deletion = new WqlEventQuery();
q_deletion.EventClassName = "__InstanceDeletionEvent";
q_deletion.WithinInterval = new TimeSpan(0,0,2);
q_deletion.Condition = @"TargetInstance ISA 'Win32_DiskDriveToDiskPartition' ";
mwe_deletion = new ManagementEventWatcher(q_deletion);
mwe_deletion.EventArrived += new EventArrivedEventHandler(USBEventArrived_Deletion);
mwe_deletion.Start();
internal void USBEventArrived_Deletion(object sender, EventArrivedEventArgs e)
{
}
For checking the free and available space:
public void Hashtable GetFreeDriveSpace()
{
Hashtable drivefreespace = new Hashtable();
ManagementClass mcDriveClass = new ManagementClass("Win32_LogicalDisk");
ManagementObjectCollection mocDrives = mcDriveClass.GetInstances();
foreach(ManagementObject moDrive in mocDrives)
{
try
{
String sDeviceId = moDrive.Properties["DeviceId"].Value.ToString();
double dSize = double.Parse(moDrive.Properties["Size"].Value.ToString());
double dFree = double.Parse(moDrive.Properties["FreeSpace"].Value.ToString());
}
catch
{
}
}
mocDrives.Dispose();
mcDriveClass.Dispose();
}
Hope it helps!
All the best,
Martin
|
|
|
|
|
thanks to both of you, seems both solutions would be able to solve my problem!
thanks again
donovan
rather have something you don't need, than need something you don't have
|
|
|
|
|
Hi frinds,
My Question is simple. How to convert the CSV file to XLS file using the C# Programming langueage.
Thanks,
Liyakhat.
|
|
|
|