wince應用開發的一些小功能(備忘)

 

整理下最近開發時用到得一些小功能,在網上都能找得到,整理下免得以後再找麻煩。

持續添加

一、自動隱藏鼠標

 

//自動計時,超過5次計時隱藏鼠標

void CMyDlg::OnTimer(UINT_PTR nIDEvent)

{

// TODO: 在此添加消息處理程序代碼和/或調用默認值

switch (nIDEvent)

{

case TIMER_HIDECURSOR:

{

m_nTimeCount += 1;

if (m_nTimeCount >= 5)

{

int i = ShowCursor(FALSE);                //隱藏光標

TRACE(_T("ShowCursor(FALSE)%d/n"),i);

for (int j=0; j<=i; j++)

{

ShowCursor(FALSE);                //隱藏光標

}

m_nTimeCount = 0;

}

}

break;

default:

break;

}

CDialog::OnTimer(nIDEvent);

}

 

 

//在MouseMove時清空隱藏鼠標計數,並顯示

void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: 在此添加消息處理程序代碼和/或調用默認值

m_nTimeCount = 0;    // 隱藏鼠標事件累積清零

int i = ShowCursor(TRUE);    // 顯示光標

for(int j=0;j>i;j--)

{

ShowCursor(TRUE);

}

CDialog::OnMouseMove(nFlags, point);

}

 

 

二、設置開機自動啓動

 

//如果希望取消wince桌面顯示,將Launch99改爲Launch50

BOOL SetAutoRun()

{

CString szKey(_T("init"));

HKEY hKey = 0;

HKEY hModuleKey;            // Module key handle

//LSTATUS rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKey, &hkeyFilter);

DWORD dwType, dwValueSize;

char* data = (char*)malloc(30);

memset(data, 0, 30);

LONG lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE, szKey, 0, KEY_READ, &hKey );

 

if (lResult == ERROR_SUCCESS)

{

TCHAR szLaunch[PATH_MAX] = {0};

GetModuleFileName(0, szLaunch, PATH_MAX);

LSTATUS rc = RegSetValueEx(

hKey,                   // Handle of an open key

_T("Launch99"),                // Address of subkey name

(DWORD) 0,              // Reserved field

REG_SZ,                 // Type of the key field

(PBYTE)szLaunch,          // Value for the field

PATH_MAX);            // Size of the field buffer

 

if (rc != ERROR_SUCCESS)

{

//AfxMessageBox(_T("Set path Value failed/r/n"));

return FALSE;

}

 

DWORD dwValue = 0x0014;

rc = RegSetValueEx(

hKey,                   // Handle of an open key

_T("Depend99"),                // Address of subkey name

(DWORD) 0,              // Reserved field

REG_BINARY,                 // Type of the key field

(PBYTE)(&dwValue),          // Value for the field

sizeof(DWORD));            // Size of the field buffer

 

if (rc != ERROR_SUCCESS)

{

//AfxMessageBox(_T("Set depend Value failed/r/n"));

return FALSE;

}

RegFlushKey(HKEY_LOCAL_MACHINE);

RegCloseKey(hKey);

 

return TRUE;

}

else

{

return FALSE;

}

}

 

 

三、設置系統分表率(需要系統支持)

 

BOOL SetSystemMetrics(DWORD dwWidth, DWORD dwHeight)

{

DEVMODE dm;

 

memset((char*)&dm, 0, sizeof(DEVMODE));   

dm.dmSize = sizeof(DEVMODE);

dm.dmPelsWidth = dwWidth;//1920

dm.dmPelsHeight = dwHeight;//1080

dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;

if (DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(NULL, &dm, NULL, 0, NULL))

{

return TRUE;

}

else

{

return FALSE;

}

}

 

 

四、讀取本地IP地址(只能讀IP,子網掩碼/網關等不能讀,也不能設置,要設置需要修改註冊表信息並重啓網卡/設備)

 

CString GetLocalIP()

{

HOSTENT *LocalAddress;

char *Buff;

TCHAR *wBuff;

CString strReturn = _T("");

 

//創建新的緩衝區

Buff = new char[256];

wBuff = new TCHAR[256];

//置空緩衝區

memset(Buff, '/0', 256);

memset(wBuff, TEXT('/0'), 256*sizeof(TCHAR));

//得到本地計算機名

if (gethostname(Buff, 256) == 0)

{

//轉換成雙字節字符串

size_t convertedChars = 0;

mbstowcs_s(&convertedChars, wBuff, 256*sizeof(TCHAR),Buff, 256);

//得到本地地址

LocalAddress = gethostbyname(Buff);

//置空buff

memset(Buff, '/0', 256);

//組合本地IP地址

sprintf_s(Buff, 256, "%d.%d.%d.%d/0", LocalAddress->h_addr_list[0][0] & 0xFF,

LocalAddress->h_addr_list[0][1] & 0x00FF, LocalAddress->h_addr_list[0][2] & 0x0000FF, LocalAddress->h_addr_list[0][3] & 0x000000FF);

//置空wBuff

memset(wBuff, TEXT('/0'), 256*sizeof(TCHAR));

//轉換成雙字節字符串

mbstowcs_s(&convertedChars, wBuff, 256*sizeof(TCHAR), Buff, 256);

//設置返回值

strReturn = wBuff;

}

else

{

}

 

//釋放Buff緩衝區

delete[] Buff;

Buff = NULL;

//釋放wBuff緩衝區

delete[] wBuff;

wBuff = NULL;

return strReturn;

}

 

