dll中做窗口,任务栏不显示

Janlex 2008-04-06 10:33:29
我在VC工作建“动态链接库使用共享MFC DLL”


#include "stdafx.h"
#include "wgdll.h"
#include "main.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BEGIN_MESSAGE_MAP(CWgdllApp, CWinApp)
//{{AFX_MSG_MAP(CWgdllApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWgdllApp construction

CWgdllApp::CWgdllApp()
{
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CWgdllApp object

CWgdllApp theApp;
Main *pMain;
HHOOK hhook;


extern "C" __declspec(dllexport) BOOL WINAPI SetHook(DWORD tid)
{
if (hhook == NULL)
{
::SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, theApp.m_hInstance, tid);
if (hhook != NULL)
return TRUE;
}
return FALSE;
}


extern "C" __declspec(dllexport) BOOL WINAPI UnHook()
{
return ::UnhookWindowsHookEx(hhook);
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL bKeyUp = lParam & (1 << 31);
if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION)
{
if (pMain == NULL)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pMain = new Main(0);
pMain->Create(IDD_MAIN);
pMain->SetParent(0);
}
pMain->ShowWindow(pMain->IsWindowVisible()?SW_HIDE:SW_SHOW);
}
return ::CallNextHookEx(hhook, nCode, wParam ,lParam);
}


int CWgdllApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
delete pMain;
return CWinApp::ExitInstance();
}




IDD_MAIN是窗口资源。。。

这个DLL被hook注入到游戏进程后, 按F12. 可以正常显示。 但在不显示在任务栏,就相当于一个游戏的一个子窗口了。

但问题是, 在游戏中F12呼出后, 鼠标移动到IDD_MAIN窗口上, 总不显示鼠标光标。 (也就是这个DLL窗口得不到鼠标光标焦点,而焦点一直在游戏上)。

所以我估计是这个窗口当成游戏的子窗口了。 (从没在任务栏显示可以判断出)。

所以我的问题是如何解决? 其实也就是说,如何让这个DLL注入到游戏进程。 F12呼出后, 在任务栏有显示。 并且, 在界面上能显示出鼠标光标。。。
...全文
303 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Janlex 2008-04-09
  • 打赏
  • 举报
回复
今天在坐火车。去外省。
明天到了,测试一下。ok了给你加分。(不是我现在不加,是加了就结贴了)
cnzdgs 2008-04-08
  • 打赏
  • 举报
回复
就是说在第1次按F12的时候,用CreateThread创建一个线程,在这个线程里面创建对话框,可以用模式对话框,也可以非模式,如果非模式则需要自己写一个消息循环。对话框创建好之后,把窗口句柄或者类指针保存为全局变量。
Janlex 2008-04-08
  • 打赏
  • 举报
回复
自己创线程?
这个有点不明白。

能给点提示代码吗?……

真的不好意思,打扰你这么久
cnzdgs 2008-04-08
  • 打赏
  • 举报
回复
这消息可能被游戏处理了,因为你是用游戏的消息循环,所以受制于人。干脆自己创建线程吧。
Janlex 2008-04-08
  • 打赏
  • 举报
回复
我在IDD_MAIN窗口增加了WM_SETCURSOR消息
在消息函数中写
::SetCursor(LoadCursor(NULL,IDC_WAIT));


当窗口呼出, 也不见窗口上有十字光标.


呵呵~~~

这个问题真荆手啊...
cnzdgs 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Janlex 的回复:]
还是不行。
用了ReleaseCapture和没用是一样的。

效果都是, 鼠标可以在自己做的窗口中点击。(但看不到鼠标光标,估计显示在游戏中)并且在窗口中的CEdit不能输入
[/Quote]
原来是这样,我还因为不能点窗口中的任何控件呢。
光标可能是被游戏隐藏了,然后游戏获得到鼠标移动消息后在自己的窗口上画光标。你可以在显示窗口后SetCursor设置默认光标,隐藏窗口后再SetCursor隐藏光标。
至于输入法,可能是游戏屏蔽了输入法的热键。

另外,你可以考虑另开一个线程来显示对话框。
Janlex 2008-04-08
  • 打赏
  • 举报
回复
并且在窗口中的CEdit不能输入

错了。

是不能在CEdit切换输入法。只能输入英文字母
Janlex 2008-04-08
  • 打赏
  • 举报
回复
还是不行。
用了ReleaseCapture和没用是一样的。

