मैं स्क्रीनशॉट लेने के लिए हर घंटे एक थ्रेड कॉल कर रहा हूं। लेकिन समस्या विंडो को सक्रिय करने या विंडो को सामने की ओर ले जाने की है। अगर सामने अन्य ऐप्स हैं तो स्क्रीनशॉट लेते समय वे सामने दिखाई देते हैं। क्या चल रहा है?

<Runtime.InteropServices.DllImport("user32.dll")>
Private Function SetForegroundWindow(ByVal hWnd As IntPtr) As Integer
End Function

<Runtime.InteropServices.DllImport("user32.dll")>
Private Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As IntPtr
End Function

Public Sub TakeScreenshot()
        Dim thread As New Threading.Thread(AddressOf TakeScreenShotThread)
        thread.Start()
End Sub

Public Function TakeScreenShotThread() As Integer
        Dim proc As Process = Process.GetCurrentProcess
        Call SetForegroundWindow(proc.MainWindowHandle)
        Call ShowWindow(proc.MainWindowHandle, 5)

                    'GIVE IT TIME TO DISPLAY THE APP AND ACTIVATE WINDOW
        Dim t = Threading.Tasks.Task.Run(Async Function()
                                             Await Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(200))
                                             Return 1
                                         End Function)

        t.Wait()

                    'SAVE SCREENSHOT IMAGE CODE HERE
End Function
0
XK8ER 25 फरवरी 2020, 22:52
1
क्या आपने बाहरी कॉल के क्रम को फ़्लिप करने का प्रयास किया है? पहले ShowWindow, फिर SetForegroundWindow पर कॉल करने की कोशिश करें। यह एक अलग परिणाम दे सकता है।
 – 
JuanR
25 फरवरी 2020, 22:59
यदि यह विनफॉर्म है तो आप फॉर्म को सामने भेजने के लिए Show फ़ंक्शन और TopMost फॉर्म की संपत्ति का उपयोग करने का भी प्रयास कर सकते हैं।
 – 
Zaelin Goodman
25 फरवरी 2020, 23:06
1
मान लें कि यह विनफॉर्म है, आप यहां वर्णित तकनीकों का उपयोग करके अपने फॉर्म (फॉर्मों) को स्क्रीनशॉट करने का प्रयास कर सकते हैं stackoverflow.com/questions/5124434/… । इस मामले में आपको अपने आवेदन को पॉपअप करने की आवश्यकता नहीं है। क्योंकि इस दृष्टिकोण में कुछ सीमाएँ हैं।
 – 
Sergey L
25 फरवरी 2020, 23:26

1 उत्तर

सबसे बढ़िया उत्तर

दुर्भाग्य से (या यदि कोई उपयोगकर्ता के दृष्टिकोण से सौभाग्य से सोचता है) SetForegroundWindow बिना शर्त "इस विंडो को सबसे महत्वपूर्ण/सक्रिय बनाएं" कमांड नहीं है।

इसमें प्रतिबंधों:

सिस्टम प्रतिबंधित करता है कि कौन सी प्रक्रियाएं अग्रभूमि विंडो सेट कर सकती हैं। एक प्रक्रिया अग्रभूमि विंडो को तभी सेट कर सकती है जब निम्न में से कोई एक स्थिति सत्य हो:

प्रक्रिया अग्रभूमि प्रक्रिया है।
प्रक्रिया अग्रभूमि प्रक्रिया द्वारा शुरू की गई थी।
प्रक्रिया को अंतिम इनपुट ईवेंट प्राप्त हुआ।
कोई अग्रभूमि प्रक्रिया नहीं है।
प्रक्रिया को डीबग किया जा रहा है।
अग्रभूमि प्रक्रिया कोई आधुनिक अनुप्रयोग या प्रारंभ स्क्रीन नहीं है।
अग्रभूमि लॉक नहीं है (देखें LockSetForegroundWindow)।
अग्रभूमि लॉक टाइम-आउट समाप्त हो गया है (SPI_GETFOREGROUNDLOCKTIMEOUT SystemParametersInfo में देखें)।
कोई मेनू सक्रिय नहीं है।

इसलिए जबकि सामान्य परिस्थितियों में इस प्रतिबंध को दूर करने के लिए कुछ अनुशंसित तरीके नहीं हैं, जब तक कि उनमें से कोई एक शर्त सत्य न हो, SetForegroundWindow काम नहीं करेगा।

पुनश्च: इसके अलावा, पढ़ने की सिफारिश की - https://devblogs.microsoft.com/ Oldnewthing/20090220-00/?p=19083

PS1: हालांकि यह प्रतिबंध शायद यही कारण है कि मूल समाधान विफल हो जाता है, मैं यह भी बताना चाहूंगा कि एक मौका है कि proc.MainWindowHandle IntPtr.Zero हो सकता है या एक पुराना हैंडल हो सकता है (कुछ शुरुआती विंडो से या आदि) और यह कि आप चेक मान लौटाएं "nofollow noreferrer">जिसे WIN API फ़ंक्शन कहा जाता है, दोनों बहुत महत्वपूर्ण हैं और वास्तव में समस्या के निवारण में सहायता कर सकते हैं...

1
Eugene Podskal 25 फरवरी 2020, 23:52
1
धोखा संभव है: docs। microsoft.com/en-us/dotnet/api/…
 – 
Hans Passant
25 फरवरी 2020, 23:37