刚刚开始工作,最近搞测试程序,要模仿用户做设置分辨率的工作,从网上查了好久都没有查到相关的东西。经过几天的摸索总算把这个小东西搞了出来,拿出来和朋友们分享一下,希望对有需要的朋友有帮助。
考虑到篇幅的问题,注释就省了,很简单,相信对各位朋友都没有什么障碍的。
/*---------------------------------------------------------------------------------------
Win32 Application
Filename: Screen.cpp
author: Soucula
date: 06/14/05
----------------------------------------------------------------------------------------*/
#include "stdafx.h"
bool FindMainWindow(HWND &hwnd,PROCESS_INFORMATION &pi)
{
STARTUPINFO si;
DWORD d_pid;
int n_con;
ZeroMemory(&si,sizeof(si));
ZeroMemory(&si,sizeof(pi));
si.cb=sizeof(si);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
if(!CreateProcess(NULL,
"rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3",
NULL,NULL,FALSE,0,NULL,NULL,
&si,&pi))
return false;
n_con=0;
while(n_con20)
{
Sleep(1000);
for(hwnd=GetWindow(GetDesktopWindow(),GW_CHILD);
hwnd;
hwnd=GetWindow(hwnd,GW_HWNDNEXT))
{
::GetWindowThreadProcessId(hwnd,&d_pid);
if(d_pid==pi.dwProcessId)
if(GetWindow(hwnd,GW_CHILD)!=NULL)
{
n_con=20;
break;
}
}
n_con++;
}
if(n_con==20)
return false;
return true;
}
bool FindChildWindow(const HWND hwnd,const int count,HWND &hwndchild)
{
int n_count;
if(hwnd==NULL||count1)
return false;
n_count=0;
for(hwndchild=GetWindow(hwnd,GW_CHILD);
hwndchild;
hwndchild=GetWindow(hwndchild,GW_HWNDNEXT))
{
n_count++;
if(n_count==count)
break;
}
}
bool SetSolution(const HWND hwndscroll,const HWND hwndtext,const char *so1,char *so2)
{
int n_con;
char c_str[21];
char *n_po1;
char *n_po2;
if(hwndscroll==NULL||hwndtext==NULL)
return false;
if(so1==NULL||so2==NULL)
return false;
n_con=0;
while(n_con20)
{
PostMessage(hwndscroll,WM_KEYDOWN,VK_DOWN,0);
n_con++;
}
Sleep(1000);
GetWindowText(hwndtext,c_str,20);
n_po1=strstr(c_str,so1);
n_po2=strstr(c_str,so2);
n_con=0;
while(((!n_po1||!n_po2)||(n_po1n_po2))&&n_con20)
{
PostMessage(hwndscroll,WM_KEYDOWN,VK_UP,0);
Sleep(1000);
GetWindowText(hwndtext,c_str,20);
n_po1=strstr(c_str,so1);
n_po2=strstr(c_str,so2);
n_con++;
}
if(n_con==20)
return false;
return true;
}
bool GetOkWindow(const HWND hwnd,const PROCESS_INFORMATION pi,HWND &hwndok)
{
DWORD d_pid;
int n_con;
if(hwnd==NULL)
return false;
n_con=0;
while(n_con20)
{
Sleep(1000);
for(hwndok=GetWindow(GetDesktopWindow(),GW_CHILD);
hwndok;
hwndok=GetWindow(hwndok,GW_HWNDNEXT))
{
::GetWindowThreadProcessId(hwndok,&d_pid);
if(GetWindow(hwnd,GW_CHILD)!=NULL)
if(hwndok!=hwnd)
{
n_con=20;
break;
}
}
n_con++;
}
if(n_con==20)
return false;
return true;
}
void SetScreen(const char *so1,char *so2)
{
HWND pw_main;
HWND pw_chscroll;
HWND pw_chtext;
HWND pw_ok;
PROCESS_INFORMATION pi;
if(!FindMainWindow(pw_main,pi))
return;
if(!FindChildWindow(GetWindow(pw_main,GW_CHILD),11,pw_chscroll))
return;
if(!FindChildWindow(GetWindow(pw_main,GW_CHILD),14,pw_chtext))
return;
if(!SetSolution(pw_chscroll,pw_chtext,so1,so2))
return;
PostMessage(pw_main,WM_COMMAND,1,0);
if(!GetOkWindow(pw_main,pi,pw_ok))
return;
PostMessage(pw_ok,WM_COMMAND,1,0);
if(!GetOkWindow(pw_main,pi,pw_ok))
return;
PostMessage(pw_ok,WM_COMMAND,6,0);
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
SetScreen("1280","720");
return 0;
}
这个程式在win2000下已经通过验证了,在winxp下要将FindChildWindow中的count改为8和11。本来可以通过窗口文本来解决查找问题,但是由于该程式要用于多国语言的操作系统所以该方法不可行。由于技术水平的问题,一些不周到的地方在所难免,希望朋友们能够给予斧正,不胜感激。这又是本贴的一个目的。