程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC程序設置桌面的分辨率

VC程序設置桌面的分辨率

編輯:vc教程

剛剛開始工作,最近搞測試程序,要模仿用戶做設置分辨率的工作,從網上查了好久都沒有查到相關的東西。經過幾天的摸索總算把這個小東西搞了出來,拿出來和朋友們分享一下,希望對有需要的朋友有幫助。

考慮到篇幅的問題,注釋就省了,很簡單,相信對各位朋友都沒有什麼障礙的。
/*---------------------------------------------------------------------------------------
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_con<20)
 {
  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||count<1)
  return false;
 
 n_count=0;
 for(hwndchild=GetWindow(hwnd,GW_CHILD);
 hwndchild;
 hwndchild=GetWindow(hwndchild,GW_HWNDNEXT))
 {
  n_count++;
  if(n_count==count)
   break;
 }

 return true;
}

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_con<20)
 {
  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_po1>n_po2))&&n_con<20)
 {
  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_con<20)
 {
  Sleep(1000);
  for(hwndok=GetWindow(GetDesktopWindow(),GW_CHILD);
  hwndok;
  hwndok=GetWindow(hwndok,GW_HWNDNEXT))
  {
   ::GetWindowThreadProcessId(hwndok,&d_pid);

  if(d_pid==pi.dwProcessId)
    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。本來可以通過窗口文本來解決查找問題,但是由於該程式要用於多國語言的操作系統所以該方法不可行。由於技術水平的問題,一些不周到的地方在所難免,希望朋友們能夠給予斧正,不勝感激。這又是本貼的一個目的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved