Welcome to AspAdvice Sign in | Join | Help

Useful memo: Windows messages

Grabbed from this url (may only contain most useful definitions): http://www.groupsrv.com/dotnet/about52848.html


WM_NULL = 0x0000,
WM_CREATE = 0x0001,
WM_DESTROY = 0x0002,
WM_MOVE = 0x0003,
WM_SIZE = 0x0005,
WM_ACTIVATE = 0x0006,
WM_SETFOCUS = 0x0007,
WM_KILLFOCUS = 0x0008,
WM_ENABLE = 0x000A,
WM_SETREDRAW = 0x000B,
WM_SETTEXT = 0x000C,
WM_GETTEXT = 0x000D,
WM_GETTEXTLENGTH = 0x000E,
WM_PAINT = 0x000F,
WM_CLOSE = 0x0010,
WM_QUERYENDSESSION = 0x0011,
WM_QUIT = 0x0012,
WM_QUERYOPEN = 0x0013,
WM_ERASEBKGND = 0x0014,
WM_SYSCOLORCHANGE = 0x0015,
WM_ENDSESSION = 0x0016,
WM_SHOWWINDOW = 0x0018,
WM_CTLCOLOR = 0x0019,
WM_WININICHANGE = 0x001A,
WM_SETTINGCHANGE = 0x001A,
WM_DEVMODECHANGE = 0x001B,
WM_ACTIVATEAPP = 0x001C,
WM_FONTCHANGE = 0x001D,
WM_TIMECHANGE = 0x001E,
WM_CANCELMODE = 0x001F,
WM_SETCURSOR = 0x0020,
WM_MOUSEACTIVATE = 0x0021,
WM_CHILDACTIVATE = 0x0022,
WM_QUEUESYNC = 0x0023,
WM_GETMINMAXINFO = 0x0024,
WM_PAINTICON = 0x0026,
WM_ICONERASEBKGND = 0x0027,
WM_NEXTDLGCTL = 0x0028,
WM_SPOOLERSTATUS = 0x002A,
WM_DRAWITEM = 0x002B,
WM_MEASUREITEM = 0x002C,
WM_DELETEITEM = 0x002D,
WM_VKEYTOITEM = 0x002E,
WM_CHARTOITEM = 0x002F,
WM_SETFONT = 0x0030,
WM_GETFONT = 0x0031,
WM_SETHOTKEY = 0x0032,
WM_GETHOTKEY = 0x0033,
WM_QUERYDRAGICON = 0x0037,
WM_COMPAREITEM = 0x0039,
WM_GETOBJECT = 0x003D,
WM_COMPACTING = 0x0041,
WM_COMMNOTIFY = 0x0044 ,
WM_WINDOWPOSCHANGING = 0x0046,
WM_WINDOWPOSCHANGED = 0x0047,
WM_POWER = 0x0048,
WM_COPYDATA = 0x004A,
WM_CANCELJOURNAL = 0x004B,
WM_NOTIFY = 0x004E,
WM_INPUTLANGCHANGEREQUEST = 0x0050,
WM_INPUTLANGCHANGE = 0x0051,
WM_TCARD = 0x0052,
WM_HELP = 0x0053,
WM_USERCHANGED = 0x0054,
WM_NOTIFYFORMAT = 0x0055,
WM_CONTEXTMENU = 0x007B,
WM_STYLECHANGING = 0x007C,
WM_STYLECHANGED = 0x007D,
WM_DISPLAYCHANGE = 0x007E,
WM_GETICON = 0x007F,
WM_SETICON = 0x0080,
WM_NCCREATE = 0x0081,
WM_NCDESTROY = 0x0082,
WM_NCCALCSIZE = 0x0083,
WM_NCHITTEST = 0x0084,
WM_NCPAINT = 0x0085,
WM_NCACTIVATE = 0x0086,
WM_GETDLGCODE = 0x0087,
WM_SYNCPAINT = 0x0088,
WM_NCMOUSEMOVE = 0x00A0,
WM_NCLBUTTONDOWN = 0x00A1,
WM_NCLBUTTONUP = 0x00A2,
WM_NCLBUTTONDBLCLK = 0x00A3,
WM_NCRBUTTONDOWN = 0x00A4,
WM_NCRBUTTONUP = 0x00A5,
WM_NCRBUTTONDBLCLK = 0x00A6,
WM_NCMBUTTONDOWN = 0x00A7,
WM_NCMBUTTONUP = 0x00A8,
WM_NCMBUTTONDBLCLK = 0x00A9,
WM_KEYDOWN = 0x0100,
WM_KEYUP = 0x0101,
WM_CHAR = 0x0102,
WM_DEADCHAR = 0x0103,
WM_SYSKEYDOWN = 0x0104,
WM_SYSKEYUP = 0x0105,
WM_SYSCHAR = 0x0106,
WM_SYSDEADCHAR = 0x0107,
WM_KEYLAST = 0x0108,
WM_IME_STARTCOMPOSITION = 0x010D,
WM_IME_ENDCOMPOSITION = 0x010E,
WM_IME_COMPOSITION = 0x010F,
WM_IME_KEYLAST = 0x010F,
WM_INITDIALOG = 0x0110,
WM_COMMAND = 0x0111,
WM_SYSCOMMAND = 0x0112,
WM_TIMER = 0x0113,
WM_HSCROLL = 0x0114,
WM_VSCROLL = 0x0115,
WM_INITMENU = 0x0116,
WM_INITMENUPOPUP = 0x0117,
WM_MENUSELECT = 0x011F,
WM_MENUCHAR = 0x0120,
WM_ENTERIDLE = 0x0121,
WM_MENURBUTTONUP = 0x0122,
WM_MENUDRAG = 0x0123,
WM_MENUGETOBJECT = 0x0124,
WM_UNINITMENUPOPUP = 0x0125,
WM_MENUCOMMAND = 0x0126,
WM_CTLCOLORMSGBOX = 0x0132,
WM_CTLCOLOREDIT = 0x0133,
WM_CTLCOLORLISTBOX = 0x0134,
WM_CTLCOLORBTN = 0x0135,
WM_CTLCOLORDLG = 0x0136,
WM_CTLCOLORSCROLLBAR = 0x0137,
WM_CTLCOLORSTATIC = 0x0138,
WM_MOUSEMOVE = 0x0200,
WM_LBUTTONDOWN = 0x0201,
WM_LBUTTONUP = 0x0202,
WM_LBUTTONDBLCLK = 0x0203,
WM_RBUTTONDOWN = 0x0204,
WM_RBUTTONUP = 0x0205,
WM_RBUTTONDBLCLK = 0x0206,
WM_MBUTTONDOWN = 0x0207,
WM_MBUTTONUP = 0x0208,
WM_MBUTTONDBLCLK = 0x0209,
WM_MOUSEWHEEL = 0x020A,
WM_PARENTNOTIFY = 0x0210,
WM_ENTERMENULOOP = 0x0211,
WM_EXITMENULOOP = 0x0212,
WM_NEXTMENU = 0x0213,
WM_SIZING = 0x0214,
WM_CAPTURECHANGED = 0x0215,
WM_MOVING = 0x0216,
WM_DEVICECHANGE = 0x0219,
WM_MDICREATE = 0x0220,
WM_MDIDESTROY = 0x0221,
WM_MDIACTIVATE = 0x0222,
WM_MDIRESTORE = 0x0223,
WM_MDINEXT = 0x0224,
WM_MDIMAXIMIZE = 0x0225,
WM_MDITILE = 0x0226,
WM_MDICASCADE = 0x0227,
WM_MDIICONARRANGE = 0x0228,
WM_MDIGETACTIVE = 0x0229,
WM_MDISETMENU = 0x0230,
WM_ENTERSIZEMOVE = 0x0231,
WM_EXITSIZEMOVE = 0x0232,
WM_DROPFILES = 0x0233,
WM_MDIREFRESHMENU = 0x0234,
WM_IME_SETCONTEXT = 0x0281,
WM_IME_NOTIFY = 0x0282,
WM_IME_CONTROL = 0x0283,
WM_IME_COMPOSITIONFULL = 0x0284,
WM_IME_SELECT = 0x0285,
WM_IME_CHAR = 0x0286,
WM_IME_REQUEST = 0x0288,
WM_IME_KEYDOWN = 0x0290,
WM_IME_KEYUP = 0x0291,
WM_MOUSEHOVER = 0x02A1,
WM_MOUSELEAVE = 0x02A3,
WM_CUT = 0x0300,
WM_COPY = 0x0301,
WM_PASTE = 0x0302,
WM_CLEAR = 0x0303,
WM_UNDO = 0x0304,
WM_RENDERFORMAT = 0x0305,
WM_RENDERALLFORMATS = 0x0306,
WM_DESTROYCLIPBOARD = 0x0307,
WM_DRAWCLIPBOARD = 0x0308,
WM_PAINTCLIPBOARD = 0x0309,
WM_VSCROLLCLIPBOARD = 0x030A,
WM_SIZECLIPBOARD = 0x030B,
WM_ASKCBFORMATNAME = 0x030C,
WM_CHANGECBCHAIN = 0x030D,
WM_HSCROLLCLIPBOARD = 0x030E,
WM_QUERYNEWPALETTE = 0x030F,
WM_PALETTEISCHANGING = 0x0310,
WM_PALETTECHANGED = 0x0311,
WM_HOTKEY = 0x0312,
WM_PRINT = 0x0317,
WM_PRINTCLIENT = 0x0318,
WM_HANDHELDFIRST = 0x0358,
WM_HANDHELDLAST = 0x035F,
WM_AFXFIRST = 0x0360,
WM_AFXLAST = 0x037F,
WM_PENWINFIRST = 0x0380,
WM_PENWINLAST = 0x038F,
WM_APP = 0x8000,
WM_USER = 0x0400,
WM_REFLECT = WM_USER + 0x1c00 

