উইন্ডোজ ডিফল্ট প্রসঙ্গ মেনু আইটেমগুলি "অনুলিপি / কাটা / আটকান / মুছুন" এর জন্য একটি আইকন কীভাবে অর্পণ করবেন?


12

উইন্ডোজ 8 / 8.1 x64 এর অধীনে, আমি ডিফল্ট উইন্ডোজ প্রসঙ্গ মেনু আইটেম যেমন কপি , কাট , আটকানো , মুছুন , পূর্বাবস্থায় ফিরিয়ে আনুন , পুনরায় এবং আইটেমগুলিতে প্রেরণ করুন , যার ডিফল্টরূপে কোনও আইকন রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

যেখানে আমি রেজিস্ট্রিতে সেই কনটেক্সট মেনু আইটেমগুলিতে "রেফারেন্স" সনাক্ত করতে পারি তবে তাদের জন্য একটি "আইকন" রেজিস্ট্রি মান যুক্ত করতে পারি?

বা অন্য কথায়, সেন্ডো শেলপ্লেক্সের মতো শেল এক্সটেনশান মেনুতে আইকনটি কীভাবে বরাদ্দ করা যায় ?.

গবেষণা


@ Sk8erPeter দ্বারা মন্তব্য করা হয়েছে বলে মনে হয়:

" Iconবিভিন্ন প্রসঙ্গ মেনু হ্যান্ডলারগুলিতে স্ট্রিংয়ের মান যুক্ত করা যেমন কোনও কাস্টম আইটেমে যুক্ত করার মতো কাজ করে না যেমন যেমন HKEY_CLASSES_ROOT\*\shell\MYCUSTOMKEY"


আপনি কোন আইকন উল্লেখ করছেন? আপনার স্ক্রিনশট আছে?
রায়স্টাফেরিয়ান

@ রায়স্তফেরিয়ান আমি একটি চিত্র দিয়ে প্রশ্ন আপডেট করেছি।
এলেক্ট্রো স্টুডিওগুলি

1
@ রায়স্তাফেরিয়ান: প্রশ্নটি কীভাবে বিদ্যমান কাট "কট" , "অনুলিপি" , "মুছুন" , "পুনর্নামকরণ" ইত্যাদি বুনিয়াদি প্রসঙ্গ মেনু আইটেমগুলিতে কাস্টম আইকন যুক্ত করবেন বিটিডব্লিউ যখন প্রসঙ্গ মেনুতে একটি নতুন কাস্টম আইটেম যুক্ত করবেন, এটি খুব সহজ, কারণ আপনাকে কেবল Iconএকটি কীতে স্ট্রিং মান যুক্ত করতে হবে HKEY_CLASSES_ROOT\*\shell\MYCUSTOMITEM(এবং এর মান Iconযেমন উদাহরণস্বরূপ %SystemRoot%\System32\shell32.dll,-133বা স্যাজ। এর মতো হবে)। কিন্তু Iconস্ট্রিংয়ের মানটি বিভিন্ন প্রসঙ্গের মেনু হ্যান্ডলারগুলিতে যুক্ত করা এই কাস্টম আইটেমগুলিতে যুক্ত করার মতো কাজ করে না
Sk8erPeter

