How can I enable editing for the WebBrowser?

You can set the content editable by getting a reference to a IHTMLElement3 element and initializing the contentEditable property with ‘true’. private void EnableEditing() { IHTMLDocument3 doc = (IHTMLDocument3) browser.GetDocument(); if (doc != null) { IHTMLElement3 el = (IHTMLElement3) doc.GetBody(); el.contentEditable = ‘true’; } } If you want to read out contents of a specific element use an id in the html source: <span id=’EditText’>EditableText</span> From CSharp you can reference this text with IHTMLElement3 el = (IHTMLElement3) doc.getElementById(‘EditText’); MessageBox.Show(el.GetInnerText()); MessageBox.Show(el.GetInnerHTML()); You can use IHTMLDocument3 and IHTMLElement3 interface definitions from the imported type library dll C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll [ Guid(@’3050F485-98B5-11CF-BB82-00AA00BDCE0B’), TypeLibType(TypeLibTypeFlags.FDispatchable|TypeLibTypeFlags.FDual) ] public interface IHTMLDocument3 : IHTMLDocument2 { [DispId(1072 /*0x0430*/)] void releaseCapture(); [DispId(1073 /*0x0431*/)] void recalc(bool fForce); [DispId(1074 /*0x0432*/)] [return: MarshalAs(UnmanagedType.Interface)] object createTextNode(string text); [DispId(1075 /*0x0433*/)] IHTMLElement documentElement { [return: MarshalAs(UnmanagedType.Interface)] get; } [DispId(1077 /*0x0435*/)] string uniqueID { [return: MarshalAs(UnmanagedType.BStr)] get; } [DispId(-2147417605 /*0x800101FB*/)] bool attachEvent(string _event, object pdisp); [DispId(-2147417604 /*0x800101FC*/)] void detachEvent(string _event, object pdisp); [DispId(-2147412050 /*0x800117AE*/)] object onrowsdelete { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412049 /*0x800117AF*/)] object onrowsinserted { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412048 /*0x800117B0*/)] object oncellchange { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412072 /*0x80011798*/)] object ondatasetchanged { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412071 /*0x80011799*/)] object ondataavailable { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412070 /*0x8001179A*/)] object ondatasetcomplete { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412065 /*0x8001179F*/)] object onpropertychange { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412995 /*0x800113FD*/)] string dir { set; [return: MarshalAs(UnmanagedType.BStr)] get; } [DispId(-2147412047 /*0x800117B1*/)] object oncontextmenu { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412044 /*0x800117B4*/)] object onstop { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(1076 /*0x0434*/)] [return: MarshalAs(UnmanagedType.Interface)] IHTMLDocument2 createDocumentFragment(); [DispId(1078 /*0x0436*/)] IHTMLDocument2 parentDocument { [return: MarshalAs(UnmanagedType.Interface)] get; } [DispId(1079 /*0x0437*/)] bool enableDownload { set; get; } [DispId(1080 /*0x0438*/)] string baseUrl { set; [return: MarshalAs(UnmanagedType.BStr)] get; } [DispId(-2147417063 /*0x80010419*/)] object childNodes { [return: MarshalAs(UnmanagedType.IDispatch)] get; } [DispId(1082 /*0x043A*/)] bool inheritStyleSheets { set; get; } [DispId(-2147412043 /*0x800117B5*/)] object onbeforeeditfocus { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(1086 /*0x043E*/)] [return: MarshalAs(UnmanagedType.Interface)] object getElementsByName(string v); [DispId(1088 /*0x0440*/)] [return: MarshalAs(UnmanagedType.Interface)] IHTMLElement getElementById(string v); [DispId(1087 /*0x043F*/)] [return: MarshalAs(UnmanagedType.Interface)] object getElementsByTagName(string v); } [ InterfaceType(ComInterfaceType.InterfaceIsDual), ComVisible(true), Guid(@’332C4425-26CB-11D0-B483-00C04FD90119′) ] public interface IHTMLDocument2 { [return: MarshalAs(UnmanagedType.Interface)] object GetScript(); [return: MarshalAs(UnmanagedType.Interface)] object GetAll(); [return: MarshalAs(UnmanagedType.Interface)] IHTMLElement GetBody(); [return: MarshalAs(UnmanagedType.Interface)] object GetActiveElement(); [return: MarshalAs(UnmanagedType.Interface)] object GetImages(); [return: MarshalAs(UnmanagedType.Interface)] object GetApplets(); [return: MarshalAs(UnmanagedType.Interface)] object GetLinks(); [return: MarshalAs(UnmanagedType.Interface)] object GetForms(); [return: MarshalAs(UnmanagedType.Interface)] object GetAnchors(); void SetTitle(string p); [return: MarshalAs(UnmanagedType.BStr)] string GetTitle(); [return: MarshalAs(UnmanagedType.Interface)] object GetScripts(); void SetDesignMode(string p); [return: MarshalAs(UnmanagedType.BStr)] string GetDesignMode(); [return: MarshalAs(UnmanagedType.Interface)] object GetSelection(); [return: MarshalAs(UnmanagedType.BStr)] string GetReadyState(); [return: MarshalAs(UnmanagedType.Interface)] object GetFrames(); [return: MarshalAs(UnmanagedType.Interface)] object GetEmbeds(); [return: MarshalAs(UnmanagedType.Interface)] object GetPlugins(); void SetAlinkColor(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetAlinkColor(); void SetBgColor(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetBgColor(); void SetFgColor(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetFgColor(); void SetLinkColor(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetLinkColor(); void SetVlinkColor(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetVlinkColor(); [return: MarshalAs(UnmanagedType.BStr)] string GetReferrer(); [return: MarshalAs(UnmanagedType.Interface)] object GetLocation(); [return: MarshalAs(UnmanagedType.BStr)] string GetLastModified(); void SetURL(string p); [return: MarshalAs(UnmanagedType.BStr)] string GetURL(); void SetDomain(string p); [return: MarshalAs(UnmanagedType.BStr)] string GetDomain(); void SetCookie(string p); [return: MarshalAs(UnmanagedType.BStr)] string GetCookie(); void SetExpando(bool p); [return: MarshalAs(UnmanagedType.Bool)] bool GetExpando(); void SetCharset(string p); [return: MarshalAs(UnmanagedType.BStr)] string GetCharset(); void SetDefaultCharset(string p); [return: MarshalAs(UnmanagedType.BStr)] string GetDefaultCharset(); [return: MarshalAs(UnmanagedType.BStr)] string GetMimeType(); [return: MarshalAs(UnmanagedType.BStr)] string GetFileSize(); [return: MarshalAs(UnmanagedType.BStr)] string GetFileCreatedDate(); [return: MarshalAs(UnmanagedType.BStr)] string GetFileModifiedDate(); [return: MarshalAs(UnmanagedType.BStr)] string GetFileUpdatedDate(); [return: MarshalAs(UnmanagedType.BStr)] string GetSecurity(); [return: MarshalAs(UnmanagedType.BStr)] string GetProtocol(); [return: MarshalAs(UnmanagedType.BStr)] string GetNameProp(); void DummyWrite(int psarray); void DummyWriteln(int psarray); [return: MarshalAs(UnmanagedType.Interface)] object Open(string URL, object name, object features, object replace); void Close(); void Clear(); [return: MarshalAs(UnmanagedType.Bool)] bool QueryCommandSupported(string cmdID); [return: MarshalAs(UnmanagedType.Bool)] bool QueryCommandEnabled(string cmdID); [return: MarshalAs(UnmanagedType.Bool)] bool QueryCommandState(string cmdID); [return: MarshalAs(UnmanagedType.Bool)] bool QueryCommandIndeterm(string cmdID); [return: MarshalAs(UnmanagedType.BStr)] string QueryCommandText(string cmdID); [return: MarshalAs(UnmanagedType.Struct)] object QueryCommandValue(string cmdID); [return: MarshalAs(UnmanagedType.Bool)] bool ExecCommand(string cmdID, bool showUI, object value); [return: MarshalAs(UnmanagedType.Bool)] bool ExecCommandShowHelp(string cmdID); [return: MarshalAs(UnmanagedType.Interface)] object CreateElement(string eTag); void SetOnhelp(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnhelp(); void SetOnclick(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnclick(); void SetOndblclick(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOndblclick(); void SetOnkeyup(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnkeyup(); void SetOnkeydown(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnkeydown(); void SetOnkeypress(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnkeypress(); void SetOnmouseup(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnmouseup(); void SetOnmousedown(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnmousedown(); void SetOnmousemove(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnmousemove(); void SetOnmouseout(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnmouseout(); void SetOnmouseover(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnmouseover(); void SetOnreadystatechange(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnreadystatechange(); void SetOnafterupdate(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnafterupdate(); void SetOnrowexit(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnrowexit(); void SetOnrowenter(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnrowenter(); void SetOndragstart(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOndragstart(); void SetOnselectstart(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnselectstart(); [return: MarshalAs(UnmanagedType.Interface)] object ElementFromPoint(int x, int y); [return: MarshalAs(UnmanagedType.Interface)] object GetParentWindow(); [return: MarshalAs(UnmanagedType.Interface)] object GetStyleSheets(); void SetOnbeforeupdate(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnbeforeupdate(); void SetOnerrorupdate(object p); [return: MarshalAs(UnmanagedType.Struct)] object GetOnerrorupdate(); [return: MarshalAs(UnmanagedType.BStr)] string toString(); [return: MarshalAs(UnmanagedType.Interface)] object CreateStyleSheet(string bstrHref, int lIndex); } [ Guid(@’3050F434-98B5-11CF-BB82-00AA00BDCE0B’), TypeLibType(TypeLibTypeFlags.FDispatchable|TypeLibTypeFlags.FDual) ] public interface IHTMLElement2 : IHTMLElement { // Methods [DispId(-2147417073 /*0x8001040F*/)] string scopeName { [return: MarshalAs(UnmanagedType.BStr)] get; } [DispId(-2147417072 /*0x80010410*/)] void setCapture(bool containerCapture); [DispId(-2147417071 /*0x80010411*/)] void releaseCapture(); [DispId(-2147412066 /*0x8001179E*/)] object onlosecapture { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147417070 /*0x80010412*/)] [return: MarshalAs(UnmanagedType.BStr)] string componentFromPoint(int x, int y); [DispId(-2147417069 /*0x80010413*/)] void doScroll(object component); [DispId(-2147412081 /*0x8001178F*/)] object onscroll { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412063 /*0x800117A1*/)] object ondrag { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412062 /*0x800117A2*/)] object ondragend { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412061 /*0x800117A3*/)] object ondragenter { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412060 /*0x800117A4*/)] object ondragover { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412059 /*0x800117A5*/)] object ondragleave { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412058 /*0x800117A6*/)] object ondrop { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412054 /*0x800117AA*/)] object onbeforecut { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412057 /*0x800117A7*/)] object oncut { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412053 /*0x800117AB*/)] object onbeforecopy { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412056 /*0x800117A8*/)] object oncopy { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412052 /*0x800117AC*/)] object onbeforepaste { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147412055 /*0x800117A9*/)] object onpaste { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147417105 /*0x800103EF*/)] object currentStyle { [return: MarshalAs(UnmanagedType.Interface)] get; } [DispId(-2147412065 /*0x8001179F*/)] object onpropertychange { set; [return: MarshalAs(UnmanagedType.Struct)] get; } [DispId(-2147417068 /*0x80010414*/)] [return: MarshalAs(UnmanagedType.Interface)] object getClientRects(); [DispId(-2147417067 /*0x80010415*/)] [return: MarshalAs(UnmanagedType.Interface)] object getBoundingClientRect(); [DispId(-2147417608 /*0x800101F8*/)] void setExpression(string propname, string expression, string language); [DispId(-2147417607 /*0x800101F9*/)] [return:

Is there a way to find out the brightness of a Color?

There is a very convenient Color.GetBrightness method that will tell you how close a Color is to black or white. This is useful when you want to use a bright or a dark color to draw based on whether the background Color is dark or bright.

I hate string processing. Is there an easier way to do string manipulation?

.NET has excellent support for Regular Expressions. Get the excellent ‘Regular Expressions with .NET ‘, e-book by Dan Appleman. It has all that you need to get started. Regular expressions really make string processing easier. There are expressions that you can find on the web for everything from validating dates to phone numbers.