Does anybody have a listing of the MS constants such as WM_KEYDOWN and WM_SYSKEYDOWN

J

JohnR

Couldn't find it in MSDN. Does anybody have a listing of the message
constants that would be received in my application.addmessagefilter routine
in VB.net? They are referred to all over MSDN but I can't locate the actual
listing of the constants and their values.

Thanks, John
 
J

Jay B. Harlow [MVP - Outlook]

John,
I normally use the C++ include files from the platform SDK.

Although recently I came across pinvoke.net which you may find easier:

http://www.pinvoke.net/

Hope this helps
Jay

| Couldn't find it in MSDN. Does anybody have a listing of the message
| constants that would be received in my application.addmessagefilter
routine
| in VB.net? They are referred to all over MSDN but I can't locate the
actual
| listing of the constants and their values.
|
| Thanks, John
|
|
 
H

Herfried K. Wagner [MVP]

JohnR said:
Couldn't find it in MSDN. Does anybody have a listing of the message
constants that would be received in my application.addmessagefilter
routine in VB.net? They are referred to all over MSDN but I can't locate
the actual listing of the constants and their values.

The most reliable way is to translate the '#define's in the according header
files. The name of the header file containing the define is listed in the
documentation.

My ActiveVB-coworker Christoph von Wittich provides an API viewer that can
export declares/... for VB.NET:

ApiViewer
<URL:http://www.apiviewer.de/>

English translation:

ApiViewer (en)
<URL:http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html>

Ken Tucker [MVP] wrote an add-in for VS.NET 2003:

VB API Viewer 2003
<URL:http://www.gotdotnet.com/Community/...mpleGuid=673d6b40-3b9b-46a7-a958-a25f4e87568a>

pinvoke.net is a web-based collaborative wiki that collects declares/... for
different .NET programming languages:

pinvoke.net: the interop wiki!
<URL:http://www.pinvoke.net/>

If you don't want to struggle with the declares yourself, you can use this
library:

A Win32 Library for .NET
<URL:http://www.codeproject.com/csharp/win32.asp>
 
C

Crouchie1998

If you have Visual Studio 6 there is an API viewer which lists all the
constants. Alternatively, you can go to the Platform SDK Documentation &
they are listed. Here's the list from the API Viewer (WIN32API.txt):

