registerwindowmessage (user32)
Last changed: -67.166.68.151

.
Summary

C# Signature:

/// <summary>
///     Defines a new window message that is guaranteed to be unique throughout the system. The message value can be used
///     when sending or posting messages.
///     <para>
///     Go to https://msdn.microsoft.com/en-us/library/windows/desktop/ms644947%28v=vs.85%29.aspx for more
///     information.
///     </para>
/// </summary>
/// <param name="msg">C++ ( lpString [in]. Type: LPCTSTR )<br /> The message to be registered.</param>
/// <returns>
///     C++ ( Type: UINT )<br /> If the message is successfully registered, the return value is a message identifier in the
///     range 0xC000 through 0xFFFF. If the function fails, the return value is zero.<br /><br /> To get extended error
///     information, call GetLastError.
/// </returns>
/// <remarks>
///     The <see cref="RegisterWindowMessage" /> function is typically used to register messages for communicating between
///     two cooperating applications. If two different applications register the same message string, the applications
///     return the same message value.The message remains registered until the session ends. Only use
///     <see cref="RegisterWindowMessage" /> when more than one application must process the same message.For sending
///     private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF.
///     <br />(Messages in this range are private to a window class, not to an application.For example, predefined control
///     classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use values in this range.)
/// </remarks>
/// <example>
///     <code><![CDATA[
///  //provide a private internal message id
///  private UInt32 queryCancelAutoPlay = 0;
///  
///  [DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
/// static extern uint RegisterWindowMessage(string lpString);
///  
///  /* only needed if your application is using a dialog box and needs to respond to a "QueryCancelAutoPlay" message, it cannot simply return TRUE or FALSE.
///      [DllImport("user32.dll")]
///      static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
/// */
///
/// protected override void WndProc(ref Message m)
/// {
///      //calling the base first is important, otherwise the values you set later will be lost
///      base.WndProc(ref m);
///      
///      //if the QueryCancelAutoPlay message id has not been registered...
///      if (queryCancelAutoPlay == 0)
///      queryCancelAutoPlay = RegisterWindowMessage("QueryCancelAutoPlay");
///      
///      //if the window message id equals the QueryCancelAutoPlay message id
///      if ((UInt32)m.Msg == queryCancelAutoPlay)
///      {
///      /* only needed if your application is using a dialog box and needs to
///      * respond to a "QueryCancelAutoPlay" message, it cannot simply return TRUE or FALSE.
///      SetWindowLong(this.Handle, 0, 1);
///      */
///      m.Result = (IntPtr)1;
///      }
/// }
///  ]]></code>
/// </example>
[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern uint RegisterWindowMessage(string lpString);

VB.NET Signature:

<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function RegisterWindowMessage( _
     ByVal lpString As String) As UInteger
End Function

Oxygene.NET Signature:

[DllImport("user32.dll", SetLastError := true, CharSet := CharSet.Auto)]
class method RegisterWindowMessage(lpString: String): UInt32; external;

VB Signature:

Declare Function RegisterWindowMessage Lib "user32.dll" (ByVal lpString As String) As Integer

User-Defined Types:

None.

Notes:

Unicode notification

    DllImport("user32.dll", EntryPoint = "RegisterWindowMessageW", SetLastError = true)]
    private static extern int RegisterWindowMessage(string lpString);

If you use the above notation, it will not be the Unicode call, Always add the CharSet=CharSet.Auto or CharSet.Unicode

In VB6 the definition for the API declaration should be:

Declare Function RegisterWindowMessage Lib "user32.dll" Alias "RegisterWindowMessageW" (ByVal lpString As long) As Integer

    strMessageToRegister = "QueryCancelAutoPlay"
    lngWindowMsg = RegisterWindowMessage(StrPtr(strMessageToRegister))

If you use RegisterWindowMessage("QueryCancelAutoPlay") it will NOT work, put the "QueryCancelAutoPlay" in a variable or constant and use that one.

Tips & Tricks:

Please add some!

Sample Code:

VB.NET Sample Code

    Dim MessageID As Integer
    MessageID = RegisterWindowMessage("QueryCancelAutoPlay")

C# Sample Code

//Register the message
lMsg = Win32.RegisterWindowMessage("WM_HTML_GETOBJECT");
//Get the object
Win32.SendMessageTimeout(windowHandle, lMsg, IntPtr.Zero, IntPtr.Zero, SendMessageTimeoutFlags.SMTO_ABORT_IF_HUNG, 1000, out lRes);
if(lRes != IntPtr.Zero)
{
    //Get the object from lRes
    htmlDoc= (mshtml.IHTMLDocument)Win32.ObjectFromLresult(lRes, IID_IHTMLDocument, IntPtr.Zero);
    return htmlDoc;
}

C# Sample Code

//provide a private internal message id
private UInt32 queryCancelAutoPlay = 0;

[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern uint RegisterWindowMessage(string lpString);

/* only needed if your application is using a dialog box and needs to
* respond to a "QueryCancelAutoPlay" message, it cannot simply return TRUE or FALSE.
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
*/

protected override void WndProc(ref Message m)
{
    //calling the base first is important, otherwise the values you set later will be lost
    base.WndProc (ref m);

    //if the QueryCancelAutoPlay message id has not been registered...
    if (queryCancelAutoPlay == 0)
        queryCancelAutoPlay = RegisterWindowMessage("QueryCancelAutoPlay");

    //if the window message id equals the QueryCancelAutoPlay message id
    if ((UInt32)m.Msg == queryCancelAutoPlay)
    {
        /* only needed if your application is using a dialog box and needs to
        * respond to a "QueryCancelAutoPlay" message, it cannot simply return TRUE or FALSE.
        SetWindowLong(this.Handle, 0, 1);
        */
        m.Result = (IntPtr)1;
    }
} //WndProc

Alternative Managed API:

Do you know one? Please contribute it!

Documentation