এটি পরিষ্কার করার জন্য এখানে আরও একটি স্ক্রিনশট রয়েছে (আকর্ষণীয় অংশটি লাল সীমানায় রয়েছে): i.imgur.com/fmewg6L.png । বিটিডাব্লু যেমন আপনি দেখতে পাচ্ছেন, আমার কাছে কাস্টম আইকনগুলির সাথে প্রসঙ্গ মেনুতে কিছু কাস্টম আইটেম রয়েছে (যেমন "নোটপ্যাড ++ সহ খুলুন ) - এটি বিদ্যমান সিস্টেমের প্রসঙ্গে প্রসঙ্গ মেনু আইটেমগুলির সাথে আমরা অর্জন করতে চাই!
Sk8erPeter

1
@ Sk8erPeter এই মুহুর্তে আমার সেরা সীসা হ'ল শেল প্রসঙ্গে মেনু হ্যান্ডলার তৈরির সম্ভাবনা যা SetMenuItemInfoপ্রতিক্রিয়া হিসাবে ব্যবহার করে QueryContextMenu
বেন এন

উত্তর:


10

অনুমোদিত নোটিশ: আমি এই উত্তরে উল্লিখিত সফটওয়্যারটির লেখক।

প্রথমত, আমি আপনাকে জানতে চাই যে আমি এই প্রশ্নের জন্য C ++ এবং Win32 শিখেছি ।

আমি একটি 64-বিট শেল এক্সটেনশন তৈরি করেছি যা প্রসঙ্গ মেনু হ্যান্ডলার হিসাবে নিবন্ধিত হয়। যখন এটি আহ্বান করা হয়, এটি আকর্ষণীয় এন্ট্রিগুলির জন্য সন্ধান করে বিদ্যমান মেনু আইটেমগুলিতে গুজব ছড়িয়ে দেয়। যদি এটির কোনও সন্ধান হয় তবে এটি এতে একটি আইকন ধরে থাকে (যা অবশ্যই আগে লোড করা উচিত)। এই মুহুর্তে, এটি অনুলিপি , কাটা , মুছুন , পেস্ট করুন , আবার করুন , প্রেরণ করুন এবং পূর্বাবস্থায় সন্ধান করুন । আপনি কোডটি সংশোধন করে নিজের যুক্ত করতে পারেন; এর জন্য পদ্ধতিটি নীচে বর্ণিত হয়েছে। (দুঃখিত, এটি কনফিগারযোগ্য করার জন্য আমি সি ++ তে যথেষ্ট ভাল নই))

কর্মের মধ্যে এটির একটি স্ক্রিনশট, কুরুচিপূর্ণ আইকনগুলি মানুষের সাথে পরিচিত:

কর্মে

আপনি যদি সত্যিই চান তবে এই আইকনগুলি ডাউনলোড করতে পারেন।

সেট আপ করা হচ্ছে

এটি ডাউনলোড করুন (আমার ড্রপবক্স থেকে)। বিজ্ঞপ্তি : এই ফাইলটি একজন ভাইরাস টোটাল স্ক্যানার দ্বারা ম্যালওয়্যারের কিছু রূপ হিসাবে সনাক্ত করা হয়েছে । এটি বিদ্যমান বোধগম্যদের ধাক্কা দেওয়ার জন্য যে ধরণের কাজ করতে হয় তা বোধগম্য। আমি আপনাকে আমার কথাটি দিচ্ছি এটি আপনার কম্পিউটারের উদ্দেশ্যমূলক ক্ষতি করে না। আপনি যদি সন্দেহজনক হন এবং / অথবা আপনি এটি সংশোধন ও প্রসারিত করতে চান, গিটহাবের কোডটি দেখুন !

আপনার সি ড্রাইভে একটি ফোল্ডার তৈরি করুন: C:\shellicon। নিম্নলিখিত শিরোনাম দিয়ে বিএমপি ফাইল তৈরি করুন: copy, cut, delete, paste, redo, sendto, undo। (আশা করি এটি স্পষ্ট যে কোনটি কোনটি করে। আপনি যদি আইকনগুলি স্বচ্ছ দেখতে চান তবে আপনাকে কেবল তাদের ব্যাকগ্রাউন্ডটি প্রসঙ্গ মেনুর মতোই রঙ করতে হবে। (এই কৌশলটি ড্রপবক্সের দ্বারাও নিযুক্ত করা হয়েছে)) এমএস পেইন্টের সাহায্যে আমি আমার ভয়ঙ্কর আইকনগুলি তৈরি করেছি; অন্যান্য প্রোগ্রামগুলির সাথে সামঞ্জস্যপূর্ণ পদ্ধতিতে সঞ্চয় বা নাও হতে পারে LoadImageAইঞ্চি প্রতি 96-পিক্সেলের 24-বিট রঙ গভীরতায় 16 বাই 16 ইমেজ বৈশিষ্ট্যের সবচেয়ে নির্ভরযোগ্য সেট বলে মনে হচ্ছে।

