我要通过sendmessage等方式发送点击按钮、点击菜单等消息给另外一个foxpro编写的程序,以控制该程序的运行,子窗体查找使用findwindowex等函数,都能够找到,但是用spy观察不到foxpro编写的程序中按钮的窗口句柄。我用spy监测了手动点击按钮的消息,并照样写了代码和消息码,没有解决。该如何处理?
解决方案 »
- 请教<<Windows核心编程中>>的一个问题
- ☆☆☆请教:如何在OnTimer函数中调用KillTimer?☆☆☆
- CMenu的SetMenuItemBitmaps和DrawItem问题!知道的大哥帮忙解决一下以下难题,想知道的帮忙顶啊!
- 想问一下netbios和winsock哪个比较普及
- 一个UPDATE_COMMOND_UI的问题
- 控件里面要显示一些图片,请问怎么序列化图片,以便能保存起来
- 200分讨论:依靠MAC地址进行通讯
- 请问如何编程获得显示器物理(可显示区域的)尺寸等参数?
- 不知道那里错误!
- 怎样删除工具栏上的右键菜单
- 在SDI应用程序中,如何改变视图的背景颜色
- 寻求一个最简单的 NT Service 的源代码。要求体现这种程序的结构。
First,you must find the handle of the application which you will sendmessge to.LRESULT SendMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);Second , you must decide what message you will send,this is for the second parameter.
The last two parameters can be set 0. But if you send message to a child window of the application which you will send message to ,you should set the wParam a right value or lParam a right value.If you don't successful,you should check the message is right or not and the handle is right or not too.
其中的参数wpapam就是按钮的ID值,
给他发个消息就行了。
其中的参数wpapam就是按钮的ID值,
给他发个消息就行了。不要用按钮的窗口句柄,hWnd用放按钮的窗口的窗口句柄
发送WM_COMMAND,不要WM_LBUTTONDOWN消息。sendmessage(hWnd,WM_COMMAND,wParam,lParam)
今晚一定搞,你有email,的话,先放在这里,如果今晚搞定了,明天就把代码发过去
我就明天一天的时间了
以后可能上网的时间很少,因为失业了,
惨了,搞不定,真差差一个晚上,只能找到vfp的窗口,里边的小窗口根本就找不到,或者是找到了但不能知道那个是要找的窗口,因为连个窗口标题都没有楼主,我宣布失败,我会关注此贴,只是再也不能像现在这样天天都可以关注而已Sorry to all!
[email protected]
一、Windows消息机制
Windows是一种面向对象的体系结构,Windows环境和应用程序都是通过消息来交互的。Windows应用程序开始执行后,Windows为该程序创建一个"消息队列(message queue)",用以存放邮寄给该程序可能创建的各种不同窗口的消息。消息队列中消息的结构(MSG)为:
typedef struct tagMSG{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG;
其中第一个成员变量是用以标识接收消息的窗口的窗口句柄;第二个参数便是消息标识号,如WM_PAINT;第三个和第四个参数的具体意义同message值有关,均为消息参数。前四个参数是非常重要和经常用到的,至于后两个参数则分别表示邮寄消息的时间和光标位置(屏幕坐标)。把消息传送到应用程序有两种方法:一种是由系统将消息"邮寄(post)"到应用程序的"消息队列"这是"进队消息"Win32 API有对应的函数:
PostMessage(),此函数不等待该消息处理完就返回;而另一种则是由系统在直接调用窗口函数时将消息"发送(send)"给应用程序的窗口函数,属于"不进队消息"对应的函数是SendMessage()其必须等待该消息处理完后方可返回。
二、主控程序的实现
(1)新建一工程文件:Sender,选取MFC AppWizard(exe)。
(2)第二步选取Single document(单文档)。
(3)其余几步均为确省值。
(4)添加三个菜单"命令一"、"命令二"、"命令三"及与之对应的函数:
OnSendComm1()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,0,0);
}
OnSendComm2()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,0,1);
}
OnSendComm3()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,1,0);
}
(5)在SenderView.h中添加自定义消息:#define WM_COMM WM_USER+100编译完成即可。
三、底层工作程序的实现
(1)新建工程Receiver、仍是单文档。
(2)在CReceiverApp类的InitInstance()函数末尾添加:
m_pMainWnd->SetWindowText("Receiver");
用以指定底层工作程序的窗口标题,以便主控程序能根据标题获取到此窗口的窗口句柄。
(3)在MainFrm.h中添加自定义消息:#define WM_COMM WM_USER+100。
(4)添加自定义消息WM_COMM的消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_COMM,OnSendMsg)
END_MESSAGE_MAP()
(5)完成消息响应函数OnSendMsg()
void CMainFrame::OnSendMsg(WPARAM wParam, LPARAM lParam)
{
if(wParam==0 && lParam==0)
AfxMessageBox("主控程序发送命令一!");
if(wParam==0 && lParam==1)
AfxMessageBox("主控程序发送命令二!");
if(wParam==1 && lParam==0)
AfxMessageBox("主控程序发送命令三!");
}
我们便可以通过辨别消息的两个消息参数来区分主控程序发送的是哪一个命令从而可以执行相应的操作。执行主控程序和底层工作程序由于本程序采用的是SendMessage()所以当主控程序发送消息给底层工作程序时,底层工作程序弹出响应的模式对话框,在没有关闭对话框前此消息未处理完,SendMessage()也就没有执行完,所以主控程序呈阻塞状态,如改用PoseMessage()则不会发生阻塞,具体选用哪个函数还应根据实际要求灵活掌握。
结论: 通过上面的实例可以看出利用消息进行进程间通信不失为一种便捷的方法,进程间的数据交换量不大却能完成相当的功能,上下层次有着明显的接口,上层和底层只通过这个接口进行通讯,因此只要对上下层程序制定好规范详尽的协议便可编制出协调性很好的软件控制系统。
发消息,比如,我完全可以自己写一个Button控件,不基于CButton或CWnd类,换句话
说,按钮的样子是画出来的,这样它就不执行Windows的消息运转,而是执行自己
的,如果真是这样,你是没有办法找到答案的。foxpro最早不是微软的产品,完全可能有自己的一套处理控件和消息的机制,而
不用Widnows的。
SendInput()可以模拟鼠标和键盘以及外部其他输入设备的操作。
还可以通过FindWindow的方法找到窗口,从中再找到具体的控件或者子窗口向其传递窗口消息。
用户自定义消息是无法发送的。
可以发送自定义的窗口消息,但是两个程序要都要注册该消息方可。