Click here to Skip to main content
15,880,608 members
Articles / Desktop Programming / Windows Forms
Tip/Trick

How to Embed Multiple Icons and Color/Animated Cursors in .NET Executable or DLL Library as Native Win32 Resources using VS2010

Rate me:
Please Sign up or sign in to vote.
4.80/5 (5 votes)
4 Apr 2012CPOL2 min read 30.2K   285   10   2
A detailed tutorial on how to embed multiple icons and color/animated cursors in VS2010 VB project assembly as native win32 resources.

Introduction

This is useful if you need your EXE or DLL to provide multiple icons for documents associated with your application. It also provides a way to load color and animated cursors for your forms and/or controls with LoadCursor API. Note: even .NET 4.0 does not support this natively, it can only load black and while cursors.

The Process

Method 1 (simple, but requires repeating following steps after every build):

  1. Open your EXE or DLL in Visual Studio (either from File->Open File or solution explorer).
  2. Add icons and/or cursors to the EXE or DLL.
  3. Save file.

Method 2 (more involved, but done only once):

Note: once this is set up Visual Studio will stop updating assembly information in the output file (file version, description, and more) taken from AssemblyInfo.vb.

  1. Enter assembly information first (ex. Project Properties->Application->Assembly Information).
  2. Build the project.
  3. Open produced EXE or DLL in Visual Studio (either from File->Open File or solution explorer). This opens native resource editor.
  4. Go to File->Save As. Pick 32-bit resource file in Save As type and save file as assemblyWin32.res. Again, resource file (not exe or dll).
  5. Include assemblyWin32.res in your project, and set to compile it as content in Build Action.
  6. Add icons and/or cursors to the assemblyWin32.res file.
  7. Open your project file in notepad (*.vbProj) and add the following block:
    <PropertyGroup>
        <Win32Resource>assemblyWin32.res</Win32Resource>
    </PropertyGroup>
  8. You can put it after condition block. Here
    is the example:

    <PropertyGroup
    Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
       ...
       ...
    </PropertyGroup>

    Note: IDE will detect changes and ask you to reload your project file. Just press reload.

  9. Build the project.
  10. If you need to change assembly information open resource file and update version information manually. Alternatively, you can remove section added to the project file in step 7 and repeat from step 1.

How to Load Embedded Color Cursor

VB
'Usage
Dim HighlightPointer As Cursor =   ColorCursor.LoadCursor(101)

''' <summary>
'''   Provides ability to load color and/or animated cursor for the form or control.
'''   Note: cursor must be embedded as native win32 resource in the assembly.
''' </summary>
Private Class ColorCursor


   Private Declare Function LoadCursorAPI Lib "user32.dll" Alias "LoadCursorA" (
       ByVal hInstance As IntPtr, ByVal lpCursorName As String) As IntPtr


   Public Shared Function LoadCursor(ByVal embeddedWin32ResourceID As Integer) As Cursor
      Dim cursor As Cursor = TryLoadCursor(embeddedWin32ResourceID)
      If cursor Is Nothing Then
         Throw New System.ComponentModel.Win32Exception(Err.LastDllError)
      Else
         Return cursor
      End If
   End Function


   Public Shared Function TryLoadCursor(ByVal embeddedWin32ResourceID As Integer) As Cursor
      Dim hInstance As IntPtr = System.Runtime.InteropServices.Marshal.GetHINSTANCE(
          System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0))
      Dim cPtr As IntPtr = LoadCursorAPI(hInstance, "#" & embeddedWin32ResourceID)
      If cPtr = IntPtr.Zero Then
         Return Nothing
      Else
         Return New Cursor(cPtr)
      End If
   End Function


End Class

Similar Articles

Embedding Multiple Icons into .NET Executables By Ed.Poore Note: Ed’s article is based on C# and VS2005. The template to create *.res file is no longer available in VS2010.

History

02/22/2011, Initial Rev.

04/04/2012, Updated title and method 2 to handle assembly information.  

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionDon't Download has Trojan.MSIL Inside Pin
Toni_s7-Apr-14 22:52
Toni_s7-Apr-14 22:52 
GeneralAwesome! Pin
ChewsHumans22-Mar-12 13:50
ChewsHumans22-Mar-12 13:50 
Lots of other articles say this is impossible; or require that I manually build my project every time using a .bat file or similar.

Thanks for this tip! It'll come in very handy, especially as I can "set it and forget it".

Five stars.

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.