對(duì)話框全屏代碼 -----在OnInitDialog函數(shù)中加入以下代碼
m_bFullScreen = FALSE;
// Call SHInitDialog with flags for full screen.
SHINITDLGINFO shidi;
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_FULLSCREENNOMENUBAR;
shidi.hDlg = m_hWnd;
SHInitDialog(&shidi);
// SHFullScreen fails if dialog box is not foreground.
SetForegroundWindow();
SHFullScreen(m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON|SHFS_HIDESTARTICON);
// Resize the window over the taskbar area.
nX = GetSystemMetrics(SM_CXSCREEN);
nY = GetSystemMetrics(SM_CYSCREEN);
MoveWindow(0,0,nX,nY, TRUE);
調(diào)用輸入法面板:SHSipPreference(AfxGetMainWnd()->m_hWnd, SIP_UP); //SipShowIM(SIPF_ON);
隱藏輸入法面板:SHSipPreference(AfxGetMainWnd()->m_hWnd, SIP_DOWN); //SipShowIM(SIPF_OFF);
/隱藏窗口右上角的OK按鈕和X按鈕
ModifyStyleEx(WS_EX_CAPTIONOKBTN,WS_EX_TOPMOST,SWP_NOMOVE);//窗口右上角的OK按鈕改為X按鈕
ModifyStyle(0, WS_NONAVDONEBUTTON, SWP_NOSIZE); //將X按鈕隱藏
使用unload.exe卸載程序
PROCESS_INFORMATION stProgressInfo;
CreateProcess(_T("\\Windows\\unload.exe"), szUninstallBuf, NULL, NULL, NULL, 0, NULL, NULL, NULL, &stProgressInfo) ;
szUninstallBuf這個(gè)參數(shù)必須和注冊(cè)表 HLM\SOFTWARE\APPS\下的對(duì)應(yīng)應(yīng)用的名稱一致。
有個(gè)前提,使用這個(gè)必須是在cab中沒有指定 nouninstall這個(gè)參數(shù)
/*
#define EWX_LOGOFF 0
#define EWX_SHUTDOWN 1
#define EWX_REBOOT 2 重啟
#define EWX_FORCE 4
#define EWX_POWEROFF 8 關(guān)機(jī)
*/
extern "C" BOOL ExitWindowsEx(UINT uFlags, DWORD dwReason);
ExitWindowsEx(EWX_REBOOT, 0); //重啟(軟重啟)
ExitWindowsEx(EWX_POWEROFF, 0); //關(guān)機(jī)
顯示或者隱藏等待圖標(biāo)
// Set the cursor as the wait cursor.
SetCursor (LoadCursor (NULL, IDC_WAIT));
// Hide the cursor.
SetCursor (0);
//獲取當(dāng)前剩余物理內(nèi)存:
#include <windows.h>
MEMORYSTATUS Status;
Status.dwLength = sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&Status);
//return Status.dwAvailPhys;
獲取電池電量剩余百分比:
SYSTEM_POWER_STATUS_EX stat;
GetSystemPowerStatusEx(&stat, TRUE);
if (stat.BatteryLifePercent > 100)
return -1;
else
return stat.BatteryLifePercent;
獲取磁盤剩余空間:
GetDiskFreeSpaceEx(NULL,
(PULARGE_INTEGER)&i64FreeBytesToCaller,
(PULARGE_INTEGER)&i64TotalBytes,
(PULARGE_INTEGER)&i64FreeBytes);
通過GPRS連接WAP的代碼:
HANDLE m_hConnection;
// 得到正確的連接信息
CONNMGR_DESTINATION_INFO networkDestInfo = {0};
// 得到網(wǎng)絡(luò)列表
DWORD dwEnumIndex=0;
for (; ; dwEnumIndex++ )
{
memset ( &networkDestInfo, 0, sizeof(CONNMGR_DESTINATION_INFO) );
if ( ConnMgrEnumDestinations ( dwEnumIndex, &networkDestInfo ) == E_FAIL )
break;
if(!_tcscmp(networkDestInfo.szDescription, _T("WAP")))
break;
}
CONNMGR_DESTINATION_INFO DestInfo = {0};
HRESULT hResult = ConnMgrEnumDestinations(dwEnumIndex, &DestInfo);
BOOL bRet = FALSE;
if(SUCCEEDED(hResult))
{
// 初始化連接結(jié)構(gòu)
CONNMGR_CONNECTIONINFO ConnInfo;
ZeroMemory(&ConnInfo, sizeof(ConnInfo));
ConnInfo.cbSize = sizeof(ConnInfo);
ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
ConnInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP | CONNMGR_FLAG_PROXY_WAP | CONNMGR_FLAG_PROXY_SOCKS4 | CONNMGR_FLAG_PROXY_SOCKS5;
ConnInfo.dwPriority = CONNMGR_PRIORITY_HIPRIBKGND;//CONNMGR_PRIORITY_USERINTERACTIVE;
ConnInfo.guidDestNet = /*IID_DestNetInternet*/DestInfo.guid;
ConnInfo.bExclusive = FALSE;
ConnInfo.bDisabled = FALSE;
DWORD dwStatus = 0;
hResult = ConnMgrEstablishConnectionSync(&ConnInfo, &m_hConnection, 100*1000, &dwStatus );
DWORD err = GetLastError();
if (SUCCEEDED(hResult))
{
//MessageBox(NULL,L"網(wǎng)絡(luò)連接成功",L"信息",MB_OK);
return TRUE;
}
else
{
//MessageBox(NULL,L"網(wǎng)絡(luò)連接失敗!!請(qǐng)檢查網(wǎng)絡(luò)狀況。",L"錯(cuò)誤",MB_OK);
return FALSE;
}
}
下面是封裝的一個(gè)socket類,可用在wince和wm上
1 // TCPClient_CE.h: interface for the CTCPClient_CE class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #if !defined(AFX_TCPCLIENT_CE_H__B7856B99_69E7_4868_9BA3_96152245C65E__INCLUDED_)
6 #define AFX_TCPCLIENT_CE_H__B7856B99_69E7_4868_9BA3_96152245C65E__INCLUDED_
7
8 #if _MSC_VER > 1000
9 #pragma once
10 #endif // _MSC_VER > 1000
11
12 #include <winsock2.h>
13 #include "yourProject.h"
14
15
16 //定義連接斷開事件
17 typedef void (CALLBACK* ONDISCONNECT)(CWnd*);
18 //定義當(dāng)有數(shù)據(jù)接收事件
19 typedef void (CALLBACK* ONREAD)(CWnd*,const char * buf,int len );
20 //定義Socket錯(cuò)誤事件
21 typedef void (CALLBACK* ONERROR)(CWnd*,int nErrorCode);
22
23 class CTCPClient_CE
24 {
25 public:
26 CTCPClient_CE();
27 virtual ~CTCPClient_CE();
28 public:
29 friend class YourApp;
30 //打開客戶端socket
31 bool Open(CWnd * pWnd);
32 //關(guān)閉客戶端socket
33 bool Close();
34 //與服務(wù)器端建立連接
35 bool Connect();
36 //向服務(wù)器端發(fā)送數(shù)據(jù)
37 bool SendDate(const char * buf , int len);
38 bool SendData(const char * buf , int len);
39 public:
40 //遠(yuǎn)程主機(jī)IP地址
41 CString m_remoteHost;
42 //遠(yuǎn)程主機(jī)端口
43 int m_port;
44
45 /*--以下客戶端通訊事件--*/
46 //連接斷開事件,回調(diào)函數(shù)
47 ONDISCONNECT OnDisConnect;
48 //接收數(shù)據(jù)事件,回調(diào)函數(shù)
49 ONREAD OnRead;
50 //發(fā)生錯(cuò)誤事件,回調(diào)函數(shù)
51 ONERROR OnError;
52 HANDLE m_hSynMutex; //同步互斥句柄
53 private:
54 //通訊Socket句柄
55 SOCKET m_socket;
56 //通訊線程退出事件句柄
57 HANDLE m_exitThreadEvent;
58 //通訊線程句柄
59 HANDLE m_tcpThreadHandle;
60 //父窗口句柄
61 CWnd * m_pOwnerWnd;
62 private:
63 //通訊線程函數(shù)
64 static DWORD SocketThreadFunc(LPVOID lparam);
65 };
66
67 #endif // !defined(AFX_TCPCLIENT_CE_H__B7856B99_69E7_4868_9BA3_96152245C65E__INCLUDED_)
68
// TCPClient_CE.cpp: implementation of the CTCPClient_CE class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "yourProject.h"
#include "TCPClient_CE.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//構(gòu)造函數(shù)
CTCPClient_CE::CTCPClient_CE()
{
INT iRet = 0;
//初始化socket環(huán)境
WSADATA wsd;
iRet = WSAStartup(MAKEWORD(2,2),&wsd);
int nNetTimeout=1000;//1秒
//創(chuàng)建互斥對(duì)象,默認(rèn)狀態(tài)為“未被線程擁有”
m_hSynMutex = CreateMutex(NULL,FALSE,NULL);
//創(chuàng)建線程退出事件句柄
m_exitThreadEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
}
//析構(gòu)函數(shù)
CTCPClient_CE::~CTCPClient_CE()
{
//釋放socket資源
WSACleanup();
//關(guān)閉線程退出事件句柄
CloseHandle(m_exitThreadEvent);
//關(guān)閉互斥對(duì)象
CloseHandle(m_hSynMutex);
}
/*--------------------------------------------------------------------
【函數(shù)介紹】: 此線程用于監(jiān)聽TCP客戶端通訊的事件,例如當(dāng)接收到數(shù)據(jù)、
連接斷開和通訊過程發(fā)生錯(cuò)誤等事件
【入口參數(shù)】: lparam:無類型指針,可以通過此參數(shù),向線程中傳入需要用到的資源。
在這里我們將CTCPClient_CE類實(shí)例指針傳進(jìn)來
【出口參數(shù)】: (無)
【返回 值】: 返回值沒有特別的意義,在此我們將返回值設(shè)為0。
---------------------------------------------------------------------*/
DWORD CTCPClient_CE::SocketThreadFunc(LPVOID lparam)
{
CTCPClient_CE *pSocket;
//得到CTCPClient_CE實(shí)例指針
pSocket = (CTCPClient_CE*)lparam;
//定義讀事件集合
fd_set fdRead;
int ret;
//定義事件等待時(shí)間
TIMEVAL aTime;
aTime.tv_sec = 1;
aTime.tv_usec = 0;
while (TRUE)
{
//收到退出事件,結(jié)束線程
if (WaitForSingleObject(pSocket->m_exitThreadEvent,0) == WAIT_OBJECT_0)
{
break;
}
//置空fdRead事件為空
FD_ZERO(&fdRead);
//給客戶端socket設(shè)置讀事件
FD_SET(pSocket->m_socket,&fdRead);
//調(diào)用select函數(shù),判斷是否有讀事件發(fā)生
ret = select(0,&fdRead,NULL,NULL,&aTime);
if (ret == SOCKET_ERROR)
{
//觸發(fā)錯(cuò)誤事件
pSocket->OnError(pSocket->m_pOwnerWnd,1);
//觸發(fā)連接斷開事件
pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
//關(guān)閉客戶端socket
closesocket(pSocket->m_socket);
break;
}
if (ret > 0)
{
if (FD_ISSET(pSocket->m_socket,&fdRead))
{
//發(fā)生讀事件
char recvBuf[1024];
int recvLen;
ZeroMemory(recvBuf,1024);
//接收數(shù)據(jù)
recvLen = recv(pSocket->m_socket,recvBuf, 1024,0);
if (recvLen == SOCKET_ERROR)
{
int iError = WSAGetLastError();
//觸發(fā)socket錯(cuò)誤事件
pSocket->OnError(pSocket->m_pOwnerWnd,iError);
//觸發(fā)與服務(wù)器斷開事件
pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
//關(guān)閉客戶端socket
closesocket(pSocket->m_socket);
break;
}
else if (recvLen == 0)
{
//觸發(fā)與服務(wù)器端斷開事件
pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
//關(guān)閉客戶端socket
closesocket(pSocket->m_socket);
break;
}
else
{
//觸發(fā)數(shù)據(jù)接收事件
pSocket->OnRead(pSocket->m_pOwnerWnd,recvBuf,recvLen);
}
}
}
}
return 0;
}
/*--------------------------------------------------------------------
【函數(shù)介紹】: 用于打開客戶端socket
【入口參數(shù)】: pWnd用于指定父窗口句柄
【出口參數(shù)】: (無)
【返回 值】: TRUE:打開成功;FALSE:打開失敗
---------------------------------------------------------------------*/
bool CTCPClient_CE::Open(CWnd * pWnd)
{
//復(fù)位線程退出事件
ResetEvent(m_exitThreadEvent);
//存儲(chǔ)父窗口句柄
m_pOwnerWnd = pWnd;
//創(chuàng)建TCP套接字
m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (m_socket == SOCKET_ERROR)
{
return FALSE;
}
//創(chuàng)建通訊線程
m_tcpThreadHandle = CreateThread(NULL,0,SocketThreadFunc,this,0,NULL);
if (m_tcpThreadHandle == NULL)
{
closesocket(m_socket);
return FALSE;
}
return TRUE;
}
/*--------------------------------------------------------------------
【函數(shù)介紹】: 用于關(guān)閉客戶端socket
【入口參數(shù)】: (無)
【出口參數(shù)】: (無)
【返回 值】: TRUE:關(guān)閉成功;FALSE:關(guān)閉失敗
---------------------------------------------------------------------*/
bool CTCPClient_CE::Close()
{
//發(fā)送通訊線程結(jié)束事件
SetEvent(m_exitThreadEvent);
Sleep(1000);
//關(guān)閉Socket,釋放資源
int err = closesocket(m_socket);
if (err == SOCKET_ERROR)
{
return FALSE;
}
return TRUE;
}
/*--------------------------------------------------------------------
【函數(shù)介紹】: 用于建立與TCP服務(wù)器連接
【入口參數(shù)】: (無)
【出口參數(shù)】: (無)
【返回 值】: TRUE:建立連接成功;FALSE:建立連接失敗
---------------------------------------------------------------------*/
bool CTCPClient_CE::Connect()
{
struct sockaddr_in addr;
int err;
addr.sin_family = AF_INET;
addr.sin_port = htons(m_port);
//此處要將雙字節(jié)轉(zhuǎn)換成單字節(jié)
char ansiRemoteHost[255];
ZeroMemory(ansiRemoteHost,255);
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,m_remoteHost,wcslen(m_remoteHost)
,ansiRemoteHost,wcslen(m_remoteHost),NULL,NULL);
addr.sin_addr.s_addr=inet_addr(ansiRemoteHost);
//此時(shí)采用同步連接方式,connect直接返回成功或是失敗
err = connect(m_socket,(struct sockaddr *)&addr,sizeof(addr));
if (err == SOCKET_ERROR)
{
return FALSE;
}
DWORD Result = GetLastError();
//select 模型,即設(shè)置超時(shí)
/* struct timeval timeout;
fd_set r;
FD_ZERO(&r);
FD_SET(m_socket, &r);
timeout.tv_sec = 15; //連接超時(shí)15秒
timeout.tv_usec = 0;
int ret = select(0, 0, &r, 0, &timeout);
if(ret <= 0)
{
::closesocket(m_socket);
return FALSE;
} */
//設(shè)置通訊模式為異步模式(阻塞模式)
DWORD ul= 1;
ioctlsocket(m_socket,FIONBIO,&ul);
return TRUE;
}
/*--------------------------------------------------------------------
【函數(shù)介紹】: 向服務(wù)器端發(fā)送數(shù)據(jù)
【入口參數(shù)】: buf:待發(fā)送的數(shù)據(jù)
len:待發(fā)送的數(shù)據(jù)長度
【出口參數(shù)】: (無)
【返回 值】: TRUE:發(fā)送數(shù)據(jù)成功;FALSE:發(fā)送數(shù)據(jù)失敗
---------------------------------------------------------------------*/
bool CTCPClient_CE::SendDate(const char * buf , int len)
{
int nBytes = 0;
int nSendBytes=0;
static int Count = 0;
Count += 1;
while (nSendBytes < len)
{
nBytes = send(m_socket,buf+nSendBytes,len-nSendBytes,0);
if (nBytes==SOCKET_ERROR )
{
DWORD Err = GetLastError();
int iErrorCode = WSAGetLastError();
// CString cs;
// cs.Format(L"%ld",Err);
// CString cs1;
// cs1.Format(L"%d",Count);
// MessageBox(NULL,cs,cs1,MB_OK);
//觸發(fā)socket的Error事件
OnError(m_pOwnerWnd,iErrorCode);
//觸發(fā)與服務(wù)器端斷開連接事件
OnDisConnect(m_pOwnerWnd);
//關(guān)閉socket
Close();
return FALSE;
}
nSendBytes = nSendBytes + nBytes;
if (nSendBytes < len)
{
Sleep(2000);
}
}
return TRUE;
}
bool CTCPClient_CE::SendData(const char * buf , int len)
{
//請(qǐng)求互斥對(duì)象
if (WaitForSingleObject(m_hSynMutex,INFINITE) == WAIT_OBJECT_0)
{
SendDate(buf,len);
}
//釋放對(duì)互斥對(duì)象的擁有權(quán)
ReleaseMutex(m_hSynMutex);
return TRUE;
}
上面就是封裝的socket類,類中的友元類是應(yīng)用程序類,我們?cè)赼pp中引入這個(gè)類,并在app類中實(shí)現(xiàn)它的void CALLBACK OnDisConnect(CWnd* pWnd); //連接斷開事件處理函數(shù);void CALLBACK OnError(CWnd* pWnd,int nErrorCode); //Socket錯(cuò)誤事件處理函數(shù);void CALLBACK OnRead(CWnd* pWnd,const char * buf,int len); //數(shù)據(jù)接收事件;上面三個(gè)方法最好都做成static方法,方便在程序中任意地方引用它。
在Windows Mobile中最小化,顯示圖標(biāo)在任務(wù)欄上
BOOL SampleDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
UINT nID = LOWORD( wParam );
switch(nID)
{
case 20:
{
this->ShowWindow(SW_SHOW);
return true;
}
break;
}
return CWnd::OnCommand(wParam,lParam);
}
當(dāng)然如果是再Windows程序中也可以用如下的方式寫:
在WinMain函數(shù)中設(shè)置回調(diào)函數(shù)。
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow
)
{
g_hInst = hInstance;
SHInitExtraControls();
// just call a dialog box, system will handle messaging, painting, etc...
DialogBox(hInstance,(LPCTSTR)IDD_NOTIFYMAIN, NULL,(DLGPROC)NotifyMain );
return 0;
}
在回調(diào)函數(shù)中處理:
LRESULT CALLBACK NotifyMain(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
switch(message)
{
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case 10:
{Your operation}
Break;
}
}
}
}
不斷更新中..........................