সমস্ত ব্যবহারকারীর জন্য ডিএলএলকে কোথাও অ্যাক্সেসযোগ্য রাখুন, আপনি যে ফোল্ডারটি সবে তৈরি করেছেন এটি একটি ভাল পছন্দ। ডিএলএলযুক্ত ফোল্ডারে একটি প্রশাসক প্রম্পট খুলুন এবং করুন regsvr32 ContextIcons.dll। এই শেল ধরনের জন্য রেজিস্ট্রেশন তথ্য সৃষ্টি *, Drive, Directory, এবং Directory\Background। আপনি যদি কখনও শেল এক্সটেনশানটি সরাতে চান তবে করুন regsvr32 /u ContextIcons.dll

প্রাসঙ্গিক কোড

মূলত, এক্সটেনশানটি প্রতিটি প্রসঙ্গ মেনু আইটেমের GetMenuItemInfoপাঠ্যটির সাথে সন্ধান করে এবং, যদি উপযুক্ত হয় তবে আইকনটি সামঞ্জস্য করে SetMenuItemInfo

ভিজুয়াল স্টুডিও এটিএল প্রকল্পগুলির জন্য প্রচুর যাদু রহস্যজনক কোড উত্পন্ন করে , তবে এটি এর লিখিত সামগ্রী IconInjector.cppযা প্রসঙ্গ মেনু হ্যান্ডলারটি কার্যকর করে:

// IconInjector.cpp : Implementation of CIconInjector

#include "stdafx.h"
#include "IconInjector.h"
#include <string>

// CIconInjector

HBITMAP bmpCopy = NULL;
HBITMAP bmpCut = NULL;
HBITMAP bmpUndo = NULL;
HBITMAP bmpRedo = NULL;
HBITMAP bmpSendto = NULL;
HBITMAP bmpDel = NULL;
HBITMAP bmpPaste = NULL;
STDMETHODIMP CIconInjector::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID) {
    // Load the images
    bmpCopy = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\copy.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
    bmpCut = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\cut.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
    bmpUndo = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\undo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
    bmpRedo = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\redo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
    bmpSendto = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\sendto.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
    bmpDel = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\delete.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
    bmpPaste = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\paste.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
    int err = GetLastError();
    return S_OK;
}
STDMETHODIMP CIconInjector::QueryContextMenu(HMENU hmenu, UINT uMenuIndex, UINT uidFirst, UINT uidLast, UINT flags) {
    using namespace std;
    if (flags & CMF_DEFAULTONLY) return S_OK; // Don't do anything if it's just a double-click
    int itemsCount = GetMenuItemCount(hmenu);
    for (int i = 0; i < itemsCount; i++) { // Iterate over the menu items
        MENUITEMINFO mii;
        ZeroMemory(&mii, sizeof(mii));
        mii.cbSize = sizeof(mii);
        mii.fMask = MIIM_FTYPE | MIIM_STRING;
        mii.dwTypeData = NULL;
        BOOL ok = GetMenuItemInfo(hmenu, i, TRUE, &mii); // Get the string length
        if (mii.fType != MFT_STRING) continue;
        UINT size = (mii.cch + 1) * 2; // Allocate enough space
        LPWSTR menuTitle = (LPWSTR)malloc(size);
        mii.cch = size;
        mii.fMask = MIIM_TYPE;
        mii.dwTypeData = menuTitle;
        ok = GetMenuItemInfo(hmenu, i, TRUE, &mii); // Get the actual string data
        mii.fMask = MIIM_BITMAP;
        bool chIcon = true;
        if (wcscmp(menuTitle, L"&Copy") == 0) {
            mii.hbmpItem = bmpCopy;
        }
        else if (wcscmp(menuTitle, L"Cu&t") == 0) {
            mii.hbmpItem = bmpCut;
        }
        else if (wcscmp(menuTitle, L"&Paste") == 0) {
            mii.hbmpItem = bmpPaste;
        } 
        else if (wcscmp(menuTitle, L"Se&nd to") == 0) {
            mii.hbmpItem = bmpSendto;
        }
        else if (wcsstr(menuTitle, L"&Undo") != NULL) {
            mii.hbmpItem = bmpUndo;
        }
        else if (wcsstr(menuTitle, L"&Redo") != NULL) {
            mii.hbmpItem = bmpRedo;
        }
        else if (wcscmp(menuTitle, L"&Delete") == 0) {
            mii.hbmpItem = bmpDel;
        }
        else {
            chIcon = false;
        }
        if (chIcon) SetMenuItemInfo(hmenu, i, TRUE, &mii);
        free(menuTitle);
    }
    return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0); // Same as S_OK (= 0) but is The Right Thing To Do [TM]
}
STDMETHODIMP CIconInjector::InvokeCommand(LPCMINVOKECOMMANDINFO info) {
    return S_OK;
}
STDMETHODIMP CIconInjector::GetCommandString(UINT_PTR, UINT, UINT*, LPSTR, UINT) {
    return S_OK;
}

