/// <summary> /// Capture the contents of a window or control /// </summary> /// <param name="control">Control</param> /// <param name="bitmap">Picture</param> private static void CaptureWindow(Control control, ref Bitmap bitmap) { using (Graphics g2 = Graphics.FromImage(bitmap)) { const int meint = (int)(Win32Engine.PRF_CLIENT | Win32Engine.PRF_ERASEBKGND); var meptr = new IntPtr(meint); IntPtr hdc = g2.GetHdc(); Win32Engine.SendMessage(control.Handle, Win32Engine.WM_PRINT, hdc, meptr); g2.ReleaseHdc(hdc); } }
// отлов скроллирования // при движении ползунка мышью - срабатывает WmVScroll, получается позиция ползунка и кидается событие VScrollingChange // текущее событие пробрасывается для движения ползунка на текущем контроле // при скроллировании мышью - срабатывает WmMouseWheel, получается текущая позиция ползунка, определяется направление // скроллирования, вычисляется правильное положение ползунка после сдвига и кидается событие VScrollingChange. // Так приходится поступать, потому что это событие происходит до того, как ползунок изменит своё положение. Поэтому // приходится не пробрасывать текущее событие, а генерить своё, с указанием правильного положения ползунка после сдвига, // ибо сдвиг может произойти на любое количество шагов (1, 2, 3 и т.д.). Мы же в итоге сдвигается всегда на один шаг. protected override void WndProc(ref Message m) { if (_stopScrollCatching) { base.WndProc(ref m); return; } int pos; var scrollInfo = new ScrollInfo(); scrollInfo.Size = (uint)Marshal.SizeOf(scrollInfo); switch (m.Msg) { case (int)ScrollMessage.WmVScroll: if (VScrollingChange != null) { if ((m.WParam.ToInt32() & 0xFF) == (int)ScrollBarCommands.ThumbTrack) { scrollInfo.Mask = (uint)ScrollBarInfo.TrackPos; Win32Engine.GetScrollInfo(Handle, (int)ScrollBarType.SbVert, ref scrollInfo); pos = scrollInfo.TrackPos; } else { scrollInfo.Mask = (uint)ScrollBarInfo.Pos; Win32Engine.GetScrollInfo(Handle, (int)ScrollBarType.SbVert, ref scrollInfo); pos = scrollInfo.Pos; } VScrollingChange(this, new CScrollEventArgs(pos)); } break; case (int)ScrollMessage.WmMouseWheel: scrollInfo.Mask = (uint)ScrollBarInfo.Pos; Win32Engine.GetScrollInfo(Handle, (int)ScrollBarType.SbVert, ref scrollInfo); pos = scrollInfo.Pos; if (m.WParam.ToInt32() < 0) { pos++; } else if (pos > 0) { pos--; } if (VScrollingChange != null) { VScrollingChange(this, new CScrollEventArgs(pos)); } _stopScrollCatching = true; pos <<= 16; uint wParam = (uint)ScrollBarCommands.ThumbPosition | (uint)pos; Win32Engine.SendMessage(Handle, (int)ScrollMessage.WmVScroll, new IntPtr(wParam), new IntPtr(0)); _stopScrollCatching = false; return; } base.WndProc(ref m); }