五、通過註冊表來實現讀取/設置網卡相關信息(IP,MASK, GATEWAY,DNS等)

BOOL SetIpAddress(CString strIp,CString strMask,CString strGateWay, CString strDNS)
{
 //獲得網卡的設備名
 WCHAR Names[50];
 DWORD bytes;
 HANDLE m_hFileHandle = CreateFile(_T("NDS0:"), 0, 0, NULL,
  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
  (HANDLE) INVALID_HANDLE_VALUE);

 if( m_hFileHandle == INVALID_HANDLE_VALUE )
 {
  return FALSE;
 }

 // Get list of adapter names
 if (!DeviceIoControl(m_hFileHandle,
  IOCTL_NDIS_GET_ADAPTER_NAMES,
  NULL,0,
  Names,MAX_PATH,&bytes,NULL))
 {
  return FALSE;
 }
 DWORD len = wcslen(Names);
 Names[len] = 0;
 Names[len+1] = 0;
 CString strKeyName;
 strKeyName.Format(_T("Comm//%s//Parms//TCPIP"),Names);


 //打開註冊表對網卡IP信息對應子健進行修改
 HKEY   hkey;
 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,strKeyName,0,KEY_WRITE,&hkey)   !=   ERROR_SUCCESS)  
 {
  return FALSE;
 }
 DWORD   value;  
 value   =   0;
 WCHAR buffer[50];

 //set   EnableDHCP  
 if(RegSetValueEx(hkey,TEXT("EnableDHCP"),0,REG_DWORD,(const   unsigned   char   *)&value,sizeof(DWORD))   !=   ERROR_SUCCESS)  
  return FALSE;  
 //set   dns
 memset(buffer,0,100);
 memcpy(buffer,strDNS.GetBuffer(0),strDNS.GetLength()*sizeof(TCHAR));
 if(RegSetValueEx(hkey,TEXT("DNS"),0,REG_MULTI_SZ,(const   unsigned   char   *)buffer, strDNS.GetLength()*2+2) !=   ERROR_SUCCESS)  
  return FALSE;
 //set   ip   address  
 memset(buffer,0,100);
 memcpy(buffer,strIp.GetBuffer(0),strIp.GetLength()*sizeof(TCHAR));
 if(RegSetValueEx(hkey,TEXT("IpAddress"),0,REG_MULTI_SZ,(const   unsigned   char   *)buffer, strIp.GetLength()*2+2) !=   ERROR_SUCCESS)  
  return FALSE;
 //set   subnet   mask
 memset(buffer,0,100);
 memcpy(buffer,strMask.GetBuffer(0),strMask.GetLength()*sizeof(TCHAR));
 if(RegSetValueEx(hkey,TEXT("SubnetMask"),0,REG_MULTI_SZ,(const   unsigned   char   *)buffer, strMask.GetLength()*2+2) !=   ERROR_SUCCESS)  
  return FALSE;
 //set   gateway
 memset(buffer,0,100);
 memcpy(buffer,strGateWay.GetBuffer(0),strGateWay.GetLength()*sizeof(TCHAR));
 if(RegSetValueEx(hkey,TEXT("DefaultGateway"),0,REG_MULTI_SZ,(const   unsigned   char   *)buffer, strGateWay.GetLength()*2+2) !=   ERROR_SUCCESS)  
  return FALSE;
 RegFlushKey(hkey);
 RegCloseKey(hkey);

 // 重啓網卡,不用機器熱啓動
 HANDLE hNdis = CreateFile(_T("NDS0:"), 0, 0, NULL,
  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
  (HANDLE) INVALID_HANDLE_VALUE);
 if( hNdis == INVALID_HANDLE_VALUE )
 {
  //MessageBox(NULL,_T( "重啓網絡驅動時打開設備錯誤"),NULL,0);
  return FALSE;
 }

 // Send the device command.
 if (!DeviceIoControl( hNdis, IOCTL_NDIS_REBIND_ADAPTER,
  Names, _tcslen( Names) + sizeof( TCHAR ),    // buf contains the name of the
  NULL, 0, NULL, NULL ) )
 {
  CloseHandle(hNdis);
  return FALSE;
 }

 CloseHandle( hNdis );
 return TRUE;
}

