Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / WinForms / System / WinForms / Design / PbrsForward.cs / 1 / PbrsForward.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- /* */ namespace System.Windows.Forms.Design { using System.Collections; using System.ComponentModel; using System.Diagnostics; using System; using System.Design; using System.ComponentModel.Design; using System.Windows.Forms; using System.Drawing; using Microsoft.Win32; internal class PbrsForward : IWindowTarget { private Control target; private IWindowTarget oldTarget; // we save the last key down so we can recreate the last message if we need to activate // the properties window... // private Message lastKeyDown; private ArrayList bufferedChars; private const int WM_PRIVATE_POSTCHAR = NativeMethods.WM_USER + 0x1598; private bool postCharMessage; private IMenuCommandService menuCommandSvc; private IServiceProvider sp; private bool ignoreMessages = false; public PbrsForward(Control target, IServiceProvider sp) { this.target = target; this.oldTarget = target.WindowTarget; this.sp = sp; target.WindowTarget = this; } private IMenuCommandService MenuCommandService { get { if (menuCommandSvc == null && sp != null) { menuCommandSvc = (IMenuCommandService)sp.GetService(typeof(IMenuCommandService)); } return menuCommandSvc; } } private ISupportInSituService InSituSupportService { get { return (ISupportInSituService)sp.GetService(typeof(ISupportInSituService)); } } public void Dispose() { target.WindowTarget = oldTarget; } ////// /// Called when the window handle of the control has changed. /// void IWindowTarget.OnHandleChange(IntPtr newHandle){ } ////// /// Called to do control-specific processing for this window. /// void IWindowTarget.OnMessage(ref Message m){ // Get the Designer for the currently selected item on the Designer... // SET STATE .. ignoreMessages = false; // Here lets query for the ISupportInSituService. // If we find the service then ask if it has a designer which is interested // in getting the keychars by querring the IgnoreMessages. if (m.Msg >= NativeMethods.WM_KEYFIRST && m.Msg <= NativeMethods.WM_KEYLAST || (m.Msg >= NativeMethods.WM_IME_STARTCOMPOSITION && m.Msg <= NativeMethods.WM_IME_COMPOSITION)) { if (InSituSupportService != null) { ignoreMessages = InSituSupportService.IgnoreMessages; } } switch (m.Msg) { case WM_PRIVATE_POSTCHAR: if (bufferedChars == null) { return; } // recreate the keystroke to the newly activated window IntPtr hWnd = IntPtr.Zero; if (!ignoreMessages) { hWnd = NativeMethods.GetFocus(); } else { if (InSituSupportService != null) { hWnd = InSituSupportService.GetEditWindow(); } else { hWnd = NativeMethods.GetFocus(); } } if (hWnd != m.HWnd) { foreach (BufferedKey bk in bufferedChars) { if (bk.KeyChar.Msg == NativeMethods.WM_CHAR) { if (bk.KeyDown.Msg != 0) { NativeMethods.SendMessage(hWnd, NativeMethods.WM_KEYDOWN, bk.KeyDown.WParam, bk.KeyDown.LParam); } NativeMethods.SendMessage(hWnd, NativeMethods.WM_CHAR, bk.KeyChar.WParam, bk.KeyChar.LParam); if (bk.KeyUp.Msg != 0) { NativeMethods.SendMessage(hWnd, NativeMethods.WM_KEYUP, bk.KeyUp.WParam, bk.KeyUp.LParam); } } else { NativeMethods.SendMessage(hWnd, bk.KeyChar.Msg, bk.KeyChar.WParam, bk.KeyChar.LParam); } } } bufferedChars.Clear(); return; case NativeMethods.WM_KEYDOWN: this.lastKeyDown = m; break; case NativeMethods.WM_IME_ENDCOMPOSITION: case NativeMethods.WM_KEYUP: this.lastKeyDown.Msg = 0; break; case NativeMethods.WM_CHAR: case NativeMethods.WM_IME_STARTCOMPOSITION: case NativeMethods.WM_IME_COMPOSITION: ISelectionService selService = (ISelectionService)sp.GetService(typeof(ISelectionService)); if ((Control.ModifierKeys & (Keys.Control | Keys.Alt)) != 0) { break; } if (bufferedChars == null) { bufferedChars = new ArrayList(); } bufferedChars.Add(new BufferedKey(lastKeyDown, m, lastKeyDown)); if (!ignoreMessages && MenuCommandService != null) { // throw the properties window command, we will redo the keystroke when we actually // lose focus postCharMessage = true; MenuCommandService.GlobalInvoke(StandardCommands.PropertiesWindow); } else if (ignoreMessages && m.Msg != NativeMethods.WM_IME_COMPOSITION) { if (InSituSupportService != null) { postCharMessage = true; InSituSupportService.HandleKeyChar(); } } if (postCharMessage) { // If copy of message has been buffered for forwarding, eat the original now return; } break; case NativeMethods.WM_KILLFOCUS: if (postCharMessage) { // see ASURT 45313 // now that we've actually lost focus, post this message to the queue. This allows // any activity that's in the queue to settle down before our characters are posted. // to the queue. // // we post because we need to allow the focus to actually happen before we send // our strokes so we know where to send them // // we can't use the wParam here because it may not be the actual window that needs // to pick up the strokes. // UnsafeNativeMethods.PostMessage(target.Handle, WM_PRIVATE_POSTCHAR, IntPtr.Zero, IntPtr.Zero); postCharMessage = false; } break; } if (this.oldTarget != null) { oldTarget.OnMessage(ref m); } } private struct BufferedKey { public readonly Message KeyDown; public readonly Message KeyUp; public readonly Message KeyChar; public BufferedKey(Message keyDown, Message keyChar, Message keyUp) { this.KeyChar = keyChar; this.KeyDown = keyDown; this.KeyUp = keyUp; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DLinqColumnProvider.cs
- RolePrincipal.cs
- IgnoreDeviceFilterElementCollection.cs
- SoapServerProtocol.cs
- RawUIStateInputReport.cs
- DynamicVirtualDiscoSearcher.cs
- VariantWrapper.cs
- ObjectTokenCategory.cs
- ConfigurationSettings.cs
- BitmapCache.cs
- OletxCommittableTransaction.cs
- XmlDocumentSchema.cs
- WsiProfilesElement.cs
- DESCryptoServiceProvider.cs
- SuppressIldasmAttribute.cs
- ArraySubsetEnumerator.cs
- WizardPanelChangingEventArgs.cs
- DataGrid.cs
- LinkTarget.cs
- CanExecuteRoutedEventArgs.cs
- DataGridViewRowDividerDoubleClickEventArgs.cs
- MemoryResponseElement.cs
- MappingMetadataHelper.cs
- StylusPlugin.cs
- BuildProvidersCompiler.cs
- NamespaceInfo.cs
- GridViewAutomationPeer.cs
- ExpressionHelper.cs
- DataIdProcessor.cs
- DropDownList.cs
- COM2IPerPropertyBrowsingHandler.cs
- FrameworkTextComposition.cs
- CultureSpecificCharacterBufferRange.cs
- PermissionSetTriple.cs
- AssemblyBuilder.cs
- RelationshipConverter.cs
- Duration.cs
- LowerCaseStringConverter.cs
- Misc.cs
- ClientSideProviderDescription.cs
- PersonalizationStateInfo.cs
- GPPOINT.cs
- WebPartDisplayModeCancelEventArgs.cs
- EraserBehavior.cs
- RenderData.cs
- LoginName.cs
- TargetConverter.cs
- PropertyTab.cs
- HtmlSelect.cs
- Transform3D.cs
- ELinqQueryState.cs
- OneOfElement.cs
- PrintPreviewControl.cs
- SignatureToken.cs
- DataGridViewLinkCell.cs
- MailDefinition.cs
- ScriptControlDescriptor.cs
- PolicyLevel.cs
- HttpListenerRequestUriBuilder.cs
- OAVariantLib.cs
- QueueProcessor.cs
- DataGridColumnHeadersPresenterAutomationPeer.cs
- OraclePermission.cs
- ResourceIDHelper.cs
- OperationParameterInfoCollection.cs
- RotationValidation.cs
- FacetValueContainer.cs
- DataRowChangeEvent.cs
- CollectionView.cs
- QilReplaceVisitor.cs
- QuaternionAnimationUsingKeyFrames.cs
- ReflectEventDescriptor.cs
- ErrorStyle.cs
- OutputCacheSettings.cs
- PinnedBufferMemoryStream.cs
- LogicalTreeHelper.cs
- CodeIterationStatement.cs
- BufferAllocator.cs
- FrameworkElementAutomationPeer.cs
- CancelAsyncOperationRequest.cs
- URLString.cs
- RijndaelManaged.cs
- KeyValueInternalCollection.cs
- WebScriptMetadataMessage.cs
- XmlSignatureProperties.cs
- CompressStream.cs
- TypeUnloadedException.cs
- ContentTextAutomationPeer.cs
- NativeMethods.cs
- SignatureDescription.cs
- ReadOnlyCollectionBase.cs
- StylusPointProperties.cs
- WriteTimeStream.cs
- WsatServiceAddress.cs
- TemplatePropertyEntry.cs
- Rotation3DKeyFrameCollection.cs
- AuthorizationRuleCollection.cs
- CodeMethodInvokeExpression.cs
- SymbolEqualComparer.cs
- BindingMAnagerBase.cs