|
Hi,
I'm trying to find a way of associating a form with a window.
ie. when a user opens a particular window or document, an associated
form will popup displaying detail in regard to this document/window.
At the moment, I'm looking at the processes running on a machine to
determine the currently opened apps/windows and running through a
collection of objects to determine if any of these objects are related
to the app or window (from file name)
ie.
I check the processes periodically using a timer
foreach (Process process in Process.GetProcesses()) {
if (onlyApplications) {
if (process.MainWindowHandle != IntPtr.Zero)
get the associated file
feed this into a collection
blah blah blah
if the list changes through a timer tick, refresh the collection.
It seems that this is only way I can determine and keep a relatively accurate list of the currently running processes.
My question is basically, is there an event that fires when a new process
starts up or the content of the currently running processes change.
or
Is there a better way of doing this?
Thanks very much
|
|
|
|
|
No. You pretty much hit the nail on the head...
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
When serializing a class, i'm getting the following invalid xml header
<?xml version=\"1.0\" encoding=\"utf-8\"?>
the contents is formated perfectly, however the header and namespaces become cluttered with back-slashes preceeding all double-quotes.
Where are these backslahes coming from and how can i get rid of them???
The code i used for the serialization is as follows;
private string SerialiseXml( DocumentSearchResponse docSearchResponse )
{
// Declare the XML Serializer.
XmlSerializer oSerializer = new XmlSerializer( typeof( DocumentSearchResponse ) );
MemoryStream ms = new MemoryStream();
XmlTextWriter tw = new XmlTextWriter( ms, new System.Text.UTF8Encoding() );
// Serialize the proxy class into the writer.
oSerializer.Serialize(tw, docSearchResponse);
string s = System.Text.Encoding.UTF8.GetString( ms.GetBuffer() );
// Close the writer.
tw.Close();
ms.Close();
return s;
}
|
|
|
|
|
Is this in the file itself or when you read the string into the s variable and examine it in the debugger? The debugger will escape quotes when using the Autos, Locals, and This debugger windows.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
At the point that the class object is serialized into say a TextWriter, if you examine the string then it is littered with escape chars. Which obviously gets carried through when i set a string to the output of the textwriter. What i was trying to do was create a web method which returns a string, which is the xml document.
I've actually solved the problem now, firstly by using a memory stream (so i can set the encoding) i got rid of the /r/n escape characters within the document body. Secondly by setting the quotechar to a single quote i got rid of the escape chars preceeding each ocurance of a quote (as they became single quotes) in the xml header and namespace declaration.
Am i missing something pretty fundemental here or is the practice of returning an xml document as a string not the done thing!! Serializing directly to a file (as in every example on the web) works fine, but in my particular requirement this is pretty useless.
You say the debugger escapes quotes in the Autos, Locals, this windows. does this apply to outputing the string to the immediate window too, as the escape chars where still there.
|
|
|
|
|
Yes, it does apply to the output window as well. A simple test would be to use a StringWriter as the param to an XmlTextWriter , then you already have your string. Output it to a text file and you won't see those escapes. It's just the debugger doing it to you.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi,
In an inherited class is it possible to stop the base class constructor from being called?
Thanks
|
|
|
|
|
No. But u can play some tricks and call different base class constructors. That mite work for your case.
top secret xacc-ide 0.0.1
|
|
|
|
|
IIRC, the base constructor must be called in order to initialise things like private member variables that cannot be initialised from a derived class because it will be invisible to the derived class. Probably your best solution would be to create a protected constructor in the base that does nothing and have your derived class call it instead of the default constructor.
"You can have everything in life you want if you will just help enough other people get what they want." --Zig Ziglar
The Second EuroCPian Event will be in Brussels on the 4th of September
Can't manage to P/Invoke that Win32 API in .NET? Why not do interop the wiki way!
My Blog
|
|
|
|
|
Don't define a default constructor in your inheritted class. Also make the default constructor private in the base class.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Tried that with the base classes constructor being private but then I can't inherit from it ( compile error ).
eg.
public class inheritance
{
public String strName;
private inheritance()
{
showMessage();
}
public virtual void showMessage()
{
MessageBox.Show("Base Class");
}
}
public class inheritance2: inheritance
{
public String strTest;
public override void showMessage()
{
MessageBox.Show("inheritance2");
}
}
|
|
|
|
|
You can inherit, but only if you don't have a default constructor in your derivative class. If the base class's default ctor isn't private, it will be called. See my reply to Alvaro below for an example.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Heath Stewart wrote:
Also make the default constructor private in the base class.
No, the default constructor would always be called, regardless.
Heath Stewart wrote:
Also make the default constructor private in the base class.
If it's private in the base class, the derived class will not be able to call it automatically and the compiler will complain.
The only solution is to add a protected constructor to the base class (assuming you can) and have the derived constructor call that explicitly.
Regards,
Alvaro
Give a man a fish, he owes you one fish. Teach a man to fish, you give up your monopoly on fisheries.
|
|
|
|
|
Really? Try compiling this and examining the IL with ildasm.exe or something:
using System;
public abstract class Test
{
private Test()
{
}
protected Test(string name)
{
}
}
public class Test2 : Test
{
protected Test2(string name) : base(name)
{
}
} You're right - the default ctor of the base class won't be called, but if it isn't private it will be called. There was no requirement in the original post for the default ctor of the base class to be called.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
|
Thanks.
I don't mind if people don't always agree with me, but when I'm right, I'm right - and in this case I'm right. See my reply to Alvaro.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Problem:
protected Attribute classes cannot be read if applied to fields in another assembly. It may happen on other attribute targets (i havent tested).
Example:
Assembly A
{
public class Foo
{
[AttributeUsage(AttributeTarget.Field)]
protected class BarAttribute : Attribute{}
}
}
Assembly B : ref A
{
class Foo2 : Foo
{
[Bar]
string bar;
}
}
Now if the FieldInfo.GetCustomAttributes(true) is called, it returns no attrbute instance(s), where modifying the attribute accessor to be public, does return the attribute instance(s).
Can anyone verify this, or suggest a work around (besides going public)?
top secret xacc-ide 0.0.1
|
|
|
|
|
Have you tried this with other MemberInfo derivatives?
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Nope, the fieldinfo stuff i what im using. In the mean while i'll see if i can somehow "sneek" in an test case.
top secret xacc-ide 0.0.1
|
|
|
|
|
leppie wrote:
test case
That was the idea. It definitely looks like a problem and I don't have the time to play around with other options. Just wondering if you tried diagnosing the potential but with other cases.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi!
I'm trying to keep track of forms I spawn in my code. I am using the usual instantiation to create the form (Form oForm = new Form()), however I have multiple instances of that form running, and I need to be able to check the name of each one (Maybe using the Tag property).
I've thought about a foreach loop, but I don't know exactly how to implement it.
Thanks!
|
|
|
|
|
You need to keep track of these Form s in a collection so that you can enumerate them. Using a foreach loop is easy - just be sure you don't change the underlying collection.
So, if you had a static collection property on a class (perhaps your Form , if you're dealing with multiple instances of a single Form class, for example), you can add your instances to it and enumerate it at any time:
public class MyForm : Form
{
private static ArrayList instances = new ArrayList();
public MyForm()
{
instances.Add(this);
}
protected override void Dispose(bool disposing)
{
instances.Remove(this);
base.Dispose(disposing);
}
public static IList Instances
{
get { return instances; }
}
} At any time, just use the following code to enumerate your forms and, for example, output the caption:
foreach (MyForm form in MyForm.Instances)
Console.WriteLine(form.Text); If you want to do this for multiple types, then define a class with a public or internal static collection property, perhaps adding a few handy methods. Don't forget to override Dispose(bool) and remove your form instance, and to add it in your constructor for that matter. If you overload your constructor, make sure that only one instances gets added.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thanks for the reply! I think your way sounds good, I'll try it right away.
Thanks
|
|
|
|
|
I am building an N'tier application and i want to save some constants to one of the tiers wich is a dll file.
can i use a specific configuration file for it? I want it to be in the same directory with the dll and not with exe file of the application, when i am trying it i can't reach it, i mean i cant read from it.
if i have to build an excutable loader for this dll how can i do it, how to build this excutable loader???
Thanks in advanced
Dudi
Be Good...
Dudi
|
|
|
|
|
Building an executable loader won't help. The .config file is configured when the AppDomain is created and all assemblies loaded into that AppDomain use the AppDomain.SetupInformation.ConfigurationFile.
If you need to use a different file, then simply read-in a file without using the ConfigurationSettings class.
If you want the location of the DLL, use Assembly.Location (or other properties based on your deployment scenario), where the Assembly is your DLL. The easiest way to get this is to reference a Type and get the Type.Assembly property. So, if in your DLL you did something like the following, that would get you the filename; append ".config" (for example - could be anything) and you can manually parse that yourself (depending on the content of the file, you could use the XML classes, XML Serialization, etc.):
string path = this.GetType().Assembly.Location;
path += ".config";
Microsoft MVP, Visual C#
My Articles
|
|
|
|