效果都是, 鼠标可以在自己做的窗口中点击。(但看不到鼠标光标,估计显示在游戏中)并且在窗口中的CEdit不能输入
cnzdgs 2008-04-07
  • 打赏
  • 举报
回复
游戏执行了SetCapture,所以鼠标消息都会发给游戏窗口。
你先在显示自己的窗口后执行一下SetCapture看看效果如何。
cnzdgs 2008-04-07
  • 打赏
  • 举报
回复
你先这样试一下:
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL bKeyUp = lParam & (1 << 31);
if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION)
{
if (pMain == NULL)
{
ReleaseCapture();
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pMain = new Main(0);
pMain->Create(IDD_MAIN);
pMain->SetParent(0);
pMain->ShowWindow(SW_SHOW);
}
else
pMain->ShowWindow(pMain->IsWindowVisible()?SW_HIDE:SW_SHOW);
}
return ::CallNextHookEx(hhook, nCode, wParam ,lParam);
}
Janlex 2008-04-07
  • 打赏
  • 举报
回复
但是6楼还是不行。 你帮我修改一下代码,应该怎么改?
cnzdgs 2008-04-07
  • 打赏
  • 举报
回复
在正常情况下,鼠标在哪个控件上移动或者点击,这些消息都会发给鼠标下面的控件,但是如果某个控件(或窗口)SetCapture之后,其它控件和窗口就不会收到鼠标消息了,这时鼠标的消息只发给SetCapture指定的控件(或窗口),即使鼠标不在控件范围内也是一样。
Janlex 2008-04-07
  • 打赏
  • 举报
回复
没道理吧。
SetCapture是把所有消息发送给指定窗口/控件句柄。

当SetCapture后,游戏中,包括IDD_MAIN上的控件消息都会发到IDD_MAIN主窗口上。。

哪怕你ReleaseCapture也与这个没有关系。

所以感觉这个不是解决办法。
cnzdgs 2008-04-07
  • 打赏
  • 举报
回复
知道原因了,SetCapture之后所有鼠标消息都发给你的窗口,包括应该发给窗口控件的消息也都不发了,所以“假死”。你试一下ReleaseCapture,窗口关闭时可能要再SetCapture游戏窗口。
Janlex 2008-04-07
  • 打赏
  • 举报
回复
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL bKeyUp = lParam & (1 << 31);
if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION)
{
if (pMain == NULL)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pMain = new Main(0);
pMain->Create(IDD_MAIN);
}
pMain->ShowWindow(SW_SHOW);
pMain->SetCapture();

}
return ::CallNextHookEx(hhook, nCode, wParam ,lParam);
}


一样不行。。。
cnzdgs 2008-04-07
  • 打赏
  • 举报
回复
你直接用ShowWindow(SW_SHOW)试试。
Janlex 2008-04-07
  • 打赏
  • 举报
回复
if (pMain == NULL)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//CWnd *pCWnd = CWnd::GetForegroundWindow();
pMain = new Main(0);
pMain->Create(IDD_MAIN);
}
BOOL bShow = pMain->IsWindowVisible()?SW_HIDE:SW_SHOW;
pMain->ShowWindow(bShow);
if (bShow)
::SetCapture(pMain->GetSafeHwnd());
else
{
::ReleaseCapture();
}

结果一样。。。。

朋友,你回贴真快
cnzdgs 2008-04-07
  • 打赏
  • 举报
回复
你先ShowWindow再SetCapture试试。
Janlex 2008-04-07
  • 打赏
  • 举报
