MFC中,如何控制另一个程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中,如何控制另一个程序?相关的知识,希望对你有一定的参考价值。

一个A程序控制另一个程序B窗体,具体问题如下: 1.向B的窗体的编辑框中输入指定的字符串 2.向B的窗体的编辑框中输入IP地址 注:我也在网上查了,知道用FindWindow找到窗口句柄,用PostMessage发送文本消息,可是失败了,数据写不上!不知是为什么?可能我的写错了,代码如下: HWND hNetWnd=::FindWindow(NULL,"网络设置"); PostMessage(hNetWnd,WM_COMMAND,IDC_CLIENT_OPTION,0); char ch[]="12"; HWND hEditWnd=GetDlgItem(hNetWnd,IDC_NET_PORT_EDIT); PostMessage(hEditWnd,WM_SETTEXT,0,(LPARAM)(ch)); hNetWnd是网络设置对话框的句柄,hEditWnd是一个文本编辑框(端口号),IDC_NET_PORT_EDIT是编辑框的ID 结果是写不进去数据!不知是为什么?我也没用过,也不知道写的对不对,也不知道PostMessage该怎么用,我也在网上查了,可是找不到具体详细的答案! 那位老手帮帮忙吧,谢谢!没分了。。。

参考技术A PostMessage和sendmessage其实主要的用途还不在于传输信息,以sendmessage为例(PostMessage差不多的用途,只是有点细微的不同,有兴趣了解的话百度即可),两个可以作为信息的参数WPARAM和LPARAM其实分别是int和long,所以(LPARAM)(ch)没有任何意义。
有两个方法可行,一是用socket,但是有点太大动干戈了
另一种很简单的方法是剪贴板,迅雷有个功能是监视剪贴板,就是比如我写下一个链接,然后选中,复制的话迅雷就会弹出下载。其实实现起来很简单,在mfc中有个OnTimer,在这里加入监控剪贴板代码的话就会一直监控。具体代码如下
新建一个工程,在默认对话框类中加入一个editbox,添加control变量c_show,然后在OnInitDialog中加入SetTimer(1,1,NULL);开始计时器
添加OnTimer消息,代码
void
CMy1Dlg::OnTimer(UINT_PTR
nIDEvent)

//
TODO:
在此添加消息处理程序代码和/或调用默认值
CString
s;
HANDLE
hClip;
if(OpenClipboard())
//打开剪贴板

hClip=GetClipboardData(CF_TEXT);//取出内存句柄
char
*buff;
buff=(char
*)GlobalLock(hClip);//锁定内存,取出数据
s=buff;//转换成CString
GlobalUnlock(hClip);//解锁
CloseClipboard();//关闭剪贴板
//这里要加入一定的判断条件了,迅雷只有监控到是链接才有反应,这里我们也可以加自己的条件,你的情况有两个,比如可以这样发现包含mystr:时就是第一种情况,第二种情况就是myip:
if(s.Find(_T("myip:"))>=0)
c_show.SetWindowTextW(s);//做出各种反应

CDialog::OnTimer(nIDEvent);

这就是接收程序了,发送程序比如作为按钮消息,按钮代码如下
CString
s;
s=_T("myip:192.168.1.1");//要发送的消息,记得加上面说的特定的标志,两者要一致
HGLOBAL
hClip;
if(OpenClipboard())

EmptyClipboard();
hClip=GlobalAlloc(GMEM_MOVEABLE,s.GetLength()+1);
char
*buff;
buff=(char*)GlobalLock(hClip);
strcpy(buff,s);//如果你用了Unicode这里会报错,改成strcpy(buff,cs2ca(s));
cs2ca函数见最后
GlobalUnlock(hClip);
SetClipboardData(CF_TEXT,hClip);
CloseClipboard();

char
*
cs2ca(CString
str)

char
*ptr;
#ifdef
_UNICODE
LONG
len;
len
=
WideCharToMultiByte(CP_ACP,
0,
str,
-1,
NULL,
0,
NULL,
NULL);
ptr
=
new
char
[len+1];
memset(ptr,0,len
+
1);
WideCharToMultiByte(CP_ACP,
0,
str,
-1,
ptr,
len
+
1,
NULL,
NULL);
#else
ptr
=
new
char
[str.GetAllocLength()+1];
sprintf(ptr,_T("%s"),str);
#endif
return
ptr;

如何在单独的 mfc 控制台应用程序中使用 mfc 应用程序的对话框?

【中文标题】如何在单独的 mfc 控制台应用程序中使用 mfc 应用程序的对话框?【英文标题】:How do I use an mfc application's dialog box in a separate mfc console application? 【发布时间】:2013-07-08 18:39:31 【问题描述】:

我有两个 MFC 应用程序。其中一个只是一个对话框,带有一些支持它的功能,另一个是控制台应用程序。如何使控制台应用程序能够打开位于其他应用程序中的对话框?

我尝试将对话应用程序构建为 dll 并导入它。此外,将现有项目添加到控制台项目并以这种方式链接它们。虽然我相信我已经关闭了链接,但我永远无法让控制台实例化对话框。有可能我也以错误的方式处理这部分。

有没有一种简单的方法可以导出我创建的对话框并将其导入另一个程序?如果我创建了一个名为“input”的项目并且它生成了 inputDlg.h/inputDlg.cpp,为什么我不能将它们移到另一个项目中并从它们那里调用?还是无法在初始项目之外使用对话框?

【问题讨论】:

【参考方案1】:

对话框(或任何其他 GUI 窗口)需要消息泵,但控制台应用程序通常没有消息泵。如果您希望控制台应用程序等到对话框关闭,最简单的方法是使用 Win32 API 而不是 MFC。只需通过调用 DialogBox 创建一个对话框。该 API 提供了自己的消息循环。

否则,您将采用多线程方法,控制台在主线程中运行。启动一个带有消息泵的辅助线程,并在该线程中创建基于 CDialog 的对话框。

【讨论】:

第一段有点混乱。从第一句话开始,我就在想“那不正确,模式对话框提供了自己的消息泵”。但是,你最后说了。问题只是 MFC 类绕过标准模态机制。【参考方案2】:

做我需要的:

    我在 Visual Studio 中打开了这两个项目的资源文件,并简单地复制/粘贴了我想在资源视图中传输的对话框。 然后我关闭了所有内容并打开了控制台项目。它包含我传输的对话框。我在资源视图中双击它,它打开了。 它仍然没有与之关联的类,所以我双击框架并打开了类向导。我将其命名为与第一个对话框项目中的名称相同 (WhateverDlg.h/WhateverDlg.cpp)。 然后我可以将我的代码从对话框项目复制并粘贴到控制台项目中。我只需要删除几行引用包装器 (Whatever.h) 的行,就完成了。

这使我能够在我的控制台程序中包含 WhatDlg.h 并使用 DoModal()。成功!

【讨论】:

以上是关于MFC中,如何控制另一个程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单独的 mfc 控制台应用程序中使用 mfc 应用程序的对话框?

将 UI 插入另一个 MFC 对话框

如何从 C++/MFC 程序中获取控制台窗口? [复制]

mfc 选项卡控制切换选项卡

如何在 C++ 中向 MFC 项目添加另一个 gui

MFC MDI应用程序中如何禁止激活其他文件?