加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
shellex_cmdDef.cpp 18.10 KB
一键复制 编辑 原始数据 按行查看 历史
AlongsCode 提交于 2023-02-11 03:21 . 提升兼容性,防止命名污染
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
#include "include_shellex_header.h"
#include <commctrl.h>
#include<string>
#pragma comment(lib, "comctl32.lib")
#include"elib/fnshare.h"
//此代码类似易中的通用组件框6.0
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#define WM_ELEBIL 0x8075u
#define TooltipClassName "tooltips_class32"
static HWND Thwnd = NULL;
typedef struct tagTOOLINFOWT {
UINT cbSize;
UINT uFlags;
HWND hwnd;
UINT_PTR uId;
RECT rect;
HINSTANCE hinst;
LPWSTR lpszText;
LPARAM lParam;
} TTTOOLINFOWT, NEAR* PTOOLINFOWT, * LPTTTOOLINFOWT;
typedef tagTOOLINFOWT MYTOOL;
static bool AddTooltip(HWND hwndControl, const std::wstring& tooltipText, bool bubbleStyle, bool tooltipPosition)
{
// 初始化控件
INITCOMMONCONTROLSEX init = { sizeof(init), ICC_BAR_CLASSES | ICC_TAB_CLASSES };
InitCommonControlsEx(&init);
// 定义窗口风格
DWORD dwStyle;
if (bubbleStyle) // 如果是气泡风格
dwStyle = TTS_BALLOON | TTS_ALWAYSTIP | TTS_NOPREFIX | TTS_USEVISUALSTYLE;// 则使用气泡、一直显示、不显示前缀的窗口风格
else // 否则
dwStyle = TTS_ALWAYSTIP | TTS_NOPREFIX | TTS_USEVISUALSTYLE;// 使用一直显示、不显示前缀的窗口风格
HMODULE hModule = GetModuleHandleW(0); // 获取当前程序的模块句柄
if (!Thwnd) // 如果 Thwnd 为 NULL
{
// 创建工具提示窗口
Thwnd = CreateWindowExW(0, L"tooltips_class32", 0, dwStyle,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
0, 0, hModule, 0);
}
MYTOOL ti = { 0 }; // 初始化工具信息结构体
ti.cbSize = sizeof(MYTOOL); // 设置结构体大小
ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS; // 设置窗口标识和子类化标志
ti.uId = (LONG_PTR)hwndControl; // 设置控件句柄
ti.hwnd = hwndControl;
ti.hinst = hModule; // 设置模块句柄
ti.lpszText = const_cast<wchar_t*>(tooltipText.c_str());; // 设置工具提示文本
if (tooltipPosition) // 如果显示在中间
ti.uFlags |= TTF_CENTERTIP; // 则设置居中显示标志
else
ti.uFlags |= TTF_ABSOLUTE; // 跟随鼠标
// 将工具信息添加到工具提示窗口
SendMessageW(Thwnd, TTM_TRACKPOSITION, 0, (LPARAM)&ti);
// 返回是否成功添加工具提示
// 跟踪工具提示的位置
return SendMessageW(Thwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti);
}
static std::wstring WIN_A2W(const std::string& str)
{
int widesize = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
if (GetLastError() == ERROR_NO_UNICODE_TRANSLATION)
{
throw std::exception("Invalid UTF-8 sequence.");
}
if (widesize == 0)
{
throw std::exception("Error in conversion.");
}
wchar_t* resultstring = new wchar_t[widesize];
int convresult = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, resultstring, widesize);
if (convresult != widesize)
{
throw std::exception("La falla!");
}
std::wstring wstrReturn(resultstring);
delete[] resultstring;
return wstrReturn;
}
// 调用格式: SDT_BOOL 添加提示, 命令说明: "创建一个提示标签。"
// 参数<1>: 控件句柄 SDT_INT, 参数说明: "需要添加提示标签的控件的句柄。"
// 参数<2>: 提示文本 SDT_TEXT, 参数说明: "提示标签上显示的文字,如果要显示多行,请加上#换行符。"
// 参数<3>: 是否为气泡型 SDT_BOOL, 参数说明: "comctl32.dll版本必须≥v5.8,以第一次调用为准,因为所有提示都相同,不能分开定义。"
// 参数<4>: 提示工具位置 SDT_BOOL, 参数说明: "为真表示总显示在控件的中下方,为假表示跟随鼠标。"
SHELLEX_EXTERN_C void shellex_AddTooltip_0_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
INT arg1 = pArgInf[0].m_int;
LPSTR arg2 = pArgInf[1].m_pText;
BOOL arg3 = pArgInf[2].m_bool;
BOOL arg4 = pArgInf[3].m_bool;
if (arg1 && IsWindow((HWND)arg1))//窗口句柄存在
{
if (pArgInf[1].m_dtDataType == SDT_TEXT)
{
pRetData->m_bool = AddTooltip((HWND)arg1, pArgInf[1].m_pText ? WIN_A2W(pArgInf[1].m_pText) : L"", arg3, arg4);
}
else if (pArgInf[1].m_dtDataType == SDT_BIN)
{
std::wstring wc = L"";
if (pArgInf[1].m_pBin)
{
size_t lenth = *(((int*)pArgInf[1].m_pBin) + 1);
if (lenth)
{
wc = std::wstring((WCHAR*)(((int*)pArgInf[1].m_pBin) + 2), lenth);
}
}
pRetData->m_int = AddTooltip((HWND)arg1, wc, arg3, arg4);
}
else
{
pRetData->m_int = 0;
}
}
else {
pRetData->m_int = 0;
}
}
// 调用格式: _SDT_NULL 删除提示, 命令说明: "删除一个控件的提示标签。"
// 参数<1>: 控件句柄 SDT_INT, 参数说明: "需要删除提示标签的控件的句柄。"
SHELLEX_EXTERN_C void shellex_DelTooltip_1_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
HWND hwnd = (HWND)pArgInf[0].m_int;
if (hwnd && IsWindow((HWND)hwnd))//窗口句柄合法
{
MYTOOL toolInfo = { 0 };
toolInfo.cbSize = sizeof(toolInfo);
toolInfo.hwnd = hwnd;
toolInfo.uId = (UINT_PTR)hwnd;
SendMessageW(Thwnd, TTM_DELTOOLW, 0, (LPARAM)&toolInfo);
}
}
// 调用格式: _SDT_NULL 设置显示延迟时间, 命令说明: "设置提示框延迟显示的时间,也是就鼠标放上去多长时间显示。"
// 参数<1>: 延迟时间 SDT_INT, 参数说明: "默认显示时间,-1则为不延迟,立马显示。"
SHELLEX_EXTERN_C void shellex_SetDelayDisplay_14_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
int delaytime = pArgInf[0].m_int;
SendMessageW(Thwnd, TTM_SETDELAYTIME, TTDT_INITIAL, delaytime);
}
// 调用格式: _SDT_NULL 置提示文本, 命令说明: "设置指定控件的提示文本。"
// 参数<1>: 控件句柄 SDT_INT, 参数说明: "需要修改提示标签的控件的句柄。"
// 参数<2>: 提示文本 SDT_TEXT, 参数说明: "新的提示标签的文本。"
SHELLEX_EXTERN_C void shellex_SetTooltipText_2_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
INT arg1 = pArgInf[0].m_int;
LPSTR arg2 = pArgInf[1].m_pText;
HWND hwnd = (HWND)pArgInf[0].m_int;
if (arg1 && IsWindow((HWND)arg1))//窗口句柄存在
{
std::wstring str;
if (pArgInf[1].m_dtDataType == SDT_TEXT)
{
str = pArgInf[1].m_pText ? WIN_A2W(pArgInf[1].m_pText) : L"";
}
else if (pArgInf[1].m_dtDataType == SDT_BIN)
{
std::wstring wc = L"";
if (pArgInf[1].m_pBin)
{
size_t lenth = *(((int*)pArgInf[1].m_pBin) + 1);
if (lenth)
{
str = std::wstring((WCHAR*)(((int*)pArgInf[1].m_pBin) + 2), lenth);
}
}
}
MYTOOL ti = { 0 };
ti.cbSize = sizeof(MYTOOL);
ti.hwnd = (HWND)arg1;
ti.uId = (UINT_PTR)arg1;
ti.lpszText = const_cast<wchar_t*>(str.c_str());
SendMessageW(Thwnd, TTM_UPDATETIPTEXTW, 0, (LPARAM)&ti);
}
else {
pRetData->m_int = 0;
}
}
// 调用格式: _SDT_NULL 置提示底色, 命令说明: "设置所有控件的提示标签的背景颜色。"
// 参数<1>: 背景底色 SDT_INT, 参数说明: "新的提示标签的背景颜色,-1表示系统背景颜色。"
SHELLEX_EXTERN_C void shellex_SetTooltipBColor_3_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
INT arg1 = pArgInf[0].m_int;
COLORREF color;
if (pArgInf[0].m_int == -1)
color = GetSysColor(COLOR_INFOBK);
else
color = (COLORREF)pArgInf[0].m_int;
SendMessageW(Thwnd, TTM_SETTIPBKCOLOR, (WPARAM)color, 0);
}
// 调用格式: _SDT_NULL 置提示文本色, 命令说明: "设置所有控件的提示标签的文本颜色。"
// 参数<1>: 文本颜色 SDT_INT, 参数说明: "新的提示标签的文本颜色,-1表示系统文本颜色。"
SHELLEX_EXTERN_C void shellex_SetTooltipTColor_4_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
INT textColor = pArgInf[0].m_int;
// 如果 textColor 为 -1,则使用系统文本颜色
if (textColor == -1)
textColor = GetSysColor(COLOR_INFOTEXT);
// 使用 SendMessage 函数设置工具提示窗口的文本颜色
SendMessageW(Thwnd, TTM_SETTIPTEXTCOLOR, 0, textColor);
}
// 调用格式: _SDT_NULL 置提示时间, 命令说明: "设置所有控件的提示标签的显示时间。"
// 参数<1>: 显示时间 SDT_INT, 参数说明: "提示标签的显示时间,-1表示一直显示。"
SHELLEX_EXTERN_C void shellex_SetTooltipTime_5_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
INT displayTime = pArgInf[0].m_int;
//-设置工具提示窗口在工具边界矩形内固定时保持可见的时间量。 若要将自动填充延迟时间返回到其默认值,请将 lParam 设置为 -1。
SendMessageW(Thwnd, TTM_SETDELAYTIME, TTDT_AUTOPOP, displayTime);
}
// 调用格式: _SDT_NULL 置提示图标, 命令说明: "设置所有控件的提示标签的显示图标。"
// 参数<1>: 图标类型 SDT_INT, 参数说明: "提示标签的图标类型,0:无图标,1:信息,2:警告,3:错误,4,5,6:为123的大图标"
// 参数<2>: 图标标题文本 SDT_TEXT, 参数说明: "提示标签的图标标题文本,如果为空文本,则表示无图标。"
SHELLEX_EXTERN_C void shellex_SetTooltipIcon_6_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
INT iconType = pArgInf[0].m_int;
std::wstring str;
if (pArgInf[1].m_dtDataType == SDT_TEXT)
{
str = pArgInf[1].m_pText ? WIN_A2W(pArgInf[1].m_pText) : L"";
}
else if (pArgInf[1].m_dtDataType == SDT_BIN)
{
std::wstring wc = L"";
if (pArgInf[1].m_pBin)
{
size_t lenth = *(((int*)pArgInf[1].m_pBin) + 1);
if (lenth)
{
str = std::wstring((WCHAR*)(((int*)pArgInf[1].m_pBin) + 2), lenth);
}
}
}
SendMessageW(Thwnd, TTM_SETTITLEW, iconType, (LPARAM)str.c_str());
}
// 调用格式: SDT_INT 置提示字体, 命令说明: "设置所有控件的提示标签的字体。"
// 参数<1>: 窗口句柄 SDT_INT, 参数说明: "需要修改提示标签的窗口句柄。"
// 参数<2>: 提示字体 DTP_FONT, 参数说明: "需要设置的提示字体,注意角度属性无效。"
static HFONT SetTooltipFont(HWND hwndControl, bool isBold, bool isItalic, bool isStrikeOut, bool isUnderline, int fontSize, const char* fontFaceName)
{
DWORD lpSrc = 0;
HDC hdc = GetDC(hwndControl);
int cHeight = -MulDiv(fontSize, GetDeviceCaps(hdc, LOGPIXELSY), 72);
CHARSETINFO charsetInfo;
TranslateCharsetInfo(&lpSrc, &charsetInfo, TCI_SRCCODEPAGE);
//易里的字体类型名称是ansi
HFONT hFont = CreateFontA(cHeight, 0, 0, 0, isBold ? FW_BOLD : 0, isItalic, isUnderline, isStrikeOut, charsetInfo.ciCharset, 0, 0, PROOF_QUALITY, 0, fontFaceName);
SendMessageW(Thwnd, WM_SETFONT, (WPARAM)hFont, 1);
return hFont;
}
struct EFONT
{
INT no;
BOOL isBold;
BOOL isItalic;
BOOL isStrikeOut;
BOOL isUnderline;
INT FontSize;
CHAR* fontFaceName;
};
SHELLEX_EXTERN_C void shellex_SetTooltipFont_7_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
HWND arg1 = (HWND)pArgInf[0].m_int;
EFONT* arg2 = (EFONT*)pArgInf[1].m_pCompoundData;
pRetData->m_bool = (INT)SetTooltipFont(arg1, arg2->isBold, arg2->isItalic, arg2->isStrikeOut, arg2->isUnderline, arg2->FontSize, arg2->fontFaceName) != 0;
}
static HWND Droplabhwnds;//拖放标签句柄
static WNDPROC DropProcOld;
static void OnDropFiles(WPARAM wParam, HDROP hDrop)
{
UINT file_count = DragQueryFileA(hDrop, 0xFFFFFFFF, NULL, 0);
SendMessageA(Droplabhwnds, WM_ELEBIL, 0, file_count);//向标签控件时间发送第一次为文件数量
char file_name[MAX_PATH];
for (UINT i = 0; i < file_count; ++i)
{
DragQueryFileA(hDrop, i, file_name, MAX_PATH);
SendMessageA(Droplabhwnds, WM_ELEBIL, wParam, (LPARAM)file_name);//其后为文件名称,ansi
}
DragFinish(hDrop);//拖放结束
}
static void WINAPI Drag_WindowProc_shellex(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if (Msg == WM_DROPFILES)
OnDropFiles((WPARAM)hWnd, (HDROP)wParam);//拖放时
else
CallWindowProcA(DropProcOld, hWnd, Msg, wParam, lParam);//缺省为之前回调
}
LRESULT WINAPI shellEx__DragFile(HWND hWnd, HWND SetHwnd)
{
Droplabhwnds = SetHwnd;
DragAcceptFiles(hWnd, TRUE);
//获取缺省回调
DropProcOld = (WNDPROC)SetWindowLongPtrA(hWnd, GWLP_WNDPROC, (LONG_PTR)Drag_WindowProc_shellex);//64位PTR这里无所谓
return 0;
}
// 调用格式: SDT_BOOL 设置文件拖放, 命令说明: "将组件设置成拖放状态"
// 参数<1>: 标签句柄 SDT_INT, 参数说明: "使用标签的反馈事件来操作拖放后的功能,标签反馈事件传递过来的参数中参数一为拖放的控件句柄,参数二第一次为拖放的文件个数,而后为拖放的文件名"
// 参数<2>: 控件句柄 SDT_INT, 参数说明: "需要设置成拖放状态的组件的句柄"
SHELLEX_EXTERN_C void shellex_DragFiles_8_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
for (INT i = 1; i < nArgCount; i++)
{
if (!shellEx__DragFile((HWND)pArgInf[i].m_int, (HWND)pArgInf->m_int))
pRetData->m_bool = FALSE;
}
pRetData->m_bool = TRUE;
}
// 本命令被隐藏, 原始名字 = "设置树型框拖放"
// 调用格式: SDT_BOOL 设置树型框拖放, 命令说明: "将组件设置拖放"
// 参数<1>: 窗口句柄 SDT_INT, 参数说明: "树型框父窗口句柄"
// 参数<2>: 树型框句柄 SDT_INT, 参数说明: "需要设置成拖放状态的树型框的句柄"
// 参数<3>: 标签句柄 SDT_INT, 参数说明: "使用标签的反馈事件来操作拖放后的功能,标签反馈事件传递过来的参数中参数一为拖放的控件句柄,参数二第一次为拖放的文件个数,而后为拖放的文件名"
SHELLEX_EXTERN_C void shellex_DragTree_9_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
INT arg1 = pArgInf[0].m_int;
INT arg2 = pArgInf[1].m_int;
INT arg3 = pArgInf[2].m_int;
//命令已经隐藏
}
static int regcount = 0;//热键已注册数量,撤销不会改动,多线程是否考虑原子操作???目前想着不需要应为是窗口捕获,一般不会出现线程操作窗口
static int remcount = 0;//剩余数量,撤销时如果为0将包装在标签外的函数交还给标签
static int IDarry = 0;//热键标识
static HWND label_hwnd;//是否改为数组来让多标签支持?
static WNDPROC old_proc;//是否改为数组来让多标签支持?
static LRESULT WINAPI shellEx__RegWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// 当接收到消息类型为 WM_HOTKEY 时,执行循环遍历
if (uMsg == WM_HOTKEY)
{
for (int i = 33000; i <= IDarry; i++)//易里标识里从33000开始,不知道为什么怕冲突??
{
// 检查 传入参数 是否与 值 相等
if (i == wParam)//ID值
{
// 如果相等,则发送消息类型为 WM_COMMAND 的消息给 label_hwnd
SendMessageA(label_hwnd, WM_ELEBIL, wParam, 0);
}
}
}
// 调用原来的窗口过程函数
return CallWindowProcA(old_proc, hWnd, uMsg, wParam, lParam);
}
// hWnd: 窗口句柄
// labelhwnd: 标签句柄
// fsModifiers: 热键修饰符,例如按住 Alt、Ctrl、Shift 等
// vk: 热键对应的虚拟键值
// 返回值: 成功注册热键时返回热键 id,失败时返回 0
inline int RegisterHotkey(HWND hWnd, HWND labelhwnd, UINT fsModifiers, UINT vk)
{
// 将 fsModifiers 转换为 RegisterHotKey 函数所需的值
label_hwnd = labelhwnd;
switch (fsModifiers)
{
case 1: // Alt
fsModifiers = MOD_ALT;
break;
case 2: // Ctrl
fsModifiers = MOD_CONTROL;
break;
case 4: // Shift
fsModifiers = MOD_SHIFT;
break;
case 3: // Alt + Ctrl
fsModifiers = MOD_ALT | MOD_CONTROL;
break;
case 5: // Alt + Shift
fsModifiers = MOD_ALT | MOD_SHIFT;
break;
case 6: // Ctrl + Shift
fsModifiers = MOD_CONTROL | MOD_SHIFT;
break;
}
// 如果窗口还没有设置窗口过程,就将窗口过程设置为 shellEx__RegWindowProc
if (!old_proc)
old_proc = (WNDPROC)SetWindowLongPtrA(hWnd, GWLP_WNDPROC, (LONG_PTR)shellEx__RegWindowProc);//获取缺省回调,不太安全是否有方法修改
// 使用 Windows API 函数 RegisterHotKey 注册热键
//易里标识热键标识从33000开始算,第一个为33001以此类推
remcount++;//目前标签增加,这个撤销要去掉的
IDarry = ++regcount + 33000;//本次标识
if (RegisterHotKey(hWnd, regcount + 33000, fsModifiers, vk))
return IDarry;
else
return 0;
}
// 调用格式: SDT_INT 注册热键, 命令说明: "注册系统热键,返回一个热键标识,失败返回0。"
// 参数<1>: 窗口句柄 SDT_INT, 参数说明: "窗口句柄"
// 参数<2>: 标签句柄 SDT_INT, 参数说明: "使用标签的反馈事件来接受热键,反馈事件中的第一个参数为热键标识,第二个参数无效"
// 参数<3>: 功能键 SDT_INT, 参数说明: "可以为:0-无功能键;1-CTRL键状态;2-SHIFT键状态;4-ALT键状态或各键状态值之和"
// 参数<4>: 主热键 SDT_INT, 参数说明: "键代码,可以使用易语言中的键代码常量"
SHELLEX_EXTERN_C void shellex_RegHotKey_10_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
HWND arg1 = (HWND)pArgInf[0].m_int;
HWND arg2 = (HWND)pArgInf[1].m_int;
INT arg3 = pArgInf[2].m_int < 0 || pArgInf[2].m_int>6 ? 0 : pArgInf[2].m_int;
INT arg4 = pArgInf[3].m_int;
pRetData->m_int = RegisterHotkey(arg1, arg2, arg3, arg4);
}
inline BOOL shellEx__unreghotkey(HWND hWnd, int id)
{
BOOL result = UnregisterHotKey(hWnd, id);
--remcount;
if (old_proc)
{
if (!remcount)//没有剩余注册窗口
{
result = SetWindowLongPtrA(hWnd, GWLP_WNDPROC, (LONG_PTR)old_proc);//回调函数交还
old_proc = 0;
}
}
return result;
}
// 调用格式: SDT_BOOL 撤销热键, 命令说明: "撤销所注册的系统热键"
// 参数<1>: 窗口句柄 SDT_INT, 参数说明: "窗口句柄"
// 参数<2>: 热键标识 SDT_INT, 参数说明: "注册热键时所返回的热键标识"
SHELLEX_EXTERN_C void shellex_UnRegHotKey_11_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
INT arg1 = pArgInf[0].m_int;
INT arg2 = pArgInf[1].m_int;
shellEx__unreghotkey((HWND)arg1, arg2);
}
// 调用格式: SDT_INT 取指针地址, 命令说明: "返回一个结构的指针地址。"
// 参数<1>: 参数 _SDT_ALL, 参数说明: "要取得地址的一个参数"
SHELLEX_EXTERN_C void shellex_GetAddr_12_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
PVOID arg1 = pArgInf[0].m_pByte;
pRetData->m_int = 0;
if (pArgInf[0].m_dtDataType & DT_IS_ARY)//为数组
{
DWORD dwSize;
LPVOID pVoid = GetAryElementInf(pArgInf[0].m_pAryData, &dwSize);
if (dwSize && pVoid)
{
pRetData->m_int = (INT)pVoid;
}
}
else if (pArgInf[0].m_dtDataType == SDT_TEXT) {//文本型
if (pArgInf[0].m_pText && strlen(pArgInf->m_pText))//先进入再判断防止进入其他分支
{
*pRetData = *pArgInf;
}
}
else if (pArgInf[0].m_dtDataType == SDT_BIN) {//字节集
if (pArgInf[0].m_pBin && (pArgInf[0].m_pBin + sizeof(int)))//先进入再判断防止进入其他分支
{
pRetData->m_int = (INT)(pArgInf[0].m_pBin + sizeof(int) * 2);
}
}
else
{
*pRetData = *pArgInf;//取变量数据地址有区别,此时传递是值,取回的也是值
}
}
// 调用格式: SDT_INT 执行子程序, 命令说明: "执行一个易语言的子程序。"
// 参数<1>: 指针地址 SDT_SUB_PTR, 参数说明: "指针的地址"
// 参数<2>: [参数 _SDT_ALL], 参数说明: "参数"
SHELLEX_EXTERN_C void shellex_CallPtr_13_shellex(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
int(WINAPI * subProgram)(VOID*);
subProgram = (int(WINAPI*)(VOID*))pArgInf->m_dwSubCodeAdr;
pRetData->m_int = 0;
pRetData->m_int = subProgram(pArgInf[1].m_pByte);
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化