Private Const WM_ACTIVATE = &H6
Private Const WM_ACTIVATEAPP = &H1C
Private Const WM_ASKCBFORMATNAME = &H30C
Private Const WM_CANCELJOURNAL = &H4B
Private Const WM_CANCELMODE = &H1F
Private Const WM_CHANGECBCHAIN = &H30D
Private Const WM_CHAR = &H102
Private Const WM_CHARTOITEM = &H2F
Private Const WM_CHILDACTIVATE = &H22
Private Const WM_CHOOSEFONT_GETLOGFONT = (WM_USER + 1)
Private Const WM_CHOOSEFONT_SETFLAGS = (WM_USER + 102)
Private Const WM_CHOOSEFONT_SETLOGFONT = (WM_USER + 101)
Private Const WM_CLEAR = &H303
Private Const WM_CLOSE = &H10
Private Const WM_COMMAND = &H111
Private Const WM_COMMNOTIFY = &H44 ' no longer
suported
Private Const WM_COMPACTING = &H41
Private Const WM_COMPAREITEM = &H39
Private Const WM_CONVERTREQUESTEX = &H108
Private Const WM_COPY = &H301
Private Const WM_COPYDATA = &H4A
Private Const WM_CREATE = &H1
Private Const WM_CTLCOLORBTN = &H135
Private Const WM_CTLCOLORDLG = &H136
Private Const WM_CTLCOLOREDIT = &H133
Private Const WM_CTLCOLORLISTBOX = &H134
Private Const WM_CTLCOLORMSGBOX = &H132
Private Const WM_CTLCOLORSCROLLBAR = &H137
Private Const WM_CTLCOLORSTATIC = &H138
Private Const WM_CUT = &H300
Private Const WM_DDE_ACK = (WM_DDE_FIRST + 4)
Private Const WM_DDE_ADVISE = (WM_DDE_FIRST + 2)
Private Const WM_DDE_DATA = (WM_DDE_FIRST + 5)
Private Const WM_DDE_EXECUTE = (WM_DDE_FIRST + 8)
Private Const WM_DDE_FIRST = &H3E0
Private Const WM_DDE_INITIATE = (WM_DDE_FIRST)
Private Const WM_DDE_LAST = (WM_DDE_FIRST + 8)
Private Const WM_DDE_POKE = (WM_DDE_FIRST + 7)
Private Const WM_DDE_REQUEST = (WM_DDE_FIRST + 6)
Private Const WM_DDE_TERMINATE = (WM_DDE_FIRST + 1)
Private Const WM_DDE_UNADVISE = (WM_DDE_FIRST + 3)
Private Const WM_DEADCHAR = &H103
Private Const WM_DELETEITEM = &H2D
Private Const WM_DESTROY = &H2
Private Const WM_DESTROYCLIPBOARD = &H307
Private Const WM_DEVMODECHANGE = &H1B
Private Const WM_DRAWCLIPBOARD = &H308
Private Const WM_DRAWITEM = &H2B
Private Const WM_DROPFILES = &H233
Private Const WM_ENABLE = &HA
Private Const WM_ENDSESSION = &H16
Private Const WM_ENTERIDLE = &H121
Private Const WM_ENTERMENULOOP = &H211
Private Const WM_ERASEBKGND = &H14
Private Const WM_EXITMENULOOP = &H212
Private Const WM_FONTCHANGE = &H1D
Private Const WM_GETDLGCODE = &H87
Private Const WM_GETFONT = &H31
Private Const WM_GETHOTKEY = &H33
Private Const WM_GETMINMAXINFO = &H24
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Const WM_HOTKEY = &H312
Private Const WM_HSCROLL = &H114
Private Const WM_HSCROLLCLIPBOARD = &H30E
Private Const WM_ICONERASEBKGND = &H27
Private Const WM_IME_CHAR = &H286
Private Const WM_IME_COMPOSITION = &H10F
Private Const WM_IME_COMPOSITIONFULL = &H284
Private Const WM_IME_CONTROL = &H283
Private Const WM_IME_ENDCOMPOSITION = &H10E
Private Const WM_IME_KEYDOWN = &H290
Private Const WM_IME_KEYLAST = &H10F
Private Const WM_IME_KEYUP = &H291
Private Const WM_IME_NOTIFY = &H282
Private Const WM_IME_SELECT = &H285
Private Const WM_IME_SETCONTEXT = &H281
Private Const WM_IME_STARTCOMPOSITION = &H10D
Private Const WM_INITDIALOG = &H110
Private Const WM_INITMENU = &H116
Private Const WM_INITMENUPOPUP = &H117
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYFIRST = &H100
Private Const WM_KEYLAST = &H108
Private Const WM_KEYUP = &H101
Private Const WM_KILLFOCUS = &H8
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_MBUTTONDBLCLK = &H209
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208
Private Const WM_MDIACTIVATE = &H222
Private Const WM_MDICASCADE = &H227
Private Const WM_MDICREATE = &H220
Private Const WM_MDIDESTROY = &H221
Private Const WM_MDIGETACTIVE = &H229
Private Const WM_MDIICONARRANGE = &H228
Private Const WM_MDIMAXIMIZE = &H225
Private Const WM_MDINEXT = &H224
Private Const WM_MDIREFRESHMENU = &H234
Private Const WM_MDIRESTORE = &H223
Private Const WM_MDISETMENU = &H230
Private Const WM_MDITILE = &H226
Private Const WM_MEASUREITEM = &H2C
Private Const WM_MENUCHAR = &H120
Private Const WM_MENUSELECT = &H11F
Private Const WM_MOUSEACTIVATE = &H21
Private Const WM_MOUSEFIRST = &H200
Private Const WM_MOUSELAST = &H209
Private Const WM_MOUSEMOVE = &H200
Private Const WM_MOVE = &H3
Private Const WM_NCACTIVATE = &H86
Private Const WM_NCCALCSIZE = &H83
Private Const WM_NCCREATE = &H81
Private Const WM_NCDESTROY = &H82
Private Const WM_NCHITTEST = &H84
Private Const WM_NCLBUTTONDBLCLK = &HA3
Private Const WM_NCLBUTTONDOWN = &HA1
Private Const WM_NCLBUTTONUP = &HA2
Private Const WM_NCMBUTTONDBLCLK = &HA9
Private Const WM_NCMBUTTONDOWN = &HA7
Private Const WM_NCMBUTTONUP = &HA8
Private Const WM_NCMOUSEMOVE = &HA0
Private Const WM_NCPAINT = &H85
Private Const WM_NCRBUTTONDBLCLK = &HA6
Private Const WM_NCRBUTTONDOWN = &HA4
Private Const WM_NCRBUTTONUP = &HA5
Private Const WM_NEXTDLGCTL = &H28
Private Const WM_NULL = &H0
Private Const WM_OTHERWINDOWCREATED = &H42 ' no longer
suported
Private Const WM_OTHERWINDOWDESTROYED = &H43 ' no longer
suported
Private Const WM_PAINT = &HF
Private Const WM_PAINTCLIPBOARD = &H309
Private Const WM_PAINTICON = &H26
Private Const WM_PALETTECHANGED = &H311
Private Const WM_PALETTEISCHANGING = &H310
Private Const WM_PARENTNOTIFY = &H210
Private Const WM_PASTE = &H302
Private Const WM_PENWINFIRST = &H380
Private Const WM_PENWINLAST = &H38F
Private Const WM_POWER = &H48
Private Const WM_PSD_ENVSTAMPRECT = (WM_USER + 5)
Private Const WM_PSD_FULLPAGERECT = (WM_USER + 1)
Private Const WM_PSD_GREEKTEXTRECT = (WM_USER + 4)
Private Const WM_PSD_MARGINRECT = (WM_USER + 3)
Private Const WM_PSD_MINMARGINRECT = (WM_USER + 2)
Private Const WM_PSD_PAGESETUPDLG = (WM_USER)
Private Const WM_PSD_YAFULLPAGERECT = (WM_USER + 6)
Private Const WM_QUERYDRAGICON = &H37
Private Const WM_QUERYENDSESSION = &H11
Private Const WM_QUERYNEWPALETTE = &H30F
Private Const WM_QUERYOPEN = &H13
Private Const WM_QUEUESYNC = &H23
Private Const WM_QUIT = &H12
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const WM_RENDERALLFORMATS = &H306
Private Const WM_RENDERFORMAT = &H305
Private Const WM_SETCURSOR = &H20
Private Const WM_SETFOCUS = &H7
Private Const WM_SETFONT = &H30
Private Const WM_SETHOTKEY = &H32
Private Const WM_SETREDRAW = &HB
Private Const WM_SETTEXT = &HC
Private Const WM_SHOWWINDOW = &H18
Private Const WM_SIZE = &H5
Private Const WM_SIZECLIPBOARD = &H30B
Private Const WM_SPOOLERSTATUS = &H2A
Private Const WM_SYSCHAR = &H106
Private Const WM_SYSCOLORCHANGE = &H15
Private Const WM_SYSCOMMAND = &H112
Private Const WM_SYSDEADCHAR = &H107
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_SYSKEYUP = &H105
Private Const WM_TIMECHANGE = &H1E
Private Const WM_TIMER = &H113
Private Const WM_UNDO = &H304
Private Const WM_USER = &H400
Private Const WM_VKEYTOITEM = &H2E
Private Const WM_VSCROLL = &H115
Private Const WM_VSCROLLCLIPBOARD = &H30A
Private Const WM_WINDOWPOSCHANGED = &H47
Private Const WM_WINDOWPOSCHANGING = &H46
Private Const WM_WININICHANGE = &H1A

