2009-05-02 9 views
6

मैं एक एप्लिकेशन को बढ़ाना चाहता हूं, लेकिन कोई 3: ई पार्टी एपीआई उपलब्ध नहीं है। तो मूल रूप से विचार विंडोज़ अनुप्रयोगों के शीर्ष पर ग्राफिक्स/टेक्स्ट खींचना है।किसी अन्य एप्लिकेशन के शीर्ष पर ग्राफिक्स/टेक्स्ट कैसे आकर्षित करें

जेड ऑर्डर, क्लिपिंग और माउस एप्लिकेशन को या तो मेरे एप्लिकेशन या अन्य एप्लिकेशन पर निर्देशित करने में समस्याएं हैं।

ऐसा करने का एक शानदार तरीका क्या है?

उदाहरण छवि यहाँ। यह एक व्यापारिक अनुप्रयोग है जहां मेरा आवेदन ट्रेडिंग एप्लिकेशन की खिड़कियों में अतिरिक्त जानकारी जोड़ना चाहता है। [यूआरएल = http://img104.imageshack.us/my.php?image=windowontop.png][/URL]

+0

तुम क्या आप क्या करना चाहते करने के लिए के रूप में और अधिक विशिष्ट हो सकता है के लिए DirectX के शीर्ष पर आकर्षित करने के लिए चाहते हो सकता है? किसी अन्य एप्लिकेशन की विंडो पर टेक्स्ट डालने और इसे वहां रहने के लिए, केवल बदसूरत तरीके से रखने का कोई शानदार तरीका नहीं है। लेकिन आप अपनी विशिष्ट स्थिति के आधार पर जो कुछ भी चाहते हैं उसे प्राप्त करने में सक्षम हो सकते हैं। –

+0

यह दिखाने के लिए छवि जोड़ा गया है कि मैं क्या करना चाहता हूं – s5804

उत्तर

7

ऐसा करने के लिए कोई अच्छा तरीके हैं, लेकिन एक दृष्टिकोण है कि आप के लिए काम कर सकते हैं एक GetMsgProc, जिसमें आपके ओवरले ड्रॉ जोड़ने के लिए SetWindowsHookEx (...) का उपयोग करते हुए प्रश्न में आवेदन हुक करने के लिए है WM_PAINT संदेशों की प्रतिक्रिया। मूल विचार यह है कि एप्लिकेशन अपने ड्राइंग को समाप्त करने के बाद आप अपने ग्राफिक्स को ठीक कर रहे हैं।

अपने मुख्य अनुप्रयोग में:

.... 
HMODULE hDllInstance = LoadLibrary("myFavoriteDll"); 
HOOKPROC pOverlayHook = (HOOKPROC)GetProcAddress(hDllInstance, "OverlayHook"); 
SetWindowsHookEx(WH_GETMESSAGE, pOverlayHook, hDllInstance, threadId); 

एक DLL कहीं में बंद:

LRESULT CALLBACK OverlayHook(int code, WPARAM wParam, LPARAM lParam) 
{ 
    //Try and be the LAST responder to WM_PAINT messages; 
    //Of course, if some other application tries this all bets are off 
    LRESULT retCode = CallNextHookEx(NULL, code, wParam, lParam); 

    //Per GetMsgProc documentation, don't do anything fancy 
    if(code < 0) return retCode; 

    //Assumes that target application only draws when WM_PAINT message is 
    //removed from input queue. 
    if(wParam == PM_NOREMOVE) return retCode; 

    MSG* message = (MSG*)lParam; 

    //Ignore everything that isn't a paint request 
    if(message->message != WM_PAINT) return retCode; 

    PAINTSTRUCT psPaint;  

    BeginPaint(message->hwnd, &psPaint); 
    //Draw your overlay here 
    ... 
    EndPaint(message->hwnd, &psPaint); 

    return retCode; 
} 

यह सब Win32 तो अपने सी # कोड पी हो जाएगा/भारी और तदनुसार काफी बदसूरत आह्वान है। आपका डीएलएल भी अप्रबंधित होना चाहिए (यदि आप अपने आप के अलावा किसी अन्य प्रक्रिया में इंजेक्ट करना चाहते हैं), यह एक भी नास्टियर समाधान बनाते हैं।

यह आपकी समस्या को ज़ेड-ऑर्डर और क्लिपिंग समस्याओं के साथ हल करेगा, क्योंकि आप विंडो में ही प्रतिपादन कर रहे हैं। हालांकि, यदि आप जिस एप्लिकेशन को लक्षित कर रहे हैं, तो WM_PAINT चीजों का जवाब देने वाले WinProc के बाहर कोई भी चित्र अलग हो जाता है; यह एक पूरी तरह से असामान्य अवसर नहीं है।

0

z आदेश, कतरन के साथ समस्याओं कर रहे हैं, और माउस निर्देशन या तो क्लिक करता है अपने आवेदन या अन्य आवेदन करने के लिए।

ये सभी कार्य हैं जिनसे विंडो प्रबंधक को निपटने के लिए डिज़ाइन किया गया था। आपको ऐप्स की विंडो के शीर्ष पर एक स्तरित विंडो बनाना चाहिए।

यह भी देखें: Prevent repainting of window in C++

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