#include "stdafx.h"
#include <shldisp.h>
#include <atltypes.h>
#include <commctrl.h>
#include <iostream>
#include "util.h"
namespace
{
void ShowDesktop(void)//显示桌面
{
CoInitialize(0);
IShellDispatch4 * pdisp = nullptr;
CoCreateInstance(CLSID_Shell, nullptr, CLSCTX_ALL, __uuidof(IShellDispatch4), (void **)&pdisp);
if (pdisp)
{
pdisp->ToggleDesktop();//这句是用来切换桌面的
pdisp->Release();
}
}
BOOL Is64Bit_OS()//判断操作系统位数
{
BOOL bRetVal = false;
SYSTEM_INFO si = { 0 };
LPFN_PGNSI pGNSI = (LPFN_PGNSI)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "GetNativeSystemInfo");
if (pGNSI == nullptr)
{
return false;
}
pGNSI(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64
|| si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
{
bRetVal = true;
}
else
{
// 32 位操作系统
//_tprintf(L"is 32 bit OS\r\n");
}
return bRetVal;
}
BOOL EnableDebugPrivilege()
{
HANDLE hToken;
BOOL fOk = FALSE;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
fOk = (GetLastError() == ERROR_SUCCESS);
CloseHandle(hToken);
}
return fOk;
}
///***********************************///
/// 说明:获取桌面桌面图标位置 hDeskWnd:桌面窗口句柄 strIconName:图标名称 lpRect:桌面图片位置
///***********************************///
//获取32系统位指定图标位置
BOOL GetIconRect32(HWND hDeskWnd, const QString & strIconName, LPRECT lpRect)
{
BOOL bRet = false;
//遍历外部进程所有图标
DWORD PID = 0;
GetWindowThreadProcessId(hDeskWnd, &PID);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
if (hProcess == nullptr)
{
unsigned short errorCode = GetLastError();
qDebug() << QStringLiteral("获取进程句柄操作失败32 hWnd=%1,PID=%2,errorCode=%3")
.arg((int)hDeskWnd).arg(PID).arg(errorCode);
if (errorCode == 5)
{
qDebug() << QStringLiteral("拒绝访问");
if (EnableDebugPrivilege())
{
qDebug() << QStringLiteral("提升进程访问权限成功");
}
else
{
qDebug() << QStringLiteral("提升进程访问权限失败");
}
GetWindowThreadProcessId(hDeskWnd, &PID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
if (hProcess == nullptr)
{
qDebug() << QStringLiteral("进程依然打开失败");
}
else
{
qDebug() << QStringLiteral("提升权限后开成功");
}
}
}
if (hProcess)
{
LVITEMA * pLVITEM = (LVITEMA *)VirtualAllocEx(hProcess, nullptr, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
char* pszText = (char *)VirtualAllocEx(hProcess, nullptr, 512, MEM_COMMIT, PAGE_READWRITE);
RECT* pItemRc = (RECT *)VirtualAllocEx(hProcess, nullptr, sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);
RECT rc;
if (!pItemRc || !pLVITEM)
{
qDebug() << QStringLiteral("无法分配内存!");
}
else
{
LVITEMA LVITEM;
LVITEM.mask = LVIF_TEXT;
LVITEM.cchTextMax = 512;
LVITEM.pszText = pszText;
char ItemBuf[512];
int nCount = ::SendMessage(hDeskWnd, LVM_GETITEMCOUNT, 0, 0);
for (int iItem = 0; iItem < nCount; ++iItem)
{
LVITEM.iItem = iItem;
LVITEM.iSubItem = 0;
//将设置好的结构插入目标进程
WriteProcessMemory(hProcess, pLVITEM, &LVITEM, sizeof(LVITEM), nullptr);
//发送LVM_GETITEM消息
BOOL r = (BOOL)::SendMessage(hDeskWnd, LVM_GETITEMTEXTA, iItem, (LPARAM)pLVITEM);
//获取pszText
ReadProcessMemory(hProcess, pszText, ItemBuf, 512, nullptr);
QString str = QString::fromLocal8Bit(ItemBuf);
//AfxMessageBox(str);
if (str == strIconName)
{
::SendMessage(hDeskWnd, LVM_GETITEMRECT, iItem, (LPARAM)pItemRc);
ReadProcessMemory(hProcess, pItemRc, &rc, sizeof(RECT), nullptr);
memcpy(lpRect, &rc, sizeof(RECT));
bRet = true;
break;
}
}
VirtualFreeEx(hProcess, pLVITEM, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItemRc, 0, MEM_RELEASE);//释放内存
}
CloseHandle(hProcess);
}
return bRet;
}
//获取64位系统指定图片位置
BOOL GetIconRect64(HWND hDeskWnd, const QString & strIconName, LPRECT lpRect)
{
BOOL bRet = false;
//遍历外部进程所有图标
DWORD PID = 0;
GetWindowThreadProcessId(hDeskWnd, &PID);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
if (hProcess == nullptr)
{
qDebug() << QStringLiteral("获取进程句柄操作失败32hWnd=%1,PID=%2")
.arg((int)hDeskWnd).arg(PID);
if (GetLastError() == 5)
{
qDebug() << QStringLiteral("拒绝访问");
if (EnableDebugPrivilege())
{
qDebug() << QStringLiteral("提升进程访问权限成功");
}
else
{
qDebug() << QStringLiteral("提升进程访问权限失败");
}
GetWindowThreadProcessId(hDeskWnd, &PID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
if (hProcess == nullptr)
{
qDebug() << QStringLiteral("进程依然打开失败");
}
else
{
qDebug() << QStringLiteral("提升权限后开成功");
}
}
}
if (hProcess)
{
LVITEM64A * pLVITEM = (LVITEM64A*)VirtualAllocEx(hProcess, nullptr, sizeof(LVITEM64A), MEM_COMMIT, PAGE_READWRITE);
char* pszText = (char *)VirtualAllocEx(hProcess, nullptr, 512, MEM_COMMIT, PAGE_READWRITE);
RECT* pItemRc = (RECT *)VirtualAllocEx(hProcess, nullptr, sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);
RECT rc;
if (!pItemRc || !pLVITEM)
{
qDebug() << QStringLiteral("无法分配内存!");
}
else
{
LVITEM64A LVITEM;
LVITEM.mask = LVIF_TEXT;
LVITEM.cchTextMax = 512;
LVITEM.pszText = (INT64)pszText;
char ItemBuf[512];
int nCount = ::SendMessage(hDeskWnd, LVM_GETITEMCOUNT, 0, 0);
for (int iItem = 0; iItem < nCount; ++iItem)
{
LVITEM.iItem = iItem;
LVITEM.iSubItem = 0;
//将设置好的结构插入目标进程
WriteProcessMemory(hProcess, pLVITEM, &LVITEM, sizeof(LVITEM), nullptr);
//发送LVM_GETITEM消息
BOOL r = (BOOL)::SendMessage(hDeskWnd, LVM_GETITEMTEXTA, iItem, (LPARAM)pLVITEM);
//获取pszText
ReadProcessMemory(hProcess, pszText, ItemBuf, 512, nullptr);
QString str = QString::fromLocal8Bit(ItemBuf);
qDebug() << str << strIconName;
if (str == strIconName)
{
::SendMessage(hDeskWnd, LVM_GETITEMRECT, iItem, (LPARAM)pItemRc);
ReadProcessMemory(hProcess, pItemRc, &rc, sizeof(RECT), nullptr);
memcpy(lpRect, &rc, sizeof(RECT));
bRet = true;
break;
}
}
VirtualFreeEx(hProcess, pLVITEM, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItemRc, 0, MEM_RELEASE);//释放内存
}
CloseHandle(hProcess);
}
return bRet;
}
}
BOOL GetIconRect(const QString & strIconName, QRect & rect)
{
CRect cRect;
HWND hDeskWnd = nullptr;//桌面上SysListView32的窗口句柄
HWND hWnd = ::FindWindow(L"WorkerW", nullptr);//先当WIN7系统查找
while (hWnd)
{
HWND hShellView = ::FindWindowEx(hWnd, nullptr, L"SHELLDLL_DefView", nullptr);
if (hShellView)
{
hDeskWnd = ::FindWindowEx(hShellView, nullptr, L"SysListView32", nullptr);
break;
}
hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
}
if (hDeskWnd == nullptr)
{
qDebug() << QStringLiteral("WIN7系统查找方式失败");
//如果没�
没有合适的资源?快使用搜索试试~ 我知道了~
windows桌面引导功能
共15个文件
cpp:4个
h:3个
filters:1个
2星 需积分: 15 9 下载量 87 浏览量
2016-07-29
23:59:18
上传
评论
收藏 11KB ZIP 举报
温馨提示
经常使用windows系统的同学可能都会遇到这样一种情况,刚按照完的应用程序,可能会在桌面产生一个提示信息,指示当前快捷方式可以使用了,并给出相应的文字说明,指示该快捷方式的功能。那么大家有没有考虑过这供功能是怎么实现的呢,请看博文:http://www.cnblogs.com/swarmbees/p/5719911.html
资源推荐
资源详情
资源评论
收起资源包目录
DesktopWizard.zip (15个子文件)
DesktopWizard
stdafx.cpp 23B
DesktopWizard.ico 3KB
desktopwizard.h 379B
DesktopWizard.rc 52B
stdafx.h 30B
util.h 772B
util.cpp 9KB
DesktopWizard.aps 3KB
desktopwizard.qrc 73B
Resources
desktopwizard.cpp 628B
desktopwizard.ui 2KB
main.cpp 210B
DesktopWizard.vcxproj.filters 3KB
DesktopWizard.vcxproj.user 673B
DesktopWizard.vcxproj 11KB
共 15 条
- 1
资源评论
- xiaobadu2016-08-01我觉得吧 至少生成个可执行的exe,也好直接看下效果。两分不值一窝蜂1172019-07-06好久前搞的,自己都忘记了
一窝蜂117
- 粉丝: 582
- 资源: 44
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功