BOOL GetIpAddress(CString& strIp,CString& strMask,CString& strGateWay, CString& strDNS)
{
 //獲得網卡的設備名
 WCHAR Names[50];
 DWORD bytes;
 HANDLE m_hFileHandle = CreateFile(_T("NDS0:"), 0, 0, NULL,
  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
  (HANDLE) INVALID_HANDLE_VALUE);

 if( m_hFileHandle == INVALID_HANDLE_VALUE )
 {
  return FALSE;
 }

 // Get list of adapter names
 if (!DeviceIoControl(m_hFileHandle,
  IOCTL_NDIS_GET_ADAPTER_NAMES,
  NULL,0,
  Names,MAX_PATH,&bytes,NULL))
 {
  return FALSE;
 }
 DWORD len = wcslen(Names);
 Names[len] = 0;
 Names[len+1] = 0;
 CString strKeyName;
 strKeyName.Format(_T("Comm//%s//Parms//TCPIP"),Names);


 //打開註冊表對網卡IP信息對應子健進行修改
 HKEY   hkey;
 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,strKeyName,0,KEY_READ,&hkey)   !=   ERROR_SUCCESS)  
 {
  MessageBox(NULL,TEXT("打開註冊表錯誤"),NULL,0);  
  return FALSE;
 }
 DWORD   dwEnableDHCP;  
 TCHAR buffer[50];
 DWORD dwType = 0, cbData = 0xffff;
 //query   EnableDHCP  
 if(RegQueryValueEx(hkey,TEXT("EnableDHCP"),0,&dwType,(PBYTE)&dwEnableDHCP,&cbData) !=   ERROR_SUCCESS)  
  return FALSE;   
 //query   dns
 cbData = 100;
 ZeroMemory(buffer, 50*sizeof(TCHAR));
 if(RegQueryValueEx(hkey,TEXT("DNS"),0,&dwType,(PBYTE)buffer, &cbData) !=   ERROR_SUCCESS)  
  return FALSE;
 strDNS = buffer;
  //set   ip   address  
 cbData = 100;
 ZeroMemory(buffer, 50*sizeof(TCHAR));
 if(RegQueryValueEx(hkey,TEXT("IpAddress"),0,&dwType,(PBYTE)buffer, &cbData) !=   ERROR_SUCCESS)  
  return FALSE;
 strIp = buffer;
//  //set   subnet   mask
 cbData = 100;
 ZeroMemory(buffer, 50*sizeof(TCHAR));
 if(RegQueryValueEx(hkey,TEXT("SubnetMask"),0,&dwType,(PBYTE)buffer, &cbData) !=   ERROR_SUCCESS)  
  return FALSE;
 strMask = buffer;
  //set   gateway
 cbData = 100;
 ZeroMemory(buffer, 50*sizeof(TCHAR));
 if(RegQueryValueEx(hkey,TEXT("DefaultGateway"),0,&dwType,(PBYTE)buffer, &cbData) !=   ERROR_SUCCESS)  
  return FALSE;
 strGateWay = buffer;
 
 RegCloseKey(hkey);

 return TRUE;
}

 

六、關閉屏幕顯示(需要驅動支持,我當前用的SDK不支持該功能)

// GDI Escapes for ExtEscape()
#define QUERYESCSUPPORT    8

#define GETVFRAMEPHYSICAL   6144
#define GETVFRAMELEN    6145
#define DBGDRIVERSTAT    6146
#define SETPOWERMANAGEMENT   6147
#define GETPOWERMANAGEMENT   6148


typedef enum _VIDEO_POWER_STATE {
 VideoPowerOn = 1,
 VideoPowerStandBy,
 VideoPowerSuspend,
 VideoPowerOff
} VIDEO_POWER_STATE, *PVIDEO_POWER_STATE;


typedef struct _VIDEO_POWER_MANAGEMENT {
 ULONG Length;
 ULONG DPMSVersion;
 ULONG PowerState;
} VIDEO_POWER_MANAGEMENT, *PVIDEO_POWER_MANAGEMENT;


void CloseOpenScreen(boolean yes)
{

 HDC gdc;
 int iESC=SETPOWERMANAGEMENT;

 gdc = ::GetDC(NULL);
 if (ExtEscape(gdc, QUERYESCSUPPORT, sizeof(int), (LPCSTR)&iESC, 0, NULL)==0)
  MessageBox(NULL,
  L"Sorry, your Pocket PC does not support DisplayOff",
  NULL,MB_OK);
 else
 {
  VIDEO_POWER_MANAGEMENT vpm;
  vpm.Length = sizeof(VIDEO_POWER_MANAGEMENT);
  vpm.DPMSVersion = 0x0001;

  // Power off the display
  if (yes)
  {
   vpm.PowerState = VideoPowerOff;
   ExtEscape(gdc, SETPOWERMANAGEMENT, vpm.Length, (LPCSTR) &vpm,
    0, NULL);
  }

  else
  {
   vpm.PowerState = VideoPowerOn;
   // Power on the display
   ExtEscape(gdc, SETPOWERMANAGEMENT, vpm.Length, (LPCSTR) &vpm,
    0, NULL);
  }
  ::ReleaseDC(NULL, gdc);
 }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章