Object-based collections may be fine for reference types, but I'm looking for a high-performance collection to store only value types without the boxing/unboxing overhead. Is there anything available to me in the .Net BCL? Or anything on this site that might help me? (already did a search, but might've missed something)
Not in the BCL, not until .NET 2.0 when they will be introducing generics in .NET.
For now, you can implement something yourself. Almost all collection-like classes in .NET use an ArrayList because it can grow but it does take an Object which requires boxing value types. ArrayList uses arrays internally, and creates new arrays when necessary and copies elements to the new array. Do the same yourself, but using the value types that you need to collect. Methods like Array.CopyTo make copying elements to the new array easy, and of course creating a new array that's large enough isn't hard. For example, ArrayList.Capacity is the initial capacity (size of the array). When more elements need to be stored, Capacity is doubled and a new array of that size is created. Elements are copied and the old array is disposed (if necessary). You wouldn't have to double, though, it just what the BCL does. You could implement more predictive algorithms if you need to.
If you mean your entire application is not the active Window, then using a system hook is best.
If you mean that a dialog in your application has lot focus, but your application still has focus, then you should use an IMessageFilter and register it with Application.AddMessageFilter.
Using system hooks slows down the speed of the entire window manager because your program has to filter and process the necessary data. If you don't NEED to, don't do it.
Also, if you do use a system hook, make sure you unregister it before exiting your application, like in your main window's (i.e., the Form that was run with Application.Run) Close event handler, or better yet in the Dispose override, or before youe application's entry point (i.e., Main) exits.
Do not keep posting the same question - we do not like that here and if you didn't get answers the first 1000 times, you probably won't get one at all (but might find more spam in your inbox!)
What I gave you should work (the link that Mazdak sent you). If it doesn't, you need to reply to that thread and - as I stated in the message - research the problem instead of just guessing and asking other people!
Sorry. But I have research enough, and it is not in the .net help, it is, but it doesnt work. Your example and Mazdak'a didnt work also. Maybe you should try what you post. When I help someone in a problem, I tried to help them completly not half way. Thanks.
The examples in the MSDN documentation don't work? I hardly doubt that, because they have been tested and have been in public sight for several years now. I'm sure someone wouldn't noticed and alerted Microsoft, especially since they have such an easy documentation bug link at the bottom!
And as I have sound countless times - post WHY enumerating the PaperSizes didn't work! What exceptions where thrown, if any? It is possible that the printer does not support that paper size! It is, after all, a rather large piece of paper - if the printer tray doesn't support it, it will use the default!
So, write a simple application that enumerates and displays the valid PaperSizes that it supports and see, or debug your code and check the state of objects after lines that don't seem to have an effect.
If you keep asking the same question, you'll get the same answer - so provide us with more details and what exceptions - if any - are being thrown, or example snippets of code showing that you are trying what we have written and where the exception is being thrown. I assure you that enumerating PrinterSettings.PaperSizes works! Tell us why it's not working for you!
This is the example I am trying. I am using an Epson LX-300 printer. The enumeration worked, i forgot to tell you that. But my initial question was that I need to create a custom form, and print using that paper size. In this example, I created manually, in Server Properties, in the printer & faxes form, and created the "MIPAPEL" form. When selecting the papersize I use the last element in the enumeration, and it printed the size I wanted, but I created it manually. If I use the new PaperSize("CUSTOM", 8.5*100, 5.5*100) it doesnt work. It seems as it is ignoring my custom size. Also, when doing this, there are no exceptions.
Just create a C# project and copy this.
-Code Start Here-
/// Summary description for Form1.
public class Form1 : System.Windows.Forms.Form
private System.Windows.Forms.Button button1;
/// Required designer variable.
private System.ComponentModel.Container components = null;
// Required for Windows Form Designer support
// TODO: Add any constructor code after InitializeComponent call
/// Clean up any resources being used.
protected override void Dispose( bool disposing )
if( disposing )
if (components != null)
base.Dispose( disposing );
#region Windows Form Designer generated code
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
private void InitializeComponent()
this.button1 = new System.Windows.Forms.Button();
this.button1.Location = new System.Drawing.Point(112, 176);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(296, 213);
this.Name = "Form1";
this.Text = "Form1";
/// The main entry point for the application.
static void Main()
private void button1_Click(object sender, System.EventArgs e)
PrintDocument pd = new PrintDocument();
string s = "";
// enumerating the valid papers
foreach( PaperSize ps in pd.PrinterSettings.PaperSizes )
s += ps.PaperName + "\n";
// show the paper sizes defined for the printer
// this is a custom paper size defined manually
// using the dialogs provided on Windows XP
pd.DefaultPageSettings.PaperSize = pd.PrinterSettings.PaperSizes[pd.PrinterSettings.PaperSizes.Count - 1];
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
pd.QueryPageSettings += new QueryPageSettingsEventHandler(pd_QueryPageSettings);
If you created a form called "MIPAPEL" (which I guess is supposed to be "MYPAPER"), why did you pass "CUSTOM" for the name of the form in the PaperSize constructor? Try passing "MYPAPER"/"MYPAPEL" and see if that works.
I try that before sending the example and it doesnt work, The PaperSize only have one constructor, ant it ask for the name of the papaer, and the width, and height. I put the same thing and it ignores it. One of my problems is solved, because with the enumertion I could manually create the form and use it in my code. But what I need is to be able to create a new paper size, and use it. In the code I sent you, there was a mistake, the line that calls the querypagemethod take it out.
It does work. You could be right about the server forms configured on the system, but the PageSetupDialog doesn't seem to mind. If you solved the problem of printing an A3 form by enumerating the PaperSizes like I said a while back, great. If you're trying to print something else customized, it's possible the printer (or maybe even the print server) might not support it.
There were some examples of setting custom paper sizes in the google link I gave you. If they don't work for you, either you have a botched .NET installation (which I doubt, because many other things would be wrong), or your printer has problems or limitations. I have a Lexmark myself and I am not particular crazy about it (what can I say, it was free).
Thanks, I found what I was looking. But if you have read it, you have noticed that what I was asking cannot be done with C#, not completly. There is an example on how to add the form using c++ code, and then with that form, use it in c# to print the custom size. So I assume the custom size option using the papersize constructor only works on Windows 98 or before.
I wanna know how can i send mail thru my pc without using any email client.
i tried using SMTPMail object. in that i specified the SmtpServer as "localhost". On doing so all my mails are delivered into "c:\Inetpub\mailroot\Queue\" directory.
Now i want to know how d i send these mails to email@example.com or at hotmail address.
Please someone help me.
Last Visit: 31-Dec-99 19:00 Last Update: 29-Jan-23 14:59