[定义][消息][映射]自定义消息的映射函数 参数出错
09月 12th, 2008 by admin
Posted in VC/MFC | No Comments »
调用::postmessage()函数,然后自定义消息映射函数OnMyData(WPARAM wParam,LPARAM lParam),发现参数传递时的lParam不是PostMessage里的参数值,奇怪!
数组啊
数组就是地址值,局部地址变量是不可以用消息传送的,因为当你收到消息时,该数组已经出栈销毁,其值将不确定
你可以使用指针,new一块空间,处理函数用完了,再delete
由于::postmessage()是异步的,所以必须保证lParam对应地址的值有效。
解决方法:
1,如果可以,可用SendMessage代替
2,new一块堆内存,处理后再delete
3,用SendMessage做一次转接
应该是使用了局部变量的缘故
用PostMessage要注意线程同步,否则就用SendMessage替换
四楼说得对,我顶 高,人家啥也没说就知道是指针
顶3、4楼。。。
如果需要传指针,用SendMessage最简单,否则异步控制会增加很多代码
[消息][显示][窗口]如何抢在QQ的消息显示到窗口前替换其中内容
09月 4th, 2008 by admin
Posted in VC/MFC | No Comments »
公司的需求:
做一个QQ辅助转换插件,在QQ收到消息后将消息中的简体中文转换成繁体。
请问如何才能在QQ自己显示消息之前将消息取出并替换?
盼高人指点。
感觉应该钩子拦截该进程,对网络来的数据处理。可能还需要注入代码,当qq运行时,让自己的钩子程序运行。
QQ协议可不是明文的哦。。
所以截取报文的方式肯定不实际。。。。
可以使用消息钩子,和查找窗口类的API如Findwindow,SetWindowText之类的来伪装实现。。。
不过好像有点延时。嘿嘿。。
QQ 消息显示是RichEdit, 拦截QQ的该控件消息,
比如在修改文本的消息EM_REPLACESEL, 先取得修改的简体文本, 转换后再把 消息的参数改掉
谢谢crearo 和 zzz3265 :)
听说QQ有保护措施 HooK有难度,我先去试试看。
[聊天][消息]再论如何获取QQ聊天消息
09月 3rd, 2008 by admin
Posted in VC/MFC | No Comments »
假设我们获取了QQ聊天窗口的句柄,也得到了RichEdit20A那个句柄,然后需要得到它的消息内容
众所周知,QQ做了很多保护措施来保密,然而进程间通信方法实在太多了(但是我会的很少).
我们都知道,在聊天窗口上复制粘贴是没有乱码出现,我们是不是可以通过剪贴板来获取QQ消息呢?
我用了以下几种办法
方法1.
SendMessage( hRichEditWnd , EM_SETSEL , 0 ,-1 ) ; //全选
SendMessage( hRichEditWnd ,WM_COMMAND , MAKEWPARAM(0,0xE12C), 0 ) ;
//复制,0XE12C是我们VC里框架定义为复制那个ID号 #define ID_EDIT_COPY 0xE122
结论:不行!
方法2.
我用SPY++察看了我们Ctrl+C键盘消息,发现是产生5次消息
SendMessage(hRichEditWnd,WM_KEYDOWN,VK_CONTROL,0×401D0000);//Ctrl Down
SendMessage(hRichEditWnd,WM_KEYDOWN,'C',0×402E0000);//C Down
SendMessage(hRichEditWnd,WM_CHAR,_T('0003'),0×002E0001);//莫名其妙,不知道为什么
SendMessage(hRichEditWnd,WM_KEYUP,'C',0xC02E0001);//Ctrl Up
SendMessage(hRichEditWnd,WM_KEYUP,VK_CONTROL,0xC01D0001);//C up
结论:聊天窗口里竟然显示3…哎.一样不行
方法3:
用模拟键盘的函数
keybd_event(VK_LCONTROL,0,KEYEVENTF_EXTENDEDKEY ¦ 0,0 );
keybd_event(_T('C'),0,0,0 );
keybd_event(_T('C'),0,0,0);
keybd_event(VK_LCONTROL,0,KEYEVENTF_EXTENDEDKEY ¦ KEYEVENTF_KEYUP,0);
当当当…居然抛出异常…而且搞笑的是异常信息居然是 "CONTROL + C"…是不是腾讯封拉?
调试之,矣?居然没有产生异常,聊天窗口里(RichEdit20A)竟然显示的是keybd_event(VK_LCONTROL…就刚才那段代码?
阿?苦矣!!!
我就一直在想,怎么我们实际按下Ctrl+c就能把内容复制到剪贴板,为什么我们模拟一下就不行呢?我发的消息有错误?
同时,我们是不是可以通过在QQ进程里声请虚拟内存,然后获得它的聊天消息呢?
请大家一起来分析分析。。。
ding
TX是做了很多的防护措施
自己顶下~
你知道腾讯加过很多保护措施,那么普通的模拟当然行不通
那我通过剪贴板向里添加自己的信息都可以
你想做什么?动机不纯
学习下!
[消息][传送]一个消息传送的问题
08月 25th, 2008 by admin
Posted in VC/MFC | No Comments »
有5个界面,编号分别为1,2,3,4,5,这5个界面属于同一级别,5个界面的上一级窗口里有个edit输入框,比如,我输入3时,怎样弹出界面3???
在父窗体,就是你的EDIT里面,给这个控件对于的OK按钮添加消息响应函数,判断静态文本的值。
记下5个子窗口的句柄,在添加的函数中,对应不同的值,分别调用显示。
记得更新关联到EDIT变量的值。
这五个界面共用一个句柄,我写了一个函数,可以同时显示五个界面出来,然后通过翻页可以显示1,2,3,4,5,就是不清楚上一级edit输入数字怎么显示五个界面之一??
将edit内存buf缓冲
可以将Edit中的输标识,传到你那五个界面的对像中。然后再通过发消息,通知那个对像更新窗体界面。
可以将Edit中的输标识,传到你那五个界面的对像中。然后再通过发消息,通知那个对像更新窗体界面。
void showUI(HWND hWnd, HDC hDC, BYTE index) <—显示5个界面的
{
switch(index)
{
case 1:
..
case 5:
…..
…
default:
break;
}
}
LRESULT display(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
wmid = LOWORD(wParam);
wmevent = HIWORD(wParam);
case ID_Edit: —->上一级edit ID
int number;
TCHAR string1[100];
..这里有个atoi转换(略)
wsprintf(string1, TEXT("%d"), number);
sendmessage(hWnd, WM_CHAR, (WPARAM)string1[0], 0);
……
…
case ID_OK:
调用
void showUI(hWnd, hDC, number); <—暂时不考虑number的范围
hEditWnd = GetDlgItem(hWnd, ID_edit);
sendmessage(hEditWnd, WM_CHAR, 0, 0);
….
….
}
如楼上所说,我这样写,哪不对,请指正!
[消息]关于消息框的问题请指点一下……
08月 25th, 2008 by admin
Posted in VC/MFC | No Comments »
VC/MFC 开发C/S系统
使用:AfxMessageBox("执行操作?")的时候,消息框的“标题栏”是解决方案的名称。
请问:如果更改消息框标题栏的显示??
学习,关注……
AfxMessageBox的标题头是默认的.
用MessageBox可以更改.
- C/C++ code
-
MessageBox("…","你想要的标题栏",…); 具体格式请查询MSDN的MessageBox的函数.
LZ:
AfxMessageBox的标题头是默认的????
改不了了????
关注…………
改不了
你去MSDN查查AfxMessageBox就知道了
int AfxMessageBox(
LPCTSTR lpszText,
UINT nType = MB_OK,
UINT nIDHelp = 0
);
int AFXAPI AfxMessageBox(
UINT nIDPrompt,
UINT nType = MB_OK,
UINT nIDHelp = (UINT
) -1
);
参数中没有标题这项,只有提示消息,还有类型.
用MessageBox吧,注意加一个参数,为当前窗体句柄
LZ:
请问:AfxMessageBox("执行操作?")的“标题栏”和什么是一致的??解决方案名称??
我刚刚重命名了解决方案名称,项目名称,但是AfxMessageBox的标题栏还是没有改变!
关注……
LZ:
我找到答案了
Resources的String Table中AFX_IDS_APP_TITLE就是AfxMessageBox标题栏的要显示的标题, 可以直接修改里面的字符串就可以了哈。
哈哈哈……
9楼的你这样该是不是程序的标题也变了?
lz:
程序的标题是什么意思??
我的是DIALOG 项目,我设置后只是AfxmessageBox的标题改变了,其他的没有发现有什么改变!
请详细说一下,你认为的情况,谢谢!
关注……
[消息][发送][求救]消息发送API问题求救!
08月 24th, 2008 by admin
Posted in VC/MFC | No Comments »
SendMessage(hWinList,LB_ADDSTRING,0,&Name);
报错:D:cccvcvcDlg.cpp(237) : error C2660: 'SendMessageA' : function does not take 4 parameters
用SetDlgItemText也是如些?怎么回事啊!求救,
先谢谢 !
::SendDlgItemMessage (Dlg,IDC_LIST1,LB_ADDSTRING,0,&Name);
报错:D:cccvcvcDlg.cpp(240) : error C2664: 'SendDlgItemMessageA' : cannot convert parameter 1 from 'void *' to 'struct HWND__ *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
是怎么回事呢?
第一个参数的类型应该是HWND ,你传的不是
你的Dlg是什么变量?哪来的?
参数类型不匹配,使用函数是先看函数声明
恩。是参数类型不匹配的问题。
[GetMessage][消息][进程]GetMessage是不是在没有消息的情况下进程(线程)处于阻塞状态
08月 22nd, 2008 by admin
Posted in VC/MFC | No Comments »
在WinMain函数中的消息循环中:
wile(GetMessage(&msg, NULL, 0, 0)) {…}
这里有两个问题:
1、WinMain中的GetMessage是从操作系统中的消息队列来获取消息的。那么如果这个消息循环是在某个子线程中的,那么GetMessage又是从什么地方来获取消息的呢?
注:我知道可以通过PostThreadMessage(ThreadId, WM_㗃𗃗, NULL, NULL)来往线程中发消息,但是我相知道的是这个消息是发到操作系统的消息队列吗?
2、如题,因为这里的消息循环在得到WM_QUIT前是个死循环,如果GetMessage在没有消息时也一直运行,那么是不是很耗资源吗?所以我认为在没有资源时应该处于阻塞状态。
3、哪位兄弟手上有详细的消息对象的数据结构不妨拿出来共享一下^_^,俺手上的这本书不巧没有消息的数据结构的详细介绍。
1、每个线程都有自己的消息队列。GetMessage是从当前线程的消息队列中取消息。PostThreadMessage是发送到线程的消息队列中。
2、你的猜想是正确的。消息队列中没有消息GetMessage是不会返回的。和GetMessage不同,PeekMessage是不阻塞,立即返回。
3、《Windows核心编程》书中有详细介绍,这本书有电子版的。
2,WM_QUIT是请求应用程序退出的消息,对系统来讲,它与其他消息没有什么不同。你提的阻塞,感觉很可怕。不太明确你说的阻塞是什么意思。个人认为,你使用这个词是错误的。
各种消息(包括用户定义的消息)在系统内排队,每个程序只是负责消费它,就是说,我用的时候,我就Get,不用它,就不Get。。。。
哪来的阻塞?
3,看MSDN,这是最好的书。
对你得问题:
1、GetMessage从当前线程消息队列,而不是所谓得操作系统队列获得
2、没有资源时处于阻塞状态,不需要消耗资源。这里3楼得理解可能有点问题
3、不建议看其所谓得消息结构,对你毫无意义,看windows核心编程也许不错
无论哪本介绍MFC的书籍,都有说到过这个问题,GetMessage函数在没有消息时的确是阻塞的,不消耗CPU,这是书上明确说明的。
你可以用SDK的方式写个程序测试一下,不难,网上很多
各种消息(包括用户定义的消息)在系统内排队,每个程序只是负责消费它,就是说,我用的时候,我就Get,不用它,就不Get。。。。
哪来的阻塞?
=======================
这样说不对,用的时候就Get,不用时就不Get,这根本不可能,GetMessage在没有消息时是阻塞的,也就是不返回,线程停在GetMessage处,另一个PeekMessage和它不同,它是没有消息时也返回,以前有人利用这个函数在程序空闲时作一些工作。
各种消息(包括用户定义的消息)在系统内排队,每个程序只是负责消费它,就是说,我用的时候,我就Get,不用它,就不Get。。。。
哪来的阻塞?
=======================
这样说不对,用的时候就Get,不用时就不Get,这根本不可能,GetMessage在没有消息时是阻塞的,也就是不返回,线程停在GetMessage处,另一个PeekMessage和它不同,它是没有消息时也返回,以前有人利用这个函数在程序空闲时作一些工作。
是的
我看到的所有的情况,都是循环GetMessage的,“不用时不get”,怎么实现呢?消息循环对线程至关重要,所有基于消息的线程都有义务随时monitor消息,不能等到特定时候再get(怎么等待呢?)
学习一下!
GET、PEEK、SEND、POST消息很好理解
GET就是不GET到不罢休
PEEK只是看看有没有消息,有就拿,没有就走人
SEND是要一直等到对方收到了才放心
POST只是把消息放在邮筒里就不管走人了
消息循环的语句如下:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
其中,GetMessage如果收到非WM_QUIT的消息,会返回非0值;如果收到WM_QUIT消息,会返回0值。另外,GetMessage在没有消息时是阻塞的,也就是不返回,线程被操作系统挂起。
[程序][消息][通讯]程序间消息通讯,如何处理malloc申请的空间
08月 21st, 2008 by admin
Posted in VC/MFC | No Comments »
大虾们, 今天遇到个问题,就是想程序A和程序B间用message通讯,由于message携带的信息量大,需要申请一个空间来存储这些信息,并作为指针由message发送到另外一个程序中使用,运行后发现,A不能访问message中的空间指针,这个指针是由B malloc后给message传递给A的. 由2个问题:
1. 为什么A不能访问message中的指针?
2. 寻求A,B间通讯的方法(通讯信息量大).
还可以用注入的方法啊 VirtualAllocEx—》WriteProcessMemory—-》CreateRemoteThread,
每个进程有独立的地址空间,进程间不能传递指针。如果是利用消息传递数据,可以用WM_COPYDATA消息,系统会替你把数据复制到目标进程。如果要了解更多有关进程间传递数据的方法,可以在网上搜索一下。
补充一句,大量数据应该用文件映射来共享内存的方法。
文件也是个进程通信的途径
看来有很多种方法呢:)
需要好好学习,谢谢大家了!
用文件映射对象来保存数据,楼主可以试试
多谢多谢大家!
[消息][处理]关于消息处理
08月 8th, 2008 by admin
Posted in VC/MFC | No Comments »
我在CButton中编写了ON_WM_LBUTTONDOWN(),ON_WM_LBUTTONUP()的消息处理,
现在我需要把这个消息传给我的VIEW主窗体,在主窗体中处理当我按下按钮及当我放开按钮的操作 要怎么做?
这个思路是为了解决,在VIEW中当我按下按钮及放开按钮的操作,这个问题怎么做?
先谢谢各位了!!!!
方法1:将view对象的指针传给你的button类,然后在ON_WM_LBUTTONDOWN(),ON_WM_LBUTTONUP()中调用view的方法通知view,
方法2:将view的窗口句柄传给你的button类,然后在ON_WM_LBUTTONDOWN(),ON_WM_LBUTTONUP()中用SendMessage
给view发消息,然后在view中添加消息响应函数
分别在DOWN和UP中给主窗口SendMessage.
send消息到view怎么发 能写个例子给我吗 不知道怎么写 更不知道写在什么地方 谢谢各位了!!!
安装msdn时选择sample选项,就会安装例子代码,看例子代码是必修课
[定义][消息][响应]定义消息响应函数
08月 7th, 2008 by admin
Posted in VC/MFC | No Comments »
我在一个项目中新添了一个generic class.如果我想定义一个消息响应函数怎么办啊?是不是不可以直接加ON_MESSAGE(MM_WIM_DATA,OnMM_WIM_DATA)?
只有窗口类(从CWnd或其子类继承的类)才有消息响应。
建议使用 向导 进行添加
这个不是你想加messagemap就可以用的。
谢谢两位!
一般消息定制过程为
1) 建立消息号 #define MYMESSAGE …
2) 消息映射 ON_MESSAGE(MYMESSAGE,OnMyMessage)
3) 消息函数定义 afx_msg void OnMyMessage(,);
4) 实现消息函数 void CMainFrame::OnMyMessage(,)
{
}
5) 发送消息
是不是象二楼说的只要窗口类才可以有消息响应呢?
如题我是自己新建一个generic class,也就是说不属于窗口类。那么如果这个类是关于录音的,当存储满的时候产生的MM_WIM_DATA消息是不是必须要在窗口类(CNetWavDlg)里面来接收呢?