Posted by odalet | 0 Comments

Impossible de lancer le debugger de Visual Studio 2005

Le message d'erreur qui apparaît lorsque l'on lance un programme depuis Visual Studio 2005 (ou depuis une version Express) est, en français : Handle de liaison invalide ; ce message correspond, en anglais à The binding handle is invalid.

Ce problème apparaît lorsque le service Terminal Server est désactivé. Il suffit donc de relancer ce service pour que tout rentre dans l'ordre.

Pour plus de détails, voir les posts suivants (en anglais) :

Troubleshooting the "The Binding Handle Is Invalid" error in Visual Studio 2005

Explaining 'The Binding Handle Is Invalid'

“The Binding Handle Is Invalid” error in Visual Studio 2005

Posted by odalet | 0 Comments
Filed under:

Saving the state of a Graphics object

Today I discovered a new class : GraphicsContainer; it allows you to save the state of aGraphics object (transformation, clipping region, and rendering properties) and to restore it later.

This class is used in conjunction with 2 pairs of methods belonging to the Graphics class:

BeginContainer saves the state of the graphics object (and returns a GraphicsContainer object), EndContainer restores the state (when provided with a GraphicsContainer object). MSDN provides a sample here: http://msdn2.microsoft.com/en-us/library/azdschfw.aspx.

