অনুমোদিত নোটিশ: আমি এই উত্তরে উল্লিখিত সফটওয়্যারটির লেখক।
প্রথমত, আমি আপনাকে জানতে চাই যে আমি এই প্রশ্নের জন্য 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_SYSTEM
mii.dwItemData
MENUITEMINFO
LR_LOADTRANSPARENT
LoadImageA
আপনি যদি চিত্র লোডিংয়ের ক্ষেত্রে সমস্যা অনুভব LR_DEFAULTSIZE
করেন, LoadImageA
কলগুলি থেকে পতাকাটি সরানোর চেষ্টা করুন ।
সি ++ এ যথেষ্ট দক্ষ কেউ কেউ সম্ভবত অন্য ডিএলএলগুলির মধ্যে থেকে সম্পদ দখল করে সেগুলিতে রূপান্তর করতে পারে HBITMAP
তবে কেউ আমার নয়।
এটি সংশোধন করা হচ্ছে
আমি এটি ভিজ্যুয়াল স্টুডিওতে লিখেছি, যা আমি উইন্ডোজ সি ++ এর জন্য সেরা সম্পাদক হিসাবে বিশ্বাস করি।
আপনি সি ++ সরঞ্জাম ইনস্টল করার পরে এসএলএন ফাইলটি ভিজ্যুয়াল স্টুডিও 2015 এ লোড করুন। ইন IconInjector.cpp
, আপনি HBITMAP
শীর্ষে এন্ট্রি যুক্ত করতে এবং নতুন আইকন যুক্ত করতে LoadImageA
কল Initialize
করতে পারেন। else if
বিভাগে নিচে , wcscmp
একটি সঠিক ম্যাচ wcsstr
সন্ধানের জন্য কল বা একটি স্ট্রিংয়ের উপস্থিতি সন্ধানের জন্য একটি কল ব্যবহার করুন। উভয় ক্ষেত্রেই, &
Shift + F10 ব্যবহার করার সময় আন্ডারলাইন / এক্সিলারারের অবস্থান উপস্থাপন করে। আপনার মোড এবং আপনার আর্কিটেকচারকে x64 এ সেট করুন এবং বিল্ড → বিল্ড সলিউশন করুন । আউটপুট নিবন্ধন করতে ব্যর্থ হওয়া সম্পর্কে আপনি একটি ত্রুটি পাবেন, তবে চিন্তা করবেন না; আপনি যেকোন উপায়ে নিজেই এটি করতে চাইবেন। শেষ এক্সপ্লোরার, নতুন ডিএলএল ( \x64\Release\ContextIcons.dll
সমাধান ফোল্ডারে) জায়গায় অনুলিপি করুন , তারপরে regsvr32
নাচ করুন।
গুণাবলী
এমএসডিএন লেখকদের এবং " শেল এক্সটেনশনের লেখার জন্য সম্পূর্ণ ইডিয়টস গাইড " এর স্রষ্টাকে অনেক ধন্যবাদ , যা আমি প্রচুর উল্লেখ করেছি।
শংসাপত্র
এই শেল এক্সটেনশানটির উত্পাদনে যে অনেক এক্সপ্লোরার উদাহরণ মারা গিয়েছিল: আপনি একটি দুর্দান্ত কারণে মারা গেছেন, ইন্টারনেটের কিছু লোকের শব্দের পাশে আইকন থাকতে পারে।