回复
按道理:

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL bKeyUp = lParam & (1 << 31);
if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION)
{
if (pMain == NULL)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pMain = new Main(0);
pMain->Create(IDD_MAIN);
pMain->SetParent(0);
pMain->SetCapture();
//加上这句应该可以的,但是结果,让pMain窗口假死了,鼠标在上面怎么点都无用。

}
pMain->ShowWindow(pMain->IsWindowVisible()?SW_HIDE:SW_SHOW);
}
return ::CallNextHookEx(hhook, nCode, wParam ,lParam);
}
项目名称:高仿QQ2013通讯DEMO-10.30更新 版本号:10.30 最新版本 下载内容: (C#)CC2013局域网通讯源码一份, 可引用至工具箱最新版CSkin.dll-10.30版本界面库一份。 界面库更新说明: CC2013-10.30 1.由于SkinForm名字太多人使用,界面库命名正式改为CSkin.dll,官网www.cskin.net。 2.SkinTabControl标签添加菜单箭头,可点击展开菜单。 3.SkinTabControl添加标签关闭按钮。 4.修复部分文乱码问题。 5.优化好友列表右键菜单。 6.将窗体自定义系统按钮改为集合模式,可添加无数个自定义系统按钮。自定义系统按钮事件可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画的播放。如360的动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入更加自定义的美化属性和动画效果。 2.添加SkinAnimator,通用动画控件。 3.添加Html编辑器控件 4.修复SkinButton图标和文本相对位置的BUG CC2013-9.26 1.优化好友列表CPU占用 2.好友列表加入好友登录平台属性:安卓 苹果 WEBQQ PC 3.优化标题绘制模式,新添标题绘制模式属性。 4.新添标题偏移度属性。 5.加入圆形进度条控件:ProgressIndicator。 CC2013-9.5.2 1.优化截图控件,截图工具栏加入新功能。 2.解决个人信息卡和天气窗体显示后不会消失的问题。 3.各种细节BUG优化。 CC2013-9.5.1 1.解决贴边左右隐藏的BUG。 2.解决窗体点击事件不能触发的问题。 3.优化SkinButton继承父容器背景色的代码。 4.解决SkinButton异常错误。 CC2013-9.3 1.好友列表右键菜单没反应问题。 2.新增美化控件SkinDatagridview。 3.密码软件盘回删不了文字问题。 4.双击窗体最大化,最大化后再双击恢复原大小,(win7)。 5.部分细节调优。 实现功能: 1.界面库多达25个自定义换肤控件,让每个控件设设属性就能达到你想要的效果,支持图片换肤和色调绘制。 2.四边阴影,毛边效果,可以设置阴影宽度和阴影颜色,支持所有系统。 3.拥有密码键盘输入,防护更贴心。 4.8种圆角窗体模式供你选择,淋漓尽致,润滑如圆。 5.登录主界面后,有登陆提示窗,提示上次登录的城市和时间。 6.皮肤随心变:拖动任意一张图片至主界面,就可以改变皮肤。 7.皮肤色调获取:改变皮肤的同时,将计算图片色调,再将其运用到窗体背景色。 8.皮肤尾部渐变:上下左右方均可实现,渐变皮肤。 9.皮肤拖拉方向:可以选择皮肤在拉伸的时候,粘着哪一边拖拉。 10.GDI+界面重绘,处理消息机制,3种移动模式和拉伸是否启用只需要设置一个属性的事就可以解决。 11.界面渐变闪现和闪退:不再像平凡的突然出现,采用API渐变机制,渐渐出现和消失,win7系统下还有动态缩小至任务的效果。 12.完美好友列表,可添加上千好友,不卡不掉线,还可以拖动好友到其他分组。 13.好友悬浮至头像可以查看详细资料卡。 14.窗口可调渐变后透明度:让窗体看起来更像是Vista玻璃窗体风格。 15.聊天窗口可发送图片,大文件,表情,还有震动。 16.按钮控件背景色拥有继承窗体背景主色调的功能,让整体色调保持一致。 17.更是有和如出一辙的扣扣截图。仿真度也达到100%,完美修复所有已知BUG。 18.聊天窗口,可以调字体颜色和字体样式等多项功能。 20.SkinLabel与SkinButton控件字体与窗体标题可以根据背景色暗亮度自动调节字体为黑还是白。 21.MessageBox提示框的美化,并继承调用窗口的色调与背景,MessageBox可所谓已达到帅气的不能再帅气的境界了。 22.天气皮肤自动变,所有窗体根据当地天气自动决定皮肤背景,CC最帅气功能之一。 23.个人资料卡及聊天窗体拥有动态CC秀展示。 24.主界面拖动换肤的同时,所关联的子窗体皮肤也会跟着变。 25.多线程大文件传输功能,支持无上限大文件传输,有进度条显示进程度。 26.界面库已封装了大图取主色调,颜色判断暗亮等多项功能。 27.如果你觉得获取天气让你的登录太慢不想要的话,注释相关调用方法即可快速登录。 界面库交流群:306485590 本人QQ:345015918 注意: Demo版不包括更新,为方便用户查看和使用属性等方法,dll只轻微加密。想反编译的就不要尝试了,里面有上百个类,改错改到你哭。 介意购买正版,永久更新配源码。 看截图或者想购买商业版的用户请访问以下地址: http://www.51aspx.com/code/TotalLikeQQ2013 特权:购买商业版的用户,有权利享有最快的更新服务,第一时间将最新版本的dll源码送到你手上。 使本项目源码或本项目生成的DLL前请仔细阅读以下协议内容,如果你同意以下协议才能使用本项目所有的功能,否则如果你违反了以下协议,有可能陷入法律纠纷和赔偿,作者保留追究法律责任的权利。 1、你可以在开发的软件产品使用和修改本项目的源码和DLL,但是请保留所有相关的版权信息。 2、不能将本项目源码与作者的其他项目整合作为一个单独的软件售卖给他人使用。 3、不能传播本项目的源码和DLL,包括上传到网上、拷贝给他人等方式。 4、以上协议暂时定制,由于还不完善,作者保留以后修改协议的权利。 时间:2013-7-5 作者: 乔克斯 请保留以上版权信息,否则作者将保留追究法律责任。
目 录 第一章 开发环境 1.1 Qt 简介5 1.2 下载安装 Qt Creator 6 1.3 第一个程序 Hello World 7 第二章 窗体应用 1.1 窗体基类说明 12 1.2 控制窗体大小 13 1.3 窗体初始位置及背景色 13 1.4 修改标题栏图标 14 1.5 移动无边框窗体 16 1.6 去掉标题栏最大化、最小化按钮 17 1.7 多窗体调用 18 1.8 字体形状窗体 20 第三章 控件应用 1.1 QPushButton按钮 23 1.2 QLabel标签 23 1.3 QLineEdit单行文本 24 1.4 QTextEdit多行文本 25 1.5 QPlainTextEdit多行文本 26 1.6 QComboBox下拉列表框 26 1.7 QFontComboBox字体下拉列表框 27 1.8 QSpinBox控件 28 1.9 QTimeEdit时间控件 29 1.10 QDateEdit日期控件 30 1.11 QScrollBar控件 30 1.12 QRadioButton单选按钮 31 1.13 QCheckBox复选框 32 1.14 QListView 列表控件 34 1.15 QTreeView树控件 34 1.16 QTableView表格控件 35 1.17 QHBoxLayout横向布局 36 1.18 QGridLayout网格布局 37 1.19 QGroupBox控件 38 1.20 QTabWidget控件 39 1.21 QMenu、QToolBar控件 41 1.22 任务栏托盘菜单 43 第四章 组件应用 1.1日历组件 47 1.2登录窗口 48 1.3文件浏览对话框 50 1.4颜色选择对话框 51 1.5进度条实例53 1.6Timer实时更新时间 54 第五章 文件操作 1.1创建文件夹 57 1.2写入文件 58 1.3修改文件内容 60 1.4删除文件 62 1.5修改文件名 63 1.6 INI文件写入操作 65 1.7 INI文件读取操作 68 1.8创建XML文件 71 1.9读取XML文件 72 第六章 图形图像操作 1.1绘制文字 75 1.2绘制线条 75 1.3绘制椭圆 77 1.4显示静态图像 78 1.5显示动态图像 78 1.6图片水平移动 79 1.7图片翻转 80 1.8图片缩放 82 1.9图片加文字 84 1.10图像扭曲 85 1.11模糊效果 85 1.12着色效果 86 1.13阴影效果 87 1.14透明效果 87 第七章 多媒体应用 1.1音频、视频播放器 90 1.2播放Flash动画 94 1.3播放图片动画 95 第八章 系统操作 1.1获取屏幕分辨率 98 1.2获取本机名、IP地址 98 1.3根据网址获取IP地址 99 1.4判断键盘按下键值 100 1.5获取系统环境变量 101 1.6执行系统命令 102 第九章 注册表 1.0简要说明注册表 105 1.1写入注册表 105 1.2查找注册表 106 1.3修改IE浏览器的默认主页 107 第十章 数据库基础 1.1查询数据库驱动 109 1.2Qodbc连接Access数据库 109 1.3插入数据 111 1.4数据列表 112 1.5操作SQLite数据库 113 1.6SQLite数据库视图管理器 115 第十一章 网络开发 1.1点对点聊天服务端 119 1.2点对点聊天客户端 123 1.3局域网广播聊天 128 1.4SMTP协议发送邮件 148 1.5调用系统DLL判断网络连接状态 152 第十二章 进程与线程 1.1进程管理器 155 1.2线程QThread应用 158 1.3线程QRunnable应用 159 第十三章 数据安全 1.1 QByteArray加密数据 163 1.2 AES加密数据 164 1.3 MD5 加密数据 165 1.4 生成随机数 166 第十四章 打包部署 1.1 FilePacker 打包 169 1.2 Inno Setup 打包 174

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