请教:VC 如果判断程序是手动启动还是自动启动的?

nslh520 2012-10-29 02:33:34
请教:VC 如何判断程序是手动启动还是自动启动的?

程序设置了自动启动,启动后最小化到托盘 只显示一个托盘图标,但这样 当我手动点运行程序的时候 程序不会弹出运行界面,要点托盘小图标才能运行界面,所以我想判断程序是手动启动 还是自动启动然后改变界面显示方式

我是新手 请大家帮忙 先谢过了!
...全文
468 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
nslh520 2012-10-30
  • 打赏
  • 举报
回复
多谢各位了 弄好了
「已注销」 2012-10-30
  • 打赏
  • 举报
回复
看完后才知道楼主瞎描述问题,以致大部分人都没答到点上。
DDXASP 2012-10-29
  • 打赏
  • 举报
回复
谢谢。
学习了
Gordon_Freeman 2012-10-29
  • 打赏
  • 举报
回复
很简单,如果自动启动,在注册表的位置,在你应用程序路径之后加上一个参数就可以了
比如我以前是这样做的:
写入注册表"c:\xxx.exe -slient",然后在程序中通过GetCommandLine获取命令行参数信息,判断有没有-slient字符串,如果有,就说明是自启动,如果没有,就说明是用户双击启动
「已注销」 2012-10-29
  • 打赏
  • 举报
回复
一运行后就是托盘图标一般都是通过加参数,具体的软件得看是什么参数。这个和直接打开后最小化不一样,这样的话一样没参数。你需要获取所有进程的命令行,并根据参数来判断。当然,这需要你自己收集各种软件的启动参数了。
breaksoftware 2012-10-29
  • 打赏
  • 举报
回复
不可能的,建议你研究下windows的API吧,我觉得是因为你对这些API非常不熟,导致这些问题的。
[Quote=引用 20 楼 的回复:]

还是不行 任然谢谢你
[/Quote]
nslh520 2012-10-29
  • 打赏
  • 举报
回复
还是不行 任然谢谢你
breaksoftware 2012-10-29
  • 打赏
  • 举报
回复
不好意思,那个dwRet的值,请传strParam长度in bytes。
[Quote=引用 18 楼 的回复:]

运行通过 不过没有实现功能 注册表下仍然是D:\Download\ExitWindow4\Debug\ExitWindow3.exe
[/Quote]
nslh520 2012-10-29
  • 打赏
  • 举报
回复
运行通过 不过没有实现功能 注册表下仍然是D:\Download\ExitWindow4\Debug\ExitWindow3.exe
breaksoftware 2012-10-29
  • 打赏
  • 举报
回复

#include<string>
using namespace std;
[Quote=引用 16 楼 的回复:]

D:\Download\ExitWindow4\ExitWindow3Dlg.cpp(288) : error C2065: 'string' : undeclared identifier
[/Quote]
nslh520 2012-10-29
  • 打赏
  • 举报
回复
D:\Download\ExitWindow4\ExitWindow3Dlg.cpp(288) : error C2065: 'string' : undeclared identifier
breaksoftware 2012-10-29
  • 打赏
  • 举报
回复
char pFileName[MAX_PATH+1]={0};
DWORD dwRet=GetModuleFileName(NULL,pFileName,MAX_PATH);
string strParam = pFileName;
strParam += " /nowindow";
lRet=RegSetValueEx(hKey,"ExitWindow3",0,REG_SZ,(BYTE *)strParam.c_str(),dwRet);
你试下,我没编译过,如果不行再改改。
nslh520 2012-10-29
  • 打赏
  • 举报
回复
多谢 不过这个是获得命令行参数 问题是我不知道怎么写入命令行参数 比如程序是abc.exe 怎么在注册表下写成 abc.exe_run 或者"abc.exe" "_run"
breaksoftware 2012-10-29
  • 打赏
  • 举报
回复
网上搜了一段,你试试
#include <windows.h>
  #include <stdio.h>
  #include <shellapi.h>
  int __cdecl main()
  {
  LPWSTR *szArglist;
  int nArgs;
  int i;
  szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
  if( NULL == szArglist )
  {
  wprintf(L"CommandLineToArgvW failed\n");
  return 0;
  }
  else
  {
  for( i=0; i<nArgs; i++)
  printf("%d: %ws\n", i, szArglist[i]);
  LocalFree(szArglist);// Free memory allocated for CommandLineToArgvW arguments.
  return(1);
  }
  }
[Quote=引用 12 楼 的回复:]

是的,我就是用注册表run项下写值
HKEY hKey;
LPCTSTR lpRun="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
long lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpRun,0,KEY_WRITE,&hKey);
if(lRet==ERROR_SUCCESS)
{
……
[/Quote]
nslh520 2012-10-29
  • 打赏
  • 举报
回复
是的,我就是用注册表run项下写值
HKEY hKey;
LPCTSTR lpRun="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
long lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpRun,0,KEY_WRITE,&hKey);
if(lRet==ERROR_SUCCESS)
{
char pFileName[MAX_PATH]={0};
DWORD dwRet=GetModuleFileName(NULL,pFileName,MAX_PATH);
lRet=RegSetValueEx(hKey,"ExitWindow3",0,REG_SZ,(BYTE *)pFileName,dwRet);
RegCloseKey(hKey);
if(lRet!=ERROR_SUCCESS)
{
MessageBox("系统参数错误,不能随系统自动运行");
}
} 这段是我写到注册表下的

谁能告诉我 用命令行参数的方法 启动的时候用getcommandline获取命令行参数进行判断 然后进行界面显示调整 多谢
breaksoftware 2012-10-29
  • 打赏
  • 举报
回复
大致明白你的意思了,不知道你的自启动是怎么做的。是不是在注册表的run项下写了值,如果是,就使用你说的方法,加个参数比如/nowindow,并在你的程序内部处理这个消息,使得自启动时不显示界面。其他时候不带这个参数就显示界面就行了。
nslh520 2012-10-29
  • 打赏
  • 举报
回复
托盘程序我写好了, 开机自动运行并且最小化到托盘,但现在的问题是:我点程序.exe时,不会弹出运行界面,要点托盘程序的小图标才会显示程序界面 所以需要一个方法来判断程序是自动还是手动启动 手动启动就弹出界面,自动运行就只有一个小托盘图标 我百度:有人建议用 参数行命令(abc.exe _run) 但这个我不知道怎么写,网上搜了好久也没有个比较适合初学者的代码
youngwolf 2012-10-29
  • 打赏
  • 举报
回复
看要你的用处,我建议专门写一个托盘程序,点击的时候,打开主程序,360应该是这样做的。
当然,如果你有部分程序常驻内存,比如服务,那应该专门写一个服务,不要与主程序混在一起。
nslh520 2012-10-29
  • 打赏
  • 举报
回复
用参数判断 具体怎么写代码了?多谢
zwfgdlc 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

不过 我在百度搜了一下 好像用到命令行参数 如 abc.exe _run 加一个_run 然后获取命令行参数进行判断,不知道有人知道这种方式没有?多谢
[/Quote]
就用参数方式判断.
一般也是这样做.
加载更多回复(6)

16,472

社区成员

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

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

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