নোট করুন যেগুলি HBITMAPকখনই পরিষ্কার হয় না, তবে এক্সপ্লোরার বন্ধ হয়ে গেলে ডিএলএল এর জিনিসগুলি চলে যাবে এ বিষয়টি খুব বেশি গুরুত্ব দেয় না। আইকনগুলি সবেমাত্র যে কোনও স্মৃতি গ্রহণ করে।

যদি আপনি 32-বিটের জন্য সংকলন করেন তবে প্রথম প্যারামিটারটি GetCommandStringকেবল একটি এর UINTপরিবর্তে UINT_PTR

আপনি যদি সত্যই স্বচ্ছ আইকন চান, আপনাকে এমএসডিএন নিবন্ধের নীচে বর্ণিত হিসাবে পছন্দসই আইকন সহ একটি উইন্ডো তৈরি করতে হবে এবং তারপরে উইন্ডোটিতে হ্যান্ডেলটি সেট এবং সেট mii.hBmpItemকরতে হবে । শেল এক্সটেনশানগুলি থেকে কীভাবে উইন্ডোজ তৈরি করা যায় তা আমি বুঝতে সক্ষম হয়েছি। এর পতাকা হিসাবে প্রতিশ্রুতিবদ্ধ দেখায় , তবে এর নিজস্ব ক্ষতি রয়েছে - বিশেষত, আপনি 256-বর্ণের বিটম্যাপ ব্যবহার না করে কাজ করছেন না।HBMMENU_SYSTEMmii.dwItemDataMENUITEMINFOLR_LOADTRANSPARENTLoadImageA

আপনি যদি চিত্র লোডিংয়ের ক্ষেত্রে সমস্যা অনুভব LR_DEFAULTSIZEকরেন, LoadImageAকলগুলি থেকে পতাকাটি সরানোর চেষ্টা করুন ।

সি ++ এ যথেষ্ট দক্ষ কেউ কেউ সম্ভবত অন্য ডিএলএলগুলির মধ্যে থেকে সম্পদ দখল করে সেগুলিতে রূপান্তর করতে পারে HBITMAPতবে কেউ আমার নয়।

এটি সংশোধন করা হচ্ছে

আমি এটি ভিজ্যুয়াল স্টুডিওতে লিখেছি, যা আমি উইন্ডোজ সি ++ এর জন্য সেরা সম্পাদক হিসাবে বিশ্বাস করি।

