2012-12-27 28 views
5

जो मैं करने की कोशिश कर रहा हूं वह है कि नियंत्रण (एक ही प्रक्रिया में, लेकिन जिसका मेरा कोई नियंत्रण नहीं है) खुद को फिर से निकालने के लिए, और मेरे कोड को तब तक अवरुद्ध करने के लिए को फिर से तैयार करना समाप्त हो गया।विंडो को रेड्रो सिंक्रनाइज़ करें (ब्लॉकिंग विधि के साथ)

मैंने UpdateWindow का उपयोग करने का प्रयास किया लेकिन ऐसा लगता है कि रीडाव खत्म होने की प्रतीक्षा नहीं है।

कारण मुझे इसे फिर से खत्म करने के लिए प्रतीक्षा करने की आवश्यकता है कि मैं बाद में स्क्रीन को पकड़ना चाहता हूं।

नियंत्रण डॉटनेट नियंत्रण नहीं है, यह एक नियमित विंडोज नियंत्रण है।

मैंने पुष्टि की है कि:

  • संभाल सही है।
  • UpdateWindow सत्य लौटाता है।
  • यह सुनिश्चित करने के लिए कि विंडो को अमान्य करने की आवश्यकता है, UpdateWindow पर कॉल करने से पहले InvalidateRect(hWnd, IntPtr.Zero, true) को भेजने से पहले।
  • नियंत्रण की मूल विंडो पर एक ही चीज़ करने का प्रयास किया।

इस्तेमाल किया कोड:

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool InvalidateRect(IntPtr hWnd, IntPtr rect, bool bErase); 

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool UpdateWindow(IntPtr hWnd); 

public bool PaintWindow(IntPtr hWnd) 
{ 
    InvalidateRect(hWnd, IntPtr.Zero, true); 
    return UpdateWindow(hWnd); 
} 
//returns true 
+0

शायद तुम WM_PAINT मामले में प्रतिपादन निष्क्रिय कर सकते हैं और फिर उसके बाद कि पुनः सक्षम करें। –

+0

@ एसए। पार्किड क्या आप कृपया विस्तृत कर सकते हैं? – Rotem

+0

हम्म .. आपको क्यों लगता है कि _UpdateWindow Redraw को खत्म करने के लिए प्रतीक्षा नहीं कर रहा है? –

उत्तर

1

आप मजबूर कर सकते हैं आवेदन सभी कतारबद्ध संदेश संसाधित करने Application.DoEvents का उपयोग कर (WM_PAINT सहित!)। कुछ इस तरह:

public bool PaintWindow(IntPtr hWnd) 
{ 
    InvalidateRect(hWnd, IntPtr.Zero, true); 
    if (UpdateWindow(hWnd)) 
    { 
     Application.DoEvents(); 
     return true; 
    } 

    return false; 
} 

लेकिन तुम वैसे भी स्क्रीन हड़पने के लिए, यह बेहतर WM_PRINT संदेश भेज कर एक तीर से दो पक्षियों को मारने के लिए नहीं होगा जा रहे हैं?

आप नीचे दिए गए कोड से यह कर सकते हैं:

internal static class NativeWinAPI 
{ 
    [Flags] 
    internal enum DrawingOptions 
    { 
     PRF_CHECKVISIBLE = 0x01, 
     PRF_NONCLIENT = 0x02, 
     PRF_CLIENT = 0x04, 
     PRF_ERASEBKGND = 0x08, 
     PRF_CHILDREN = 0x10, 
     PRF_OWNED = 0x20 
    } 

    internal const int WM_PRINT = 0x0317; 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, 
     IntPtr wParam, IntPtr lParam); 
} 

public static void TakeScreenshot(IntPtr hwnd, Graphics g) 
{ 
    IntPtr hdc = IntPtr.Zero; 
    try 
    { 
     hdc = g.GetHdc(); 

     NativeWinAPI.SendMessage(hwnd, NativeWinAPI.WM_PRINT, hdc, 
      new IntPtr((int)(
       NativeWinAPI.DrawingOptions.PRF_CHILDREN | 
       NativeWinAPI.DrawingOptions.PRF_CLIENT | 
       NativeWinAPI.DrawingOptions.PRF_NONCLIENT | 
       NativeWinAPI.DrawingOptions.PRF_OWNED 
       )) 
      ); 
    } 
    finally 
    { 
     if (hdc != IntPtr.Zero) 
      g.ReleaseHdc(hdc); 
    } 
} 
+0

धन्यवाद, मैं इसे आज़मा दूंगा और आपको बता दूंगा। – Rotem

+0

@ रोटेम, तो, क्या आपने अपनी समस्या का समाधान किया? –

+0

केवल कल इसका परीक्षण करने में सक्षम होगा, जैसे ही मैं करता हूं मैं अपडेट करूंगा। – Rotem