There exists overloads of BeginContainer that accept two rectangles and unit allowing the Graphics object to be applied a new transformation after its state is saved.

In the same maneer, but in a simpler way, the Graphics.Save and Graphics.Restore methods do the same job (Honestly, I don't understand why these two pairs of methods coexist...)

This led me to write a little helper class allowing to save/restore a Graphics with the using syntax.

Here is how to use this class (it is just a rewritten version of the MSDN sample):

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
    Graphics g = e.Graphics;

    // Define transformation for container.
    RectangleF src = new RectangleF(0f, 0f, 200f, 200f);
    RectangleF dest = new RectangleF(100f, 100f, 150f, 150f);

    using (PaintHelper.SaveGraphics(g, dest, src, GraphicsUnit.Pixel))
    {
        // Fill red rectangle in container.
        g.FillRectangle(Brushes.Red, 0.0F, 0.0F, 200.0F, 200.0F);
    }

    // Fill untransformed rectangle with green.
    g.FillRectangle(Brushes.Green, 0.0F, 0.0F, 200.0F, 200.0F);
}

And the source code for the PaintHelper class:   

using System;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace Delta.Internals
{
    public static class PaintHelper
    {
        private class GraphicsBackup : IDisposable
        {
            private Graphics graphics = null;
            private GraphicsContainer container = null;

            public GraphicsBackup(Graphics g)
            {
                Init(g);
                container = g.BeginContainer();
            }

            public GraphicsBackup(Graphics g, Rectangle dest, Rectangle src, GraphicsUnit unit)
            {
                container = g.BeginContainer(dest, src, unit);
            }

            public GraphicsBackup(Graphics g, RectangleF dest, RectangleF src, GraphicsUnit unit)
            {
                container = g.BeginContainer(dest, src, unit);
            }

            private void Init(Graphics g)
            {
                if (g == null) throw new ArgumentNullException("g");
                graphics = g;
            }

            public void Dispose()
            {
                graphics.EndContainer(container);
            }
        }

        public static IDisposable SaveGraphics(Graphics g)
        {
            return new GraphicsBackup(g);
        }

        public static IDisposable SaveGraphics(Graphics g,
            Rectangle dest, Rectangle src, GraphicsUnit unit)
        {
            return new GraphicsBackup(g, dest, src, unit);
        }

        public static IDisposable SaveGraphics(Graphics g,
            RectangleF dest, RectangleF src, GraphicsUnit unit)
        {
            return new GraphicsBackup(g, dest, src, unit);
        }
    }
}