আপনি সি ++ সরঞ্জাম ইনস্টল করার পরে এসএলএন ফাইলটি ভিজ্যুয়াল স্টুডিও 2015 এ লোড করুন। ইন IconInjector.cpp, আপনি HBITMAPশীর্ষে এন্ট্রি যুক্ত করতে এবং নতুন আইকন যুক্ত করতে LoadImageAকল Initializeকরতে পারেন। else ifবিভাগে নিচে , wcscmpএকটি সঠিক ম্যাচ wcsstrসন্ধানের জন্য কল বা একটি স্ট্রিংয়ের উপস্থিতি সন্ধানের জন্য একটি কল ব্যবহার করুন। উভয় ক্ষেত্রেই, &Shift + F10 ব্যবহার করার সময় আন্ডারলাইন / এক্সিলারারের অবস্থান উপস্থাপন করে। আপনার মোড এবং আপনার আর্কিটেকচারকে x64 এ সেট করুন এবং বিল্ডবিল্ড সলিউশন করুন । আউটপুট নিবন্ধন করতে ব্যর্থ হওয়া সম্পর্কে আপনি একটি ত্রুটি পাবেন, তবে চিন্তা করবেন না; আপনি যেকোন উপায়ে নিজেই এটি করতে চাইবেন। শেষ এক্সপ্লোরার, নতুন ডিএলএল ( \x64\Release\ContextIcons.dllসমাধান ফোল্ডারে) জায়গায় অনুলিপি করুন , তারপরে regsvr32নাচ করুন।

গুণাবলী

এমএসডিএন লেখকদের এবং " শেল এক্সটেনশনের লেখার জন্য সম্পূর্ণ ইডিয়টস গাইড " এর স্রষ্টাকে অনেক ধন্যবাদ , যা আমি প্রচুর উল্লেখ করেছি।

শংসাপত্র

এই শেল এক্সটেনশানটির উত্পাদনে যে অনেক এক্সপ্লোরার উদাহরণ মারা গিয়েছিল: আপনি একটি দুর্দান্ত কারণে মারা গেছেন, ইন্টারনেটের কিছু লোকের শব্দের পাশে আইকন থাকতে পারে।


কি দারুন! আমি আপনার প্রচেষ্টা সত্যিই প্রশংসা করি, আপনাকে অনেক ধন্যবাদ! (+1) আমি যথাসাধ্য চেষ্টা করেছি তবে উইন্ডোজ 10 (বিল্ড 10240) এ সংকলিত সংস্করণটি তৈরি করতে পারিনি। সমস্যাটি কী তা আমি জানি না, সমস্ত বিএমপি চিত্রগুলি সঠিক পথে উপস্থিত রয়েছে ( C:\shellicon\copy.bmpইত্যাদি - এগুলি বিএমপি ফর্ম্যাটে 20x20 পিক্সেল আইকন) এবং আমি dll কে কমান্ড প্রম্পটে অ্যাডমিন হিসাবে regsvr32 ContextIcons.dllসফলভাবে চালিত করেছি, তবে আমি প্রসঙ্গ মেনুতে কোনও পরিবর্তন দেখতে পাচ্ছি না। এমনকি আমি কম্পিউটারটি পুনরায় চালু করেছি, নিবন্ধভুক্ত এবং আবার dllটিকে নিবন্ধভুক্ত করেছি, কিন্তু কোনও পরিবর্তন হয়নি। আমি ভিএস ২০১৫ এ উত্সটি সংকলনের চেষ্টা করছি!
Sk8erPeter

@ Sk8erPeter MSDN বলেছে যে আইকনগুলি 16x16 হওয়া দরকার, তবে 20x20 আমার পক্ষে কাজ করে। হতে পারে উইন্ডোজ 10 এর 16x16 দরকার? নোট করুন যে পরিবর্তনগুলি কার্যকর করতে আপনাকে এক্সপ্লোরার পুনরায় চালু করতে হবে।
বেন এন

