2009-08-25 20 views
6

मुझे काम करने के लिए वैश्विक प्रणाली हुक प्राप्त करने में परेशानी हो रही है। जब भी एक खिड़की चलती है, जितनी जल्दी हो सके, और खिड़की के आकार को बदलना चाहता हूं, मैं अधिसूचित होना चाहता हूं। इसका मतलब है कि सीबीटी हुक HCBT_MOVESIZE इसे काट नहीं देगा, यह खिड़की के स्थानांतरित होने के बाद ही होता है। मैं खिड़की के वास्तविक आंदोलन को हुक करना चाहता हूं, और चाल के दौरान खिड़की के आकार को बदलने में सक्षम हूं।वैश्विक स्तर पर विंडो आंदोलन को अवरुद्ध करें

हुक एक डीएलएल से सेट हैं, और कॉलबैक फ़ंक्शन उस डीएलएल के भीतर है। मैंने यही कोशिश की है।

  • WH_CALLWNDPROC। जब खिड़की चली जाती है तो यह मुझे सतर्क करता है (WM_MOVING अन्य अनुप्रयोगों से विंडोज़ के लिए प्राप्त होता है), लेकिन मैं संदेश की सामग्री को नहीं बदल सकता।
  • WH_CALLWNDPROCRETWH_CALLWNDPROC के समान।
  • सीबीटी हुक HCBT_MOVESIZE। घटना देर से होती है।
  • WH_GETMESSAGEWM_MOVE, WM_MOVING या WM_WINDOWPOSCHANGING कभी प्राप्त न करें। यह हुक मुझे संदेश बदलने की अनुमति देगा।

अद्यतन: विंडोज घटना हुक मुझे यह कब्जा करने के लिए अनुमति देने के लिए लग रहे हैं: SetWindowPos() का उपयोग कर काम नहीं करता है विंडो के आकार बदल रहा है (यह परिवर्तन:

hWinEventHook = SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART,  
    EVENT_SYSTEM_MOVESIZEEND, NULL, WinEventProc, 
    0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 

बहरहाल, यह एक अलग समस्या पैदा करता है आकार ठीक है, लेकिन तुरंत अपने पिछले आकार में बदल जाता है), भले ही मैं SWP_NOSENDCHANGING का उपयोग करता हूं। विचार?

अपडेट 2: सबक्लासिंग काम करने लगती है, हालांकि प्रत्येक प्रोग्राम चलाने के बाद विजुअल स्टूडियो क्रैश हो जाता है (इसलिए कई अन्य विंडोज़)। यह अच्छी तरह से काम करता है अगर मैं ब्रेकपॉइंट्स डालता हूं और "unsubclassing" के माध्यम से चलता हूं, लेकिन जब मैं प्रोग्राम को स्वयं चलाता हूं। विचार?

मैं (यह वहाँ पहले से था) एक सीबीटी हुक है, और HCBT_ACTIVATE एक नई विंडो के लिए भेज दिया जाता है, जब भी, मैं किसी भी पिछले उपवर्गीकरण SetWindowLongPtr() का उपयोग कर उपवर्ग निकाल सकते हैं (यह रूप में अच्छी तरह 64-बिट पर चलने के लिए है), और फिर नई खिड़की अगर मैं कहीं भी ब्रेकपॉइंट डालता हूं, और जब यह टूट जाता है तो तुरंत सत्र को फिर से शुरू करें, सब कुछ ठीक काम करता है। हालांकि, जब मेरे पास कोई ब्रेकपॉइंट नहीं होता है, तो जब प्रोग्राम निकलता है तो विजुअल स्टूडियो क्रैश हो जाता है।

उत्तर

1

हम्म, मैं सोचा है होगा HCBT_MOVESIZE आप ठीक क्या चाहते हैं, यह देखते हुए कि MSDN कहते सीबीटी हुक के बारे में यह है कि:

The system calls this function before activating, creating, destroying, 
minimizing, maximizing, moving, or sizing a window.

और विशेष रूप से:

HCBT_MOVESIZE 
    A window is about to be moved or sized.

(इन उद्धरण http://msdn.microsoft.com/en-us/library/ms644977%28VS.85%29.aspx से

... इसलिए मैंने सोचा होगा कि आपको समय में HCBT_MOVESIZE कॉल मिल जाएगा। हुक फ़ंक्शन जो HCBT_MOVESIZE को संभालता है उसे एक पूर्णांक वापस करने की भी अनुमति दी जाती है ताकि सिस्टम यह निर्धारित कर सके कि ऑपरेशन की अनुमति है या रोका जाना चाहिए। इसलिए, यह देखते हुए कि HCBT_MOVESIZE हुक ऑपरेशन को रोकने के लिए एक विकल्प प्राप्त करना चाहिए, मैं कहूंगा कि चाल घटना होने से पहले इसे बुलाया जाता है।

क्या आपको वाकई यकीन है कि हुक फ़ंक्शन को चाल ईवेंट के बाद कहा जाता है?यदि आप अपने हुक फ़ंक्शन के भीतर विशेष हैंडल पर GetWindowRect कॉल करते हैं, तो क्या लौटा आयत आयताकार के बराबर आयत के बराबर होता है?

+0

'HCBT_MOVESIZE' के साथ क्या होता है यह है कि उपयोगकर्ता विंडो खींचने, इसे खींचने के लिए शुरू कर सकता है, और खिड़की जाने से पहले अधिसूचना नहीं पहुंचती है। फिर भी, खिड़की तकनीकी रूप से स्थानांतरित होने से पहले आपको अधिसूचना मिलती है, लेकिन यह अभी भी बहुत बेकार है। –

1

हुक बहुत भारी हैं। जब आप पूरी तरह से करना चाहते हैं तो आप केवल उनका उपयोग करना चाहते हैं।

उस ने कहा, आप प्रक्रिया में शामिल होने के लिए बस एक मूल हुक का उपयोग कर सकते हैं। प्रक्रिया में एक बार, आप जिस विंडो में रूचि रखते हैं उसे उप-वर्गित कर सकते हैं और हुक स्तर पर सबकुछ पकड़ने की बजाय अपने उप-वर्ग प्रोसेस में आकार देने वाले संदेशों को संभाल सकते हैं।

आकार बदलने के जवाब में आप जो करना चाहते हैं उसके आधार पर, आपको कुछ इंटरप्रोसेस संचार की आवश्यकता हो सकती है।

+0

सबक्लासिंग यहां जाने का तरीका प्रतीत होता है। हालांकि, विजुअल स्टूडियो हर समय दुर्घटनाग्रस्त हो जाता है जब मैं सबक्लासिंग के वास्तविक निष्कासन के माध्यम से कदम नहीं उठा रहा हूं। –

संबंधित मुद्दे