[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,int nMaxCount);
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function GetClassName(ByVal hWnd As System.IntPtr, _
ByVal lpClassName As System.Text.StringBuilder, _
ByVal nMaxCount As Integer) As Integer
' Leave function empty
End Function
Public Declare Auto Function GetClassName Lib "User32.dll" (ByVal hwnd As IntPtr, _
<Out()> ByVal lpClassName As System.Text.StringBuilder, _
ByVal nMaxCount As Integer) As Integer
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
(ByVal hWnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
In .NET Framework 4.0, only CharSet.Ansi seems to produce the result.
The return type int seems to crash the .NET application in 64-bit mode (occasionally), long seems to work better. Maybe it should even be IntPtr? Please modify this note if you have more insights.
Please add some!
C# Sample Code
private static bool isIEServerWindow(IntPtr hWnd)
{
int nRet;
// Pre-allocate 256 characters, since this is the maximum class name length.
StringBuilder ClassName = new StringBuilder(256);
//Get the window class name
nRet = GetClassName(hWnd, ClassName, ClassName.Capacity);
if(nRet != 0)
{
return (string.Compare(ClassName.ToString(), "Internet Explorer_Server",true,CultureInfo.InvariantCulture) == 0);
}
else
{
return false;
}
}
VB.NET Sample Code
Create a new VB .NET form and add a button Button1 to it.
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim sClassName As New StringBuilder("", 256)
'pass in the handle of the object for which to get
'the class name; for example, the form's handle
Call GetClassName(Me.Handle, sClassName, 256)
MessageBox.Show(sClassName.ToString)
End Sub
The ManagedWindowsApi project (http://mwinapi.sourceforge.net) provides a
class ManagedWinapi.SystemWindow that has a ClassName property.