2
@ Sk8erPeter অবশ্যই, আপনি এখানে যান । আমি গিটহাবে কোড স্থাপনের বিষয়ে দেখব। উইন্ডোজ 10 এখন ডাউনলোড করার কাজ করছে ...
বেন এন

2
আপনি এটি বিশ্বাস করবেন না ... এটি আপনার চিত্রের সাথে কাজ করে! : ডি: ডি এর অর্থ আমার কাছে কিছু বিএমপি ফাইল রয়েছে যা উইন্ডোজ হ্যান্ডেল করতে পারেনি, জানেন না কেন (পরে আমি এটিও পরীক্ষা করব)। যাইহোক, আপনাকে অনেক ধন্যবাদ, আপনার কোডটি সত্যিই সমস্যার সমাধান করে! :)
Sk8erPeter

1
@ বেএন: ঠিক আছে, ধন্যবাদ! :) এটি কিছুটা সুবিধাজনক হতে পারে। বিটিডব্লিউ এর মধ্যে আমি বুঝতে পেরেছিলাম যে আমি যদি পূর্বের কাজকর্মের চিত্রগুলি কিংবদন্তি পেইন্টে খুলি এবং আমি একটি "সংরক্ষণ করুন"> "24-বিট বিটম্যাপ (.bmp; .ডিপ)" করি (সুতরাং এটি একটি বিএমপি ফাইলে সংরক্ষণ করুন) আবার), এবং আমি এই নতুন ফাইলটিকে উত্স চিত্র হিসাবে ব্যবহার করি, এটি কাজ করে। অবশ্যই, বিটম্যাপের আকার হুবহু 16x16 পিক্সেল হতে হবে। সুতরাং পেইন্টটি প্রত্যাশিত বিটম্যাপ ফর্ম্যাটটি তৈরি করে যা পিক্সেল প্রতি 24 বিট (16.7 মিলিয়ন রঙ), 96x96 ডিপিআই এবং আকারে 16x16 পিক্সেল। পূর্বে আমি ইরফানভিউতে .png ফাইলগুলিকে .bmp ফাইলগুলিতে রূপান্তর ও আকার পরিবর্তন করেছি, এই আইকনগুলি কার্যকর হয়নি।
Sk8erPeter

1

আমার কাছে কোনও মন্তব্য করার মতো যথেষ্ট প্রতিনিধি নেই তবে এটি শেল 32.dll এর মধ্যে এই তথ্যটি অন্তর্ভুক্ত রয়েছে বলে মনে হয়। ফাইলগুলি সংকলন করা হয়েছে যাতে এটিতে কী কী কার্যকারিতা রয়েছে তা দেখা মুশকিল, তবে এটি এক হিসাবে উপস্থিত বলে মনে হয়।

আগ্রহের (রেজিস্ট্রি এক্সপোর্ট):

HKEY_CLASSES_ROOT \ CLSID {3ad05575-8857-4850-9277-11b85bdb8e09}

(ডিফল্ট) আরইজিএসজেড অনুলিপি / মুভ / পুনর্নবীকরণ / মুছুন / লিংক অবজেক্ট

অ্যাপিডিড আরইজিএসজেড {3 এড05575-8857-4850-9277-11b85bdb8e09}

স্থানীয়করণের স্ট্রিং REG_EXPAND_SZ @% সিস্টেমরুট % \ system32 \ শেল 32.dll, -50176

InProcServer32 কী এর অধীনে এটি শেল 32.dll উল্লেখ করে। প্রাসঙ্গিক শব্দগুলির নাম সহ আরও কয়েকটি দম্পতি রয়েছে। সম্ভবত আগ্রহের বিষয়গুলি হ'ল উইন্ডোজ.স্টোর.ডিল


1
চমকপ্রদ তথ্য. তবে এটি কোনও উত্তর না বলে মন্তব্য বলে মনে হচ্ছে। আপনার কাছে এখন সর্বত্র মন্তব্য করার যথেষ্ট প্রতিবেদন রয়েছে :)
বেন এন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.