打开手机系统界面总结(转)

打开设置页:

中文系统中:
        HWND hwndSetting = FindWindow(_T("Worker"), _T("设置"));
        SetForegroundWindow(hwndSetting);
     


英文系统中:
        HWND hwndSetting = FindWindow(_T("Worker"), _T("Settings"));
        SetForegroundWindow(hwndSetting);

说明:这种有个bug就是需要预先打开设置这个设置页面,而且打开后右上角的ok没掉了,点击界面后才会出现。 希望大家帮忙想一下办法。

以下方法测试没问题:


ctlpnl.exe

CreateProcess(_T("//Windows//ctlpnl.exe"), _T("cplmain.cpl, $Id/")……

如CreateProcess(L"//Windows//ctlpnl.exe", L"cplmain.cpl, 1",  ...

$Id取值:
0 对比度
1 密码
2 主人信息
3 电源
4 内存
5 关于
6 背光
7 调整屏幕
8 输入
9 声音和提醒
10 删除程序
11 菜单
12 按键
13 今日
14
15 无线数据交换
16 时钟
17 配置网络适配器
18 区域设置
19 连接
20 拨号盘
21
22 证书管理
23 蓝牙
24 错误报告
25 GPS 设置
26 无线管理器
27 加密
28 由 USB 连接到 PC
29 客户反馈


Control panel applets can be started programmatically. The format of the command is:

'/windows/ctlpnl.exe cpl_filename.cpl,applet_name,applet_index,tab_index'


打开程序页:

中文系统中:
HWND hWnd = FindWindow(L"Explore",L"程序");
SetForegroundWindow(hWnd);


英文系统中:
HWND hWnd = FindWindow(L"Explore",L"Programs");
SetForegroundWindow(hWnd);

同样也是需要预先打开程序这个进程

因为系统开启时默认是不会调用设置和程序这两个的。 各位大侠有什么好方法吗?之前好象有人问过

回复次数: 49

 

#1楼 得分:1 回复于:2009-08-07 09:37:01
UP
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#2楼 得分:0 回复于:2009-08-07 09:46:44
补充一下 如果要打开设置里的某项比如说对比关于里的  tabcontrol , 可以多加一个  值
参考 http://www.pocketpcdn.com/articles/controlpanel.html

如:
C/C++ code
            
            


TCHAR szParam[
100 ];
wsprintf(szParam,L
" cplmain.cpl,%d,%d " , 5 , 2 );

PROCESS_INFORMATION pi;
if ( ! ::CreateProcess(_T( " //Windows//ctlpnl.exe " ),
szParam, NULL, NULL, FALSE,
0 , NULL, NULL, NULL, & pi))
{
// Cannot start Control Panel process
}




但是打开  设置这个不知道如何解决那个  bug
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#3楼 得分:0 回复于:2009-08-07 09:53:09
C/C++ code
            
            

HWND SettingWnd
= ::FindWindow(L " Dialog " ,L "" );
if ( ! ::IsWindow(SettingWnd))
{
HWND StartMenuhWnd;
HWND HHTASK
= ::FindWindow(L " HHTaskBar " ,NULL);
::PostMessage(HHTASK,WM_KEYDOWN,VK_LWIN,
0xC0600001 );
::PostMessage(HHTASK,WM_KEYUP,VK_LWIN,
0xC0600001 );
while ( 1 )
{
StartMenuhWnd
= ::FindWindow(L " MNU " ,L "" );
if (::IsWindow(StartMenuhWnd))
{
break ;
}
}
::ShowWindow(StartMenuhWnd,SW_HIDE);
::PostMessage(StartMenuhWnd,WM_KEYDOWN,
0x26 , 0 );
::PostMessage(StartMenuhWnd,WM_KEYUP,
0x26 , 0 );
::PostMessage(StartMenuhWnd,WM_KEYDOWN,
0x26 , 0 );
::PostMessage(StartMenuhWnd,WM_KEYUP,
0x26 , 0 );
::PostMessage(StartMenuhWnd,WM_KEYDOWN,
0x0d , 0 );
}
else
{
::SetForegroundWindow(SettingWnd);
}



  这种方法是可以打开设置页,但是感觉效率很低
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#4楼 得分:0 回复于:2009-08-07 10:01:31
设置窗口只要被打开过,就不再关闭了,只是隐藏了。以后只要FindWindow就可以找的到,主要是第一次 如何打开它,我就模拟了一次进入它的情况,先找到上方的HHTaskBar,然后发送键盘消息给它,让它选中Setting的窗口。 设置窗口的 class 名称为 “Dialog”, 所以第二次执行就直接
SetForegroundWindow
#5楼 得分:1 回复于:2009-08-07 10:29:03
顶你个肺啊
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#6楼 得分:0 回复于:2009-08-07 10:29:17
通过remote spy 我看到这个窗口的坐标位置:



所以我断定是MNU这个窗口,接着我们向这个窗口发虚拟键

我们看一下这个窗口的特点:


Settings的位置是处于第二个,所以我们需要发两次WM_KEYDOWN和WM_KEYUP来模拟用户输入,移动到 Settings这个位置上,然后再调用VK_RETURN。

::ShowWindow(StartMenuhWnd,SW_HIDE); //将MNU这个窗口隐藏
                ::PostMessage(StartMenuhWnd,WM_KEYDOWN,0x26,0);//VK_UP
                ::PostMessage(StartMenuhWnd,WM_KEYUP,0x26,0);//VK_UP
                ::PostMessage(StartMenuhWnd,WM_KEYDOWN,0x26,0);//VK_UP
                ::PostMessage(StartMenuhWnd,WM_KEYUP,0x26,0);//VK_UP
                ::PostMessage(StartMenuhWnd,WM_KEYDOWN,0x0d,0);//VK_RETURN
#7楼 得分:1 回复于:2009-08-07 10:29:26
再次顶你个肺啊
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#8楼 得分:0 回复于:2009-08-07 10:33:48
上面的再多个移动虚拟键,就可以打开程序页面了

::PostMessage(StartMenuhWnd,WM_KEYDOWN,0x26,0);//VK_UP
                ::PostMessage(StartMenuhWnd,WM_KEYUP,0x26,0);//VK_UP
                ::PostMessage(StartMenuhWnd,WM_KEYDOWN,0x26,0);//VK_UP
                ::PostMessage(StartMenuhWnd,WM_KEYUP,0x26,0);//VK_UP
              ::PostMessage(StartMenuhWnd,WM_KEYDOWN,0x26,0);//VK_UP
              ::PostMessage(StartMenuhWnd,WM_KEYUP,0x26,0);//VK_UP
              ::PostMessage(StartMenuhWnd,WM_KEYDOWN,0x26,0);//VK_UP
                ::PostMessage(StartMenuhWnd,WM_KEYDOWN,0x0d,0);//VK_RETURN
#9楼 得分:1 回复于:2009-08-07 10:34:11
这小子不错,有前途。帮顶。。希望顶到胃出血。
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#10楼 得分:0 回复于:2009-08-07 10:34:48
解决 虽然不是什么好办法 期待更好的办法
  • nihao38用户头像
  • nihao38
  • (有问必答,有分必给)
  • 等 级:
#11楼 得分:1 回复于:2009-08-07 10:37:15
关注
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#12楼 得分:0 回复于:2009-08-07 11:23:51
顺便把所以打开页面的都总结一下:

打开电话的页面:
C/C++ code
            
            

PROCESS_INFORMATION pi;
if ( ! ::CreateProcess(_T( " //Windows//cprog.exe " ),
NULL, NULL, NULL, FALSE,
0 , NULL, NULL, NULL, & pi))
{

}


打开短信收件箱页面:
C/C++ code
            
            

PROCESS_INFORMATION pi;
if ( ! ::CreateProcess(_T( " //Windows//tmail.exe " ),
L
" -service /"SMS/" " , NULL, NULL, FALSE, 0 , NULL, NULL, NULL, & pi))
{
}



这里我用的是createProcess,更安全的还是建议用ShellExecuteEx,如果超出32个进程,shell会自动释放无用的进程
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#13楼 得分:0 回复于:2009-08-07 11:29:47
进入图片与视频:
//英文环境:
CProcessExecute::StartExeCute(L"//Windows//Start Menu//Programs//Pictures & Videos.lnk");


//中文环境:
CProcessExecute::StartExeCute(L"//Windows//“开始”菜单//程序//图片和视频.lnk");

其中
void CProcessExecute::StartExeCute(LPCTSTR lpFileName)
{
    SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = lpFileName;

ShExecInfo.lpParameters = L"";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
    ShellExecuteEx(&ShExecInfo);
}
#14楼 得分:1 回复于:2009-08-07 11:36:11
C/C++ code
            
            

其中
void CProcessExecute::StartExeCute(LPCTSTR lpFileName)
{
SHELLEXECUTEINFO ShExecInfo
= { 0 };
ShExecInfo.cbSize
= sizeof (SHELLEXECUTEINFO);
ShExecInfo.fMask
= SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd
= NULL;
ShExecInfo.lpVerb
= NULL;
ShExecInfo.lpFile
= lpFileName;

ShExecInfo.lpParameters
= L "" ;
ShExecInfo.lpDirectory
= NULL;
ShExecInfo.nShow
= SW_SHOW;
ShExecInfo.hInstApp
= NULL;
ShellExecuteEx(
& ShExecInfo);
}



这个应该是照相摄像功能的调用!
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#15楼 得分:0 回复于:2009-08-07 11:37:13
引用 14 楼 okadler0518 的回复:
C/C++ code
其中void CProcessExecute::StartExeCute(LPCTSTR lpFileName)
{
    SHELLEXECUTEINFO ShExecInfo= {0};
ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask= SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd= NULL;
ShExecInfo.lpVerb= NULL;
ShExecInfo.lpFile= lpFileName;

ShExecInfo.lpParameters= L"";
ShExecInfo.lpDirectory= NULL;
ShExecInfo.nShow= SW_SHOW;
ShExecInfo.hInstApp= NULL;
    ShellExecuteEx(&ShExecInfo);
}

这个应该是照相摄像功能的调用!


哈哈 不是的 你小子真是太菜了
#16楼 得分:0 回复于:2009-08-07 11:56:15
mark
#17楼 得分:0 回复于:2009-08-07 12:02:00
学习!~
#18楼 得分:0 回复于:2009-08-07 12:03:20
UYYYYYYYYYYYYYYYYYY
  • pysjp用户头像
  • pysjp
  • (咖啡恋人)
  • 等 级:
#19楼 得分:0 回复于:2009-08-07 12:27:56
mark
#20楼 得分:0 回复于:2009-08-07 12:30:13
必须顶一下.
#21楼 得分:0 回复于:2009-08-07 12:36:32
这个必须的
#22楼 得分:0 回复于:2009-08-07 12:37:49
很好哦,这个都没做过呢。学习
#23楼 得分:0 回复于:2009-08-07 12:37:56
顶一下.好
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#24楼 得分:0 回复于:2009-08-07 12:47:55
一些调用程序的方法可以用调用lnk或者exe的方法,可以通过remote spy 和 remote process来查看

然后直接ShellExecuteEx

其他方面的再继续研究 我再帖出来。
#25楼 得分:0 回复于:2009-08-07 13:00:10
引用 15 楼 czbever 的回复:
引用 14 楼 okadler0518 的回复:
C/C++ code
其中void CProcessExecute::StartExeCute(LPCTSTR lpFileName)
{
    SHELLEXECUTEINFO ShExecInfo= {0};
ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask= SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd= NULL;
ShExecInfo.lpVerb= NULL;
ShExecInfo.lpFile= lpFileName;

ShExecInfo.lpParameters= L"";
ShExecInfo.lpDirectory= NULL;
ShExecInfo.nShow= SW_SHOW;
ShExecInfo.hInstApp= NULL;
    ShellExecuteEx(&ShExecInfo);
}

这个应该是照相摄像功能的调用!


哈哈 不是的 你小子真是太菜了


看错了,这个是ShellExecuteEx。。。。哎。。
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#26楼 得分:0 回复于:2009-08-07 13:04:09


这个是系统快捷方式存放的地方 我们可以通过类似StartExeCute(L"//Windows//“开始”菜单//联系人.lnk"); 这样子  就可以进联系人的界面
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#27楼 得分:0 回复于:2009-08-07 13:45:42
找到一种更好的办法,反汇编fbrowser.dll,然后取得里面的函数,然后这样子就可以进任意的路径了,
之前不是有人问如何进入游戏这个页面吗,可以用这种方法:

C/C++ code
            
            

typedef BOOL (WINAPI
* FPSTARTBROWSER)( LPCWSTR lpszPath, INT i );
FPSTARTBROWSER StartBrowser;


HMODULE hInst;
hInst
= LoadLibraryW( L " fbrowser.dll " );
StartBrowser
= (FPSTARTBROWSER)GetProcAddressW( hInst, (LPCWSTR) 10 );
if ( StartBrowser )
{
if ( StartBrowser( L " //Windows//“开始”菜单//程序//游戏 " , 0 ) ) // 此路径可以是任意路径,但设置这个例外
{
MSG msg;

while ( GetMessage( & msg, NULL, 0 , 0 ) ) // 对该目录的消息循环进行处理,如果预先已经打开了shell32.exe,则消息循环在shell32.exe中,此时不需要处理消息循环,GetMessage直接返回NULL
{
TranslateMessage(
& msg);
DispatchMessage(
& msg);
}


}
}
FreeLibrary( hInst );


  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#28楼 得分:0 回复于:2009-08-07 14:19:44
消息循环在那边是为了响应非消息队列消息
#29楼 得分:0 回复于:2009-08-07 17:04:41
mark
#30楼 得分:0 回复于:2009-08-08 00:43:49
yes
  • UMU用户头像
  • UMU
  • (小开)
  • 等 级:
#31楼 得分:14 回复于:2009-08-08 15:51:55
进入图片与视频:

ShellExecuteEx ":MSPIMG"

:MSPIMG == pimg.exe
#32楼 得分:0 回复于:2009-08-08 17:40:04
哇呜哇呜哇呜哇呜
#33楼 得分:0 回复于:2009-08-08 17:43:53
行不行的啊???
#34楼 得分:0 回复于:2009-08-09 00:59:00
zhi 到了
#36楼 得分:0 回复于:2009-08-09 18:33:38
notice:)
#37楼 得分:0 回复于:2009-08-09 18:45:29
#38楼 得分:0 回复于:2009-08-09 19:10:42
引用 26 楼 czbever 的回复:
这个是系统快捷方式存放的地方 我们可以通过类似StartExeCute(L"//Windows//“开始”菜单//联系人.lnk"); 这样子  就可以进联系人的界面


这个函数是不是放在这里调用

int WINAPI WinMain(HINSTANCE hInstance,
                  HINSTANCE hPrevInstance,
                  LPTSTR    lpCmdLine,
                  int      nCmdShow)
#39楼 得分:0 回复于:2009-08-09 19:46:51
打开快捷方式或定位目标文件时出错,为什么会这样?
#40楼 得分:0 回复于:2009-08-09 22:16:04
好东东!
帮了大忙
  • egceo用户头像
  • egceo
  • (郑广智)
  • 等 级:
#41楼 得分:0 回复于:2009-08-10 02:11:06
mark
#42楼 得分:0 回复于:2009-08-10 04:56:17
引用 40 楼 itxixihaha 的回复:
好东东!
帮了大忙


怎么解决的,快捷方式成功创建了,可是链接不到exe ,咋回事?
#43楼 得分:0 回复于:2009-08-10 07:05:37
精华!
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#44楼 得分:0 回复于:2009-08-10 12:33:15
收帖 
#45楼 得分:0 回复于:2009-08-10 14:37:09
不知道好不好用哦!
#46楼 得分:0 回复于:2009-08-11 13:27:58
不错~~~学习了~
#47楼 得分:0 回复于:2009-08-11 18:05:08
学习了
#48楼 得分:0 回复于:2009-08-11 23:51:50
mark
  • czbever用户头像
  • czbever
  • (骑着蜗牛看世界)
  • 等 级:
#49楼 得分:0 回复于:2009-08-12 10:41:40
下面内容转自UMU先生 http://hi.baidu.com/umu618/blog/item/796944c2d702243ce5dd3bc7.html

BOOL StartBrowser(LPCWSTR lpszFolderPath, INT nStyle);

  参数说明

nStyle

0    Icon 模式,类似 Shell32.exe 的“程序”界面

1    Report 模式,类似 File Explorer 的界面

2    Report 模式,打开 /My Documents

3    和 0 一样,其它值自己试看看

  例子

typedef BOOL (WINAPI * FPSTARTBROWSER)(LPCWSTR lpszFolderPath, INT nListViewStyle);
FPSTARTBROWSER StartBrowser;


HMODULE hModule;
hModule = LoadLibraryW(L"fbrowser.dll");
if (NULL != hModule)
{
        StartBrowser = (FPSTARTBROWSER)GetProcAddressW(hModule, (LPCWSTR)10);
        if (NULL != StartBrowser)
        {
                if (StartBrowser(L"//", 0))//0表示Icon模式
                {
                        MSG msg;

                        while (GetMessage(&msg, NULL, 0, 0))
                        {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                        }
                }
        }
        FreeLibrary(hModule);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值