I hope this helps

Crouchie1998
BA (HONS) MCP MCSE
 
J

Jay B. Harlow [MVP - Outlook]

JohnR & Crouchie,

FWIW: I find defining the message IDs as an Enum to be easier to deal with
then as Constants, as then I get intellisense on the parameters..

Private Enum WindowsMessage
WM_ACTIVATE = &H6
WM_ACTIVATEAPP = &H1C
WM_ASKCBFORMATNAME = &H30C
WM_CANCELJOURNAL = &H4B
...
End Enum

Declare Sub SendMessage(msg As WindowsMessage, ...)


SendMessage(WindowsMessage.WM_ACTIVATE, ...)

Hope this helps
Jay


| If you have Visual Studio 6 there is an API viewer which lists all the
| constants. Alternatively, you can go to the Platform SDK Documentation &
| they are listed. Here's the list from the API Viewer (WIN32API.txt):
|
| Private Const WM_ACTIVATE = &H6
| Private Const WM_ACTIVATEAPP = &H1C
| Private Const WM_ASKCBFORMATNAME = &H30C
| Private Const WM_CANCELJOURNAL = &H4B
| Private Const WM_CANCELMODE = &H1F
| Private Const WM_CHANGECBCHAIN = &H30D
| Private Const WM_CHAR = &H102
| Private Const WM_CHARTOITEM = &H2F
| Private Const WM_CHILDACTIVATE = &H22
| Private Const WM_CHOOSEFONT_GETLOGFONT = (WM_USER + 1)
| Private Const WM_CHOOSEFONT_SETFLAGS = (WM_USER + 102)
| Private Const WM_CHOOSEFONT_SETLOGFONT = (WM_USER + 101)
| Private Const WM_CLEAR = &H303
| Private Const WM_CLOSE = &H10
| Private Const WM_COMMAND = &H111
| Private Const WM_COMMNOTIFY = &H44 ' no longer
| suported
| Private Const WM_COMPACTING = &H41
| Private Const WM_COMPAREITEM = &H39
| Private Const WM_CONVERTREQUESTEX = &H108
| Private Const WM_COPY = &H301
| Private Const WM_COPYDATA = &H4A
| Private Const WM_CREATE = &H1
| Private Const WM_CTLCOLORBTN = &H135
| Private Const WM_CTLCOLORDLG = &H136
| Private Const WM_CTLCOLOREDIT = &H133
| Private Const WM_CTLCOLORLISTBOX = &H134
| Private Const WM_CTLCOLORMSGBOX = &H132
| Private Const WM_CTLCOLORSCROLLBAR = &H137
| Private Const WM_CTLCOLORSTATIC = &H138
| Private Const WM_CUT = &H300
| Private Const WM_DDE_ACK = (WM_DDE_FIRST + 4)
| Private Const WM_DDE_ADVISE = (WM_DDE_FIRST + 2)
| Private Const WM_DDE_DATA = (WM_DDE_FIRST + 5)
| Private Const WM_DDE_EXECUTE = (WM_DDE_FIRST + 8)
| Private Const WM_DDE_FIRST = &H3E0
| Private Const WM_DDE_INITIATE = (WM_DDE_FIRST)
| Private Const WM_DDE_LAST = (WM_DDE_FIRST + 8)
| Private Const WM_DDE_POKE = (WM_DDE_FIRST + 7)
| Private Const WM_DDE_REQUEST = (WM_DDE_FIRST + 6)
| Private Const WM_DDE_TERMINATE = (WM_DDE_FIRST + 1)
| Private Const WM_DDE_UNADVISE = (WM_DDE_FIRST + 3)
| Private Const WM_DEADCHAR = &H103
| Private Const WM_DELETEITEM = &H2D
| Private Const WM_DESTROY = &H2
| Private Const WM_DESTROYCLIPBOARD = &H307
| Private Const WM_DEVMODECHANGE = &H1B
| Private Const WM_DRAWCLIPBOARD = &H308
| Private Const WM_DRAWITEM = &H2B
| Private Const WM_DROPFILES = &H233
| Private Const WM_ENABLE = &HA
| Private Const WM_ENDSESSION = &H16
| Private Const WM_ENTERIDLE = &H121
| Private Const WM_ENTERMENULOOP = &H211
| Private Const WM_ERASEBKGND = &H14
| Private Const WM_EXITMENULOOP = &H212
| Private Const WM_FONTCHANGE = &H1D
| Private Const WM_GETDLGCODE = &H87
| Private Const WM_GETFONT = &H31
| Private Const WM_GETHOTKEY = &H33
| Private Const WM_GETMINMAXINFO = &H24
| Private Const WM_GETTEXT = &HD
| Private Const WM_GETTEXTLENGTH = &HE
| Private Const WM_HOTKEY = &H312
| Private Const WM_HSCROLL = &H114
| Private Const WM_HSCROLLCLIPBOARD = &H30E
| Private Const WM_ICONERASEBKGND = &H27
| Private Const WM_IME_CHAR = &H286
| Private Const WM_IME_COMPOSITION = &H10F
| Private Const WM_IME_COMPOSITIONFULL = &H284
| Private Const WM_IME_CONTROL = &H283
| Private Const WM_IME_ENDCOMPOSITION = &H10E
| Private Const WM_IME_KEYDOWN = &H290
| Private Const WM_IME_KEYLAST = &H10F
| Private Const WM_IME_KEYUP = &H291
| Private Const WM_IME_NOTIFY = &H282
| Private Const WM_IME_SELECT = &H285
| Private Const WM_IME_SETCONTEXT = &H281
| Private Const WM_IME_STARTCOMPOSITION = &H10D
| Private Const WM_INITDIALOG = &H110
| Private Const WM_INITMENU = &H116
| Private Const WM_INITMENUPOPUP = &H117
| Private Const WM_KEYDOWN = &H100
| Private Const WM_KEYFIRST = &H100
| Private Const WM_KEYLAST = &H108
| Private Const WM_KEYUP = &H101
| Private Const WM_KILLFOCUS = &H8
| Private Const WM_LBUTTONDBLCLK = &H203
| Private Const WM_LBUTTONDOWN = &H201
| Private Const WM_LBUTTONUP = &H202
| Private Const WM_MBUTTONDBLCLK = &H209
| Private Const WM_MBUTTONDOWN = &H207
| Private Const WM_MBUTTONUP = &H208
| Private Const WM_MDIACTIVATE = &H222
| Private Const WM_MDICASCADE = &H227
| Private Const WM_MDICREATE = &H220
| Private Const WM_MDIDESTROY = &H221
| Private Const WM_MDIGETACTIVE = &H229
| Private Const WM_MDIICONARRANGE = &H228
| Private Const WM_MDIMAXIMIZE = &H225
| Private Const WM_MDINEXT = &H224
| Private Const WM_MDIREFRESHMENU = &H234
| Private Const WM_MDIRESTORE = &H223
| Private Const WM_MDISETMENU = &H230
| Private Const WM_MDITILE = &H226
| Private Const WM_MEASUREITEM = &H2C
| Private Const WM_MENUCHAR = &H120
| Private Const WM_MENUSELECT = &H11F
| Private Const WM_MOUSEACTIVATE = &H21
| Private Const WM_MOUSEFIRST = &H200
| Private Const WM_MOUSELAST = &H209
| Private Const WM_MOUSEMOVE = &H200
| Private Const WM_MOVE = &H3
| Private Const WM_NCACTIVATE = &H86
| Private Const WM_NCCALCSIZE = &H83
| Private Const WM_NCCREATE = &H81
| Private Const WM_NCDESTROY = &H82
| Private Const WM_NCHITTEST = &H84
| Private Const WM_NCLBUTTONDBLCLK = &HA3
| Private Const WM_NCLBUTTONDOWN = &HA1
| Private Const WM_NCLBUTTONUP = &HA2
| Private Const WM_NCMBUTTONDBLCLK = &HA9
| Private Const WM_NCMBUTTONDOWN = &HA7
| Private Const WM_NCMBUTTONUP = &HA8
| Private Const WM_NCMOUSEMOVE = &HA0
| Private Const WM_NCPAINT = &H85
| Private Const WM_NCRBUTTONDBLCLK = &HA6
| Private Const WM_NCRBUTTONDOWN = &HA4
| Private Const WM_NCRBUTTONUP = &HA5
| Private Const WM_NEXTDLGCTL = &H28
| Private Const WM_NULL = &H0
| Private Const WM_OTHERWINDOWCREATED = &H42 ' no longer
| suported
| Private Const WM_OTHERWINDOWDESTROYED = &H43 ' no longer
| suported
| Private Const WM_PAINT = &HF
| Private Const WM_PAINTCLIPBOARD = &H309
| Private Const WM_PAINTICON = &H26
| Private Const WM_PALETTECHANGED = &H311
| Private Const WM_PALETTEISCHANGING = &H310
| Private Const WM_PARENTNOTIFY = &H210
| Private Const WM_PASTE = &H302
| Private Const WM_PENWINFIRST = &H380
| Private Const WM_PENWINLAST = &H38F
| Private Const WM_POWER = &H48
| Private Const WM_PSD_ENVSTAMPRECT = (WM_USER + 5)
| Private Const WM_PSD_FULLPAGERECT = (WM_USER + 1)
| Private Const WM_PSD_GREEKTEXTRECT = (WM_USER + 4)
| Private Const WM_PSD_MARGINRECT = (WM_USER + 3)
| Private Const WM_PSD_MINMARGINRECT = (WM_USER + 2)
| Private Const WM_PSD_PAGESETUPDLG = (WM_USER)
| Private Const WM_PSD_YAFULLPAGERECT = (WM_USER + 6)
| Private Const WM_QUERYDRAGICON = &H37
| Private Const WM_QUERYENDSESSION = &H11
| Private Const WM_QUERYNEWPALETTE = &H30F
| Private Const WM_QUERYOPEN = &H13
| Private Const WM_QUEUESYNC = &H23
| Private Const WM_QUIT = &H12
| Private Const WM_RBUTTONDBLCLK = &H206
| Private Const WM_RBUTTONDOWN = &H204
| Private Const WM_RBUTTONUP = &H205
| Private Const WM_RENDERALLFORMATS = &H306
| Private Const WM_RENDERFORMAT = &H305
| Private Const WM_SETCURSOR = &H20
| Private Const WM_SETFOCUS = &H7
| Private Const WM_SETFONT = &H30
| Private Const WM_SETHOTKEY = &H32
| Private Const WM_SETREDRAW = &HB
| Private Const WM_SETTEXT = &HC
| Private Const WM_SHOWWINDOW = &H18
| Private Const WM_SIZE = &H5
| Private Const WM_SIZECLIPBOARD = &H30B
| Private Const WM_SPOOLERSTATUS = &H2A
| Private Const WM_SYSCHAR = &H106
| Private Const WM_SYSCOLORCHANGE = &H15
| Private Const WM_SYSCOMMAND = &H112
| Private Const WM_SYSDEADCHAR = &H107
| Private Const WM_SYSKEYDOWN = &H104
| Private Const WM_SYSKEYUP = &H105
| Private Const WM_TIMECHANGE = &H1E
| Private Const WM_TIMER = &H113
| Private Const WM_UNDO = &H304
| Private Const WM_USER = &H400
| Private Const WM_VKEYTOITEM = &H2E
| Private Const WM_VSCROLL = &H115
| Private Const WM_VSCROLLCLIPBOARD = &H30A
| Private Const WM_WINDOWPOSCHANGED = &H47
| Private Const WM_WINDOWPOSCHANGING = &H46
| Private Const WM_WININICHANGE = &H1A
|
| I hope this helps
|
| Crouchie1998
| BA (HONS) MCP MCSE
|
|
 
C

Crouchie1998

The user wanted the WM constants, so, I just pasted them in. I never ever
will paste in all those & possibly would only use a few of them in any one
application & it doesn't make much sense to ENUM them in that situation.
However, I agree with you if I was adding all of them then ENUM them because
it makes life easier.

Crouchie1998
BA (HONS) MCP MCSE
 
J

Jay B. Harlow [MVP - Outlook]

Crouchie,
Yes I only use the 4 or 5 I need, however I still find it useful to define
the 4 or 5 as an Enum instead of straight constants... As it helps in
Intellisense & its easier for other to see what the "allowed" & "expected"
values are...

Jay

| The user wanted the WM constants, so, I just pasted them in. I never ever
| will paste in all those & possibly would only use a few of them in any one
| application & it doesn't make much sense to ENUM them in that situation.
| However, I agree with you if I was adding all of them then ENUM them
because
| it makes life easier.
|
| Crouchie1998
| BA (HONS) MCP MCSE
|
|
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top