Hope this helps. 

Posted by odalet | 0 Comments

Thread safe singleton pattern with C#: easy!

Read here: http://www.dofactory.com/Patterns/PatternSingleton.aspx

Here is the classical maneer a thread-safe singleton is written in C#:

class MySingleton
{    
    private static MySingleton instance;    
    // Lock synchronization object    
    private static object syncLock = new object();    
    
    private MySingleton() { DoSomething(); }    
    
    public static MySingleton Instance    
    {        
        get        
        {            
            // Support multithreaded applications            
            // through 'Double checked locking'            
            // pattern which (once the instance            
            // exists) avoids locking each            
            // time the method is invoked            
            if (instance == null)            
            {                
                lock (syncLock)                
                {                    
                    if (instance == null)                        
                        instance = new MySingleton();                
                }            
            }            
            return instance;        
        }    
    }
}

And now, the ".NET" way:

class MySingleton
{   
    // Static members are lazily initialized.   
    // .NET guarantees thread safety for   
    // static initialization   
    private static readonly MySingleton instance =                       
        new MySingleton();  

    // Constructor (private)   
    private MySingleton() { DoSomething(); }   
   
    public static Instance { get { return instance; } }
}

This works because "private static readonly" involves:

  • lazy initialization
  • thread safety guaranteed by .NET for static initializations.
Ain't it beautiful?

Posted by odalet | 1 Comments

How to access real GAC files

Read here: (Using Explorer to get to physical files in the GAC http://weblogs.asp.net/jkey/archive/2003/02/25/3006.aspx),

an easy but really efficient trick to browse real files in the GAC:

  • open a DOS prompt and type subst G: %windir%\assembly
  • If explorer is opened, close it and re-open it. Browse to G:, and voilà, you can now see the physical structure of the GAC!
Be careful, you'd better be sure of you before playing with the internals of the GAC...
Posted by odalet | 0 Comments
Filed under:

Repairing Visual Studio .NET 2005

If you had installed Visual Studio .NET 2005 Beta1, you may run into problems using the final release (or the Beta2). More specifically, the IDE may refuse to load the “Common IDE Package” at startup, or it may be unable to show up the Windows Forms designer for instance. Some messages you may encounter may resemble this one:

Package Load Failure
Package 'Visual Studio Common IDE Package' has failed to load or properly ( GUID = {6E87CFAD-6C05-4ADF-9CD7-3B7943875B7C} ). Please contact package vendor for assistance. Application restart is recommended, due to possible environment corruption. Would you like to disable loading this package in the future? You may use 'devenv.exe /resetskippkgs' to re-enable package loading

For this category of problems, there exists the Visual Studio troubleshooting tool (gracefully provided by Aaron Stebner) which can be used to clean all the old stuff that was left on your hard drive by Beta1 release of Visual Studio and thus fully enables Visual Studio .NET 2005.
NB : this tool should also work if you encounter problems with an Express edition of Visual Studio
The tool is available for download here: http://astebner.sts.winisp.net/Tools/ttool.zip

And the article accompanying it: http://blogs.msdn.com/astebner/archive/2005/11/09/491118.aspx

Posted by odalet | 2 Comments
Filed under: