应用程序隐藏后重新执行调出问题,各位高手来看下错出在哪里

xumercury 2008-06-06 05:43:30
参考了很多代码去写。但是一直有问题。我写的如下。请各位高手帮我修改一下。实在是找不到问题所在了。
实现目标就是按按钮隐藏以后,再次执行EXE把隐藏的程序重新调出来而不是又打开一个。
很老的问题了。但是一直没解决。。。。

0.参考一个开源的播放器代码设计。
1.程序基于MFC对话框下实现。EVC4.0环境。
2.具体实现部分如下:
2.0 变量定义部分

/////////////////////////////////////////////////////////////////////////////
// CPlayerIIIApp:
// See playerIII.cpp for the implementation of this class
//playerIII.h文件中定义的
#define SHOWLIST (WM_USER+140)
#define HIDEMP3 (WM_USER + 141)
#define HIDEOPENMP3 (WM_USER + 142)
#define SHOWMP3WINDOW (WM_USER + 143)
#define VOLMUTE (WM_USER + 144)

2.1 初始化部分

BOOL CPlayerIIIApp::InitInstance()
{
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.

HWND hWnd;
hWnd = ::FindWindow(TEXT("PLAYER"),NULL);
if(hWnd != NULL)
{
//显示窗口。
::SendMessage (hWnd,ShowWindow(hWnd,SW_SHOW),0,0);//显示窗口
::SendMessage(hWnd,SHOWMP3WINDOW,0,0);//向MP3窗口发消息,让歌曲名,歌曲时控件显示。
::SetWindowPos(hWnd, HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//顶层
::SendMessage(hWnd,VOLMUTE,0,0);//发送静音控制,得到当前声音

return true;
}

HWND hWnd1;
hWnd1 = ::FindWindow(TEXT("OPENPLAYER"),NULL);
if(hWnd1 != NULL)
{
//显示窗口。
::SendMessage (hWnd1,ShowWindow(hWnd1,SW_SHOW),0,0);//显示窗口
::SetWindowPos(hWnd1, HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//顶层

return true;
}

CPlayerIIIDlg dlg;
m_pMainWnd = &dlg;
WNDCLASS wc = {0}; //注册类名为PLAY
::GetClassInfo(AfxGetInstanceHandle(),L"Dialog",&wc);
wc.lpszClassName=L"PLAYER";
AfxRegisterClass(&wc);

WNDCLASS wc1 = {0}; //OPENPLAY
::GetClassInfo(AfxGetInstanceHandle(),L"Dialog",&wc1);
wc1.lpszClassName=L"OPENPLAYER";
AfxRegisterClass(&wc1);
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}

// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}


2.2隐藏调用部分

BOOL CPlayerIIIDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
RegOpenKeyEx(HKEY_CURRENT_USER, gszBaseInstance, 0, 0, &g_hkVolume);

CoInitialize(NULL); //自己加的控制初始化,调用了winx.h文件
CenterWindow(GetDesktopWindow()); // center to the hpc screen



// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control
}



void CPlayerIIIDlg::OnHide()
{
// TODO: Add your control notification handler code here
m_test.SetWindowText(_T("hide first!"));
// m_test.ShowWindow(false);
RegCloseKey(g_hkVolume);
this->ShowWindow(SW_HIDE);//隐藏

}

LRESULT CPlayerIIIDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if (message == HIDEMP3) //预处理隐藏部分
{
RegCloseKey(g_hkVolume);
this->ShowWindow(SW_HIDE);
}

if (message == SHOWMP3WINDOW)//显示歌曲信息控件。预处理显示
{
m_test.ShowWindow(true);
}
return CDialog::WindowProc(message, wParam, lParam);
}


谢谢指点,期待回复!
如果需要完整代码请发邮件给我,谢谢了
mercury002@gmail.com
...全文
413 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsycloud 2008-06-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xumercury 的回复:]
谢谢zsycloud .
因为你没有设置你的程序一次只能生成一个实例的原因
这个如何去做?
大概的思路请教下。
我不太清楚的地方是,我不是设定了读注册名吗。如果没有才新建一个啊。有的话就叫出原来的。
设定一个实例怎么设定?
[/Quote]

哈哈哈。不好意思!过了个节,没有来上网,所以就没有及时看到帖子了。呵呵。不过,看来你已经解决问题了。呵呵。祝贺你!
xumercury 2008-06-10
  • 打赏
  • 举报
回复
http://blog.csdn.net/xumercury/archive/2008/06/07/2520276.aspx
这里总结了一下。嘿嘿
希望能帮助后面的朋友
xumercury 2008-06-07
  • 打赏
  • 举报
回复
揭帖了。。谢谢cnzdgs和zsycloud
Enable MFC Features这个。。我还是留着了。。还是比较好用的。呵呵。
xumercury 2008-06-07
  • 打赏
  • 举报
回复
谢谢了。。我试验下通过揭帖。
cnzdgs 2008-06-07
  • 打赏
  • 举报
回复
窗口类名是Windows中的概念,是一种窗口类型的名字,不是程序中class的名字。创建窗口前要注册窗口类名,Windows中定义了一些常用控件的类名,例如:EDIT、BUTTON等,可以直接使用,如果要使用自定义控件,就需要自己用RegisterClass来注册。在使用MFC时,在MFC类的内部自动完成了注册类的操作,所以不需要自己处理。所有CDialog类的默认类名都是#32770,如果需要用FindWindow查找窗口,就需要把这个类名改成一个专用的名字。修改方法为(以VC6为例):
在资源视图的根节点右击鼠标,选择属性,将Enable MFC Features前面的勾去掉,再在对话框资源上右击鼠标,选择属性,在第1页输入自定义的类名。在代码中,使用该对话框之前,用代码从#32770复制窗口类信息并注册为自己定义的类名:
WNDCLASS wc;
::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc);
wc.lpszClassName = "自己的类名,与对话框资源中输入的一致";
AfxRegisterClass(&wc);
xumercury 2008-06-07
  • 打赏
  • 举报
回复
加到一百分了。。解决这个问题就揭帖。。。好郁闷阿
xumercury 2008-06-07
  • 打赏
  • 举报
回复
不对啊。。主对话框里面也没设定阿。类名不就是你名的什么名字就是什么吗?我已经晕了。。搞了好几天了。。
或者我没找到。。。。。cnzdgs请教下您,类名怎么看啊。。。我是EVC,和6.0差不多。。但是我没找到
代码里面不是已经程序注册了吗?
还是没有注册进去。。。
xumercury 2008-06-07
  • 打赏
  • 举报
回复
我看看。。。好像忘记了。。。最近脑袋不太好使。。呃
cnzdgs 2008-06-07
  • 打赏
  • 举报
回复
你在对话框资源中设置类名了吗?
xumercury 2008-06-07
  • 打赏
  • 举报
回复
我检查了一下,好像是类名注册出了问题。我写的好像没注册到类名,一直是Dialog。我看了一下参考代码就改过来了。。
用SPY++就是有个<no name>(dialog)我要修改这个dialog为play就好了。。我的代码注册类名的地方有问题吗?都是原样COPY过来的。汗
请高手指点
xumercury 2008-06-06
  • 打赏
  • 举报
回复
好的.谢谢了。明天我先查一下.
cnzdgs 2008-06-06
  • 打赏
  • 举报
回复
建议你用SPY++查一下窗口类名,我估计你的窗口类名不是PLAYER。
xumercury 2008-06-06
  • 打赏
  • 举报
回复
谢谢zsycloud .
因为你没有设置你的程序一次只能生成一个实例的原因
这个如何去做?
大概的思路请教下。
我不太清楚的地方是,我不是设定了读注册名吗。如果没有才新建一个啊。有的话就叫出原来的。
设定一个实例怎么设定?
zsycloud 2008-06-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xumercury 的回复:]
谢谢CNZDGS
问题是
我第一次执行后点击按钮隐藏掉了界面,然后通过EXE文件去调回隐藏界面,但是失败了。打开的是一个新的界面。我是要把隐藏的那个叫出来

不好意思可能是我描述不清楚
谢谢
[/Quote]
这就对了,因为你没有设置你的程序一次只能生成一个实例的原因。重新一下吧。呵呵。
zsycloud 2008-06-06
  • 打赏
  • 举报
回复
  代码太多了没有看清。请问一下:你说的“重新执行调出问题”到底是什么问题呀?能不能说说具体什么现象呀?还有,按你的意图来说,你至少得先保证你的程序,在同一台机子上同一个时间只能生成一个实例。就如MSN一样,你一旦运行后,再想运行MSN用另一个用户名登录时,你得先退出原来的ID,才可以的。这样,当你隐藏程序后,再次执行EXE时,因为一次只能生成一个实例,所以才有可能唤出被隐藏的那个程序(实例)的呀。呵呵。 
xumercury 2008-06-06
  • 打赏
  • 举报
回复
谢谢CNZDGS
问题是
我第一次执行后点击按钮隐藏掉了界面,然后通过EXE文件去调回隐藏界面,但是失败了。打开的是一个新的界面。我是要把隐藏的那个叫出来

不好意思可能是我描述不清楚
谢谢
cnzdgs 2008-06-06
  • 打赏
  • 举报
回复
问题是什么?哪里出错?
m_test.ShowWindow(true);
应该用
m_test.ShowWindow(SW_SHOW);

16,472

社区成员

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

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

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