2008年12月4日 星期四

防止重複執行程式

//防止重複執行程式
//方法一
HANDLE h = CreateMutex(NULL, TRUE, L"xxxxx");
if((h == NULL) || (GetLastError() == ERROR_ALREADY_EXISTS)) {
MessageBox(NULL,L"系統中已經有重複的程式正在執行",L"Error",MB_OK);
return 0;
}
//方法二
HWND h = FindWindow(NULL, L"xxxxx");
if(h != NULL) {
MessageBox(NULL,L"系統中已經有重複的程式正在執行",L"Error",MB_OK);
return 0;
}
//方法三
HANDLE h = CreateEvent(NULL, FALSE, FALSE, L"xxxxx");
if((h == NULL) || (GetLastError() == ERROR_ALREADY_EXISTS)) {
MessageBox(NULL,L"系統中已經有重複的程式正在執行",L"Error",MB_OK);
return 0;
}

2008年12月1日 星期一

[轉貼]偵測觸控筆持續押著螢幕的事件

在eVC中..
可以在OnLBottonDown使用SHRecognizeGesture(point, FALSE)函式
來偵測觸控筆持續押著螢幕的事件...

[轉貼]模擬滑鼠及鍵盤事件

由虛擬碼而知當
key=1表示您按下了滑鼠的左鍵
key=2表示您按下了滑鼠的右鍵依此類推...

keybd_event();是模擬鍵盤的動作(按下某個鍵)
mouse_event();是模擬滑鼠的動作
==================================
如何用程式觸發滑鼠按鍵的事件(如何模擬滑鼠的按鍵)
模擬滑鼠按左鍵:
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);// click down
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);// click down
模擬滑鼠按Double Click:
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);// click down
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);// click down
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);// click down
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);// click down
模擬滑鼠按右鍵:
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);// click down
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);// click down
==================================
如何用程式觸發鍵盤按鍵的事件(模擬鍵盤按鍵)
對Form1觸發Tab按鍵按下事件:
PostMessage(form1.Handle, WM_KEYDOWN, VK_TAB, 0);
對Edit1觸發Enter按鍵按下事件:
PostMessage(edit1.Handle, WM_KEYDOWN, VK_RETURN, 0);
對Edit1觸發Enter按鍵放開事件:
PostMessage(edit1.Handle, WM_KEYUP, VK_F1, 0);
對Edit1觸發 1 按鍵按下事件:
PostMessage(edit1.Handle, WM_KEYDOWN, 49, 0);
對Edit1觸發 A 按鍵按下事件:
PostMessage(edit1.Handle, WM_KEYDOWN, 65, 0);
==================================

[轉貼]鍵盤上的 key 對應查詢表

F1~F12 對應為 $70(112)~$7B(123)
A~Z 對應為 $41(65)~$5A(90)
0~9 對應為 $30(48)~$39(57)

鍵 十六進位 十進位 說明
----------------------------------------------------------------------
vk_LButton = $01; 1 滑鼠左鈕
vk_RButton = $02; 2 滑鼠右鈕
vk_Cancel = $03; 3 Control-Break 執行
vk_MButton = $04; 4 滑鼠中鈕
05-07 5-7 { NOT contiguous with L & RBUTTON }
vk_Back = $08; 8 BackSpace 鍵
vk_Tab = $09; 9 AB鍵
0A-0B 10-11 未定義
vk_Clear = $0C; 12 Clear
vk_Return = $0D; 13 Enter
0E-0F 14-15 未定義
vk_Shift = $10; 16 Shift
vk_Control = $11; 17 Ctrl
vk_Menu = $12; 18 Alt
vk_Pause = $13; 19 Pause
vk_Capital = $14; 20 Caps Lock
15-19 21-25 保留給Kanji使用
1A 26 未定義
vk_Escape = $1B; 27 Esc
1C-1F 29-31 保留給Kanji使用
vk_Space = $20; 32 SpaceBar
vk_Prior = $21; 33 Page Up
vk_Next = $22; 34 Page Down
vk_End = $23; 35 End
vk_Home = $24; 36 Home
vk_Left = $25; 37 Left Arrow
vk_Up = $26; 38 Up Arrow
vk_Right = $27; 39 Right Arrow
vk_Down = $28; 40 Down Arrow
vk_Select = $29; 41 Select
vk_Print = $2A; 42 OEM自訂使用
vk_Execute = $2B; 43 Execute
vk_SnapShot = $2C; 44 Print Screen
///////{ vk_Copy = $2C not used by keyboards }
vk_Insert = $2D; 45 Ins
vk_Delete = $2E; 46 Del
vk_Help = $2F; 47 Help
{ vk_0 thru vk_9 are the same as their ascii equivalents: '0' thru '9' }
vk_0 $30 48
vk_1 31 49
vk_2 32 50
vk_3 33 51
vk_4 34 52
vk_5 35 53
vk_6 36 54
vk_7 37 55
vk_8 38 56
vk_9 39 57
3A-40 58-64 未定義
////{ vk_A thru vk_Z are the same as their ASCII equivalents: 'A' thru 'Z' }
vk_A $41 65
vk_B 42 66
vk_C 43 67
vk_D 44 68
vk_E 45 69
vk_F 46 70
vk_G 47 71
vk_H 48 72
vk_I 49 73
vk_J 4A 74
vk_K 4B 75
vk_L 4C 76
vk_M 4D 77
vk_N 4E 78
vk_O 4F 79
vk_P 50 80
vk_Q 51 81
vk_R 52 82
vk_S $53 83
vk_T 54 84
vk_U 55 85
vk_V 56 86
vk_W 57 87
vk_X 58 88
vk_Y 59 89
vk_Z 5A 90
5B-5C 91-95 未定義
vk_NumPad0 = $60; 96 數字鍵
vk_NumPad1 = $61; 97 數字鍵
vk_NumPad2 = $62; 98 數字鍵
vk_NumPad3 = $63; 99 數字鍵
vk_NumPad4 = $64; 100 數字鍵
vk_NumPad5 = $65; 101 數字鍵
vk_NumPad6 = $66; 102 數字鍵
vk_NumPad7 = $67; 103 數字鍵
vk_NumPad8 = $68; 104 數字鍵
vk_NumPad9 = $69; 105 數字鍵
vk_Multiply = $6A; 106 * 鍵
vk_Add = $6B; 107 + 鍵
vk_Separator = $6C; 108 Separator 鍵
vk_Subtract = $6D; 109 -- 鍵
vk_Decimal = $6E; 110 . 鍵
vk_Divide = $6F; 111 / 鍵
vk_F1 = $70; 112
vk_F2 = $71; 113
vk_F3 = $72; 114
vk_F4 = $73; 115
vk_F5 = $74; 116
vk_F6 = $75; 117
vk_F7 = $76; 118
vk_F8 = $77; 119
vk_F9 = $78; 120
vk_F10 = $79; 121
vk_F11 = $7A; 122
vk_F12 = $7B; 123
vk_F13 = $7C; 124
vk_F14 = $7D; 125
vk_F15 = $7E; 126
vk_F16 = $7F; 127
vk_F17 = $80; 128
vk_F18 = $81; 129
vk_F19 = $82; 130
vk_F20 = $83; 131
vk_F21 = $84; 132
vk_F22 = $85; 133
vk_F23 = $86; 134
vk_F24 = $87; 135
88-8F; 136-143 未指定
vk_NumLock = $90; 144 Num Lock
vk_Scroll = $91; 145 Scroll Lock
92-B9; 146-185 未指定
BA-C0; 186-192 OEM自訂
C1-DA; 193-218 未指定
DB-E4; 219-228 OEM自訂
E5 ; 229 未指定
E6 ; 230 OEM自訂
E7-E8; 231-232 未指定
E9-F5; 233-245 OEM自訂
F6-FE; 246-254 未指定
============================================

2008年11月5日 星期三

[轉貼]匈牙利命名法簡單記法

{(g|m)_}?{type}{Desc}
{Desc}:{Word}+
Word:[A-Z][a-z, A-Z, 0-9]*

g:全域變數,否則m

Type:
int -> n(開頭)
long -> l
unsigned int / long -> un / ul
DWORD -> dw
WORD -> w
CString / string -> m_str
char* -> null terminated string -> psz / sz
BSTR -> bstr
combo box -> cb
list control / box -> lc

CList
m_EnterText -> m_strEnter / s_strEnter / g_strEnter

CCtDlgInput
CFont -> MFC 4.0 -> MFC 5.0

int nIdxInput, nIdxOutput;
int nCntFile, nCntCar;

count -> cnt;
index -> idx;
display -> disp;
Descrption -> desc

Macro
#define XXXX_XXXX

API: GetMediaFile

2008年10月28日 星期二

將數字在MSG BOX中顯示

int i = 100;
char str[10]="";
_itoa(i, str, 10);
CString GetIntStr(str);
MessageBox(NULL, GetIntStr, L"將數字在MSG BOX中顯示", MB_OK);

職場小笑話

新職員到崗(由上往下看)

老闆:萬分歡迎,沒有你我們的公司肯定大不一樣!
職員:如果工作太累,搞不好我會辭職的
老闆:放心,我不會讓這樣的事情發生的!
職員:我雙休日可以休息嗎?
老闆:當然了!這是底線!
職員:平時會天天加班到淩晨嗎?
老闆:不可能,誰告訴你的?
職員:有餐費補貼嗎?
老闆:還用說嗎,絕對比同行都高!
職員:有沒有工作猝死的風險?
老闆:不會!你怎麼會有這種念頭?
職員:公司會定期組織旅遊嗎?
老闆:這是我們的明文規定!
職員:那我需要準時上班嗎?
老闆:不,看情況吧
職員:工資呢?會準時發嗎?
老闆:一向如此!
職員:事情全是新員工做嗎?
老闆:怎麼可能,你上頭還有很多資深同事!
職員:如果領導職位有空缺,我可以參與競爭嗎?
老闆:毫無疑問,這是我們公司賴以生存的機制!
職員:你不會是在騙我吧?


進入公司後看真實的一幕.....(從後往前看)

2008年10月13日 星期一

CString與WCHAR及CString與char轉換

CString a = L"String Test";

//CString to WCHAR
WCHAR b[MAX_STRLEN];
wsprintf(b, (L"%s"), a);

//CString to char
char c[MAX_STRLEN];
WideCharToMultiByte(CP_OEMCP, NULL, a, -1, c, MAX_STRLEN, NULL, FALSE);

[轉貼]ShellExecuteEX 開啟外部程式並關閉它

SHELLEXECUTEINFO sei;
DWORD exitcode;

memset(&sei,0,sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask=SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = NULL;
sei.lpFile = "";
sei.lpParameters = "";
sei.nShow = SW_SHOWNORMAL;
ShellExecuteEx(&sei);

GetExitCodeProcess(sei.hProcess,&exitcode);
if(exitcode==STILL_ACTIVE)
{
TerminateProcess(sei.hProcess,0);
}

這樣可以開啟一個程式 並且關閉它喔

2008年9月24日 星期三

[轉貼]C++ vector 使用方法

#include vector

using namespace std;

vector v1;
vector ::iterator Iter1;

v1.push_back( 10 ); // 丟一個 integer 進去 vector
v1.push_back( 19 );

// v1.begin() : vector 的最前面
// v1.end() : vector 的最後面

for( Iter1 = v1.begin(); Iter1 < v1.end(); Iter1++ ){
cout << *Iter1 << ", "; // 取值,印出
}

cout << endl;
// 移除 第一個 Element
v1.erase (v1.begin());

// 移除 前兩個 Element
v1.erase (v1.begin(), v1.begin() + 1);

2008年9月19日 星期五

Data Conversions for C++

Decimal Conversions

Decimal To Hex

// Use _itoa( ) function and set radix to 16.

char hexstring[10];
int number = 30;
itoa( number, hexstring, 16);

// In hexstring is 1e.

Hex To Decimal

// You can use strtol function and you can specify base. 

char * hexstring= "ABCDEF";
char * p;
int number = strtol(hexstring, &p,16);

// A function that does this

bool HexToDecimal (char* HexNumber, int& Number)
{
char* pStopString;
Number = strtol (HexNumber, &pStopString, 16);
return (bool)(Number != LONG_MAX);
}

Decimal to time

char *DecToTime(float fTime, char *szTime)
{
int nHrs, nMin, nSec;
fTime *= 3600;
nHrs = (int)fTime / 3600;
nMin = (int)(fTime - nHrs * 3600) / 60;
nSec = (int)(fTime - nHrs * 3600 - nMin * 60);
wsprintf(szTime, "%02d.%02d.%02d Hrs.Min.Sec.", nHrs, nMin, nSec);
return szTime;
}

String Conversions

String to Hex

sscanf(string, %04X, &your_word16);
// where string = your string and
// 04 = length of your string and X = hex

Hex to CString

CString Str;
unsigned char Write_Buff[1];
Write_Buff[0] = 0x01;
Str.Format("0x0%x",Write_Buff[0]);

COleVariant to CString

CString strTemp;
COleVariant Var;
Var = "FirstName";
strTemp = Var.bstrVal;
AfxMessageBox(strTemp);

CString to char pointer

CString MyString = "ABCDEF";
char * szMyString = (char *)(LPCTSTR) MyString;
char *pBuffer = new char[1024];
CString strBuf = "Test";
pBuffer = strBuf.GetBuffer(sizeof(pBuffer));

char pointer to CString

char * mystring = "12345";
CString string = mystring;

Double to CString including thefractional part

CString strValue,strInt, strDecimal;
int decimal,sign;
double dValue = 4.125;
strValue = _fcvt(dValue,6,&decimal,&sign);
// Now decimal contains 1 because there is
// only one digit before the .

strInt = strValue.Left(decimal); // strInt contains 4
strDecimal = strValue.Mid(decimal); // strDecimal contains 125

CString strFinalVal;
strFinalVal.Format("%s.%s",strInt,strDecimal);
// strFinalVal contains 4.125

Double To CString

CString strValue;
int decimal,sign;

double dValue = 123456789101112;
strValue = _ecvt(dValue,15,&decimal,&sign);

CString To Double

strValue = "121110987654321";
dValue = atof(strValue
);

CString to LPCSTR

CString str1 = _T("My String");
int nLen = str1.GetLength();
LPCSTR lpszBuf = str1.GetBuffer(nLen);
// here do something with lpszBuf...........
str1.ReleaseBuffer();

CString to LPSTR

CString str = _T("My String");
int nLen = str.GetLength();
LPTSTR lpszBuf = str.GetBuffer(nLen);
// here do something with lpszBuf...........
str.ReleaseBuffer();

CString to WCHAR*

CString str = "A string here" ;
LPWSTR lpszW = new WCHAR[255];

LPTSTR lpStr = str.GetBuffer( str.GetLength() );
int nLen = MultiByteToWideChar(CP_ACP, 0,lpStr, -1, NULL, NULL);
MultiByteToWideChar(CP_ACP, 0, lpStr, -1, lpszW, nLen);
AFunctionUsesWCHAR( lpszW );
delete[] lpszW;

LPTSTR to LPWSTR

int nLen = MultiByteToWideChar(CP_ACP, 0, lptStr, -1, NULL, NULL);
MultiByteToWideChar(CP_ACP, 0, lptStr, -1, lpwStr, nLen);

string to BSTR

string ss = "Girish";
BSTR _bstr_home = A2BSTR(ss.c_str());

CString to BSTR

CString str = "whatever" ;
BSTR resultsString = str.AllocSysString();

_bstr_t to CString

#include 
#include
_bstr_t bsText("Hai Bayram");
CString strName;
W2A(bsText, strName.GetBuffer(256), 256);
strName.ReleaseBuffer();
AfxMessageBox(strName);

char szFileName[256];
GetModuleFileName(NULL,szFileName,256);
AfxMessageBox(szFileName);

Character arrays

Char array to integer

char MyArray[20];
int nValue;

nValue = atoi(MyArray);

Char array to float

char MyArray[20];
float fValue;

fValue = atof(MyArray);

Char Pointer to double

char *str = " -343.23 ";
double dVal;
dVal = atof( str
);

Char Pointer to integer

char *str = " -343.23 ";
int iVal
;
iVal = atoi( str );

Char Pointer to long

char *str = "99999";
long lVal;
lVal = atol( str
);

Char* to BSTR

char * p = "whatever";
_bstr_t bstr = p;

Float to WORD and Vice Versa

float fVar;
WORD wVar;
fVar = 247.346;
wVar = (WORD)fVar; //Converting from float to WORD.

//The value in wVar would be 247

wVar = 247;
fVar = (float)fVar; //Converting from WORD to float.
//The value in fVar would be 247.00


2008年9月3日 星期三

[轉貼]char和wchar的轉換

因為在之前的開發中~都是使用char宣告變數比如在用sprintf~~textout等函式都是用char的型態
但在使用vs2005之後都要改變成wchar才能執行雖然知道字串可以使用_T("字串")來轉成wchar
但如果是char和wchar之間的轉換有什麼方法嗎?

MultiByteToWideChar與WideCharToMultiByte

EX:
WCHAR * AnsiToUnicode(const char *str)
{
if( str == NULL ) return NULL;
int len = (int)strlen(str);
int nLen = ::MultiByteToWideChar(CP_ACP, 0,(char *)str, -1, NULL, NULL);
LPWSTR lpszW = new WCHAR[nLen];
::MultiByteToWideChar(CP_ACP, 0,(char *)str, len, lpszW, nLen);
lpszW[nLen-1] = 0;
return lpszW;
}

//回傳指標用完記得殺掉

2008年8月27日 星期三

BIOS回應聲音

Award BIOS
1短聲         系統正常啟動
2短聲         CMOS設定錯誤
1長聲1短聲      記憶體或主機板錯誤
1長聲2短聲      顯示卡或螢幕錯誤(大多是沒有偵測到螢幕)
1長聲3短聲      鍵盤錯誤
1長聲9短聲      BIOS記憶體錯誤
連續嗶聲        顯示卡未插好或沒有偵測到
連續急短聲       電源有問題

AMI BIOS
1短聲      記憶體刷新錯誤
1長音3短音   DRAM錯誤
1長音8短音   顯示測試失敗
2短聲      記憶體ECC檢查錯誤
3短聲      基本64K記憶體檢查失敗
4短聲      系統時間錯誤
5短聲      CPU錯誤
6短聲      Gate A20錯誤
7短聲      CPU中斷錯誤
8短聲      顯示卡記憶體錯誤
9短聲      ROM錯誤
10短聲     CMOS讀寫錯誤
11短聲     快取記憶體錯誤

Phoenix
1短          系統啟動正常
1短1短1短      系統開機初始化失敗
1短1短1短      主機板錯誤
1短1短3短      CMOS或電池失效
1短1短4短      ROM BIOS校驗錯誤
1短4短3短      EISA時序器錯誤
1短3短1短      RAM復新錯誤
3短1短2短      主DMA暫存器錯誤
3短1短3短      主中斷處理暫存器錯誤
3短2短4短      主機板鍵盤控制器錯誤
3短4短2短      顯示錯誤(顯示器或顯示卡)
4短2短2短      關機錯誤
4短4短1短      串列埠錯誤
4短4短2短      並列埠錯誤

[轉貼]System Tray範例

#include windows.h
#include shellapi.h
#include tchar.h
#include "resource.h"

#define SYSTRAY_ICON_UID 1001
#define WM_SYSTRAYNOTIFY WM_USER + 1

/* Global variables */
NOTIFYICONDATA NotifyIconData;
HICON IconHandle;

/* Global function declaration */
BOOL CALLBACK MainDialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);

/* Function definition */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
IconHandle = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC) MainDialogProc);

return 0;
}

BOOL CALLBACK MainDialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) {
switch (Msg) {

case WM_INITDIALOG:
/* Filling in NOTIFYICONDATA */

memset(&NotifyIconData, 0, sizeof(NOTIFYICONDATA));
NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);
NotifyIconData.hWnd = hDlg;
NotifyIconData.uID = SYSTRAY_ICON_UID;
NotifyIconData.hIcon = IconHandle;
NotifyIconData.uFlags = NIF_MESSAGE NIF_ICON NIF_TIP;
NotifyIconData.uCallbackMessage = WM_SYSTRAYNOTIFY;
_tcscpy(NotifyIconData.szTip, _T("Windows API - SysTray Icon Tutorial"));
return TRUE;

case WM_SYSTRAYNOTIFY:
NotifyIconData.hWnd = hDlg;

NotifyIconData.uID = SYSTRAY_ICON_UID;
Shell_NotifyIcon(NIM_DELETE, &NotifyIconData);
ShowWindow(hDlg, SW_SHOW);

break;

case WM_COMMAND:
switch (LOWORD(wParam)) {
case WM_DESTROY: EndDialog(hDlg, 0);
return TRUE;

case ID_SYSTRAY:
/* Call Shell_NotifyIcon to submit SysTray message */
Shell_NotifyIcon(NIM_ADD, &NotifyIconData);
/* Hide the main window */

ShowWindow(hDlg, SW_HIDE);
break;
}

}
return FALSE;

}
你必須要加入#include windows.h和#include shellapi.h,tchar.h是為了宣告_tcscpy和_T,若不使用_tcscpy和
_T話,則可以省略。
該程式是一Dialog-based應用程序,於WinMain內呼叫程式資源中的IDD_DIALOG1作為主程式版面,在初始化對話盒

時(i.e. 發出WM_INITDIALOG訊息),我們填上NOTIFYICONDATA內的資料,最重要的資料包括

hWnd:指定該SysTray圖示的主屬視窗程式uID:若一程式有多個SysTray圖示時,用來分辨多個圖示
hIcon:圖示的Handle,用來繪製圖示
uCallbackMessage:當滑鼠經過SysTray圖示時所發出的訊息
圖示的Handle可由LoadIcon( )函數獲取,詳情請參閱

http://itzone.hk/article/article.php?aid=200406210255103136

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/icons/iconreference/iconfunctions/loadicon.asp
而uCallbackMessage則是使用者定義的訊息代碼,在該程式中為:
#define WM_SYSTRAYNOTIFY WM_USER + 1其中WM_USER(即0x0400)及以後的數字,均為使用者定義訊息代

碼。
當NOTIFYICONDATA 內所有資料都填好後,便可以方進Shell_NotifyIcon(DWORD msg, NOTIFYICONDATA*

nid)裡,其中「msg」的值若是「NIM_ADD」的話,則表示你想把圖示新增至SysTray中;若為「NIM_DELETE」的
話,表示你想在 SysTray中,移除屬於該程式的圖示。
呼叫Shell_NotifyIcon( )時並不會把原本的視窗隱藏,你需要自行呼叫ShowWindow( )來隱藏或還原程式視窗。

[轉貼]System Tray介紹

1. 甚麼是SysTray(System Tray)圖示?
SysTray圖示就是Windows工作列的最右方所看到的小圖示,是為了讓程式能在背景執行時,
使用者仍能透過圖像介面來檢視及控制程式。例如ICQ、防毒軟件、音量控制等,都是背景執
行程式,在大部份時間內都不需要人手操作,使用者需要執行該程式的某功能時,便能從
SysTray中把它點擊還原至視窗模式。

在視窗編程的角度來看,SysTray圖示是 NotifyIcon component(提示圖示元件)的一部份,為
了讓背景程式能有效地與使用者溝通,整個元件除圖示外,還包括選單(Menu)、工具列
(Toolbar)、工具提示(ToolTip)、回傳訊息處理(Callback message handler)等等。

2. 基本SysTray結構
SysTray是屬於視窗作業系統的Shell控制元件(i.e. 使用Shell API),所有關於SysTray圖示的操
作,都會發出工作列狀態區域(Taskbar status area,即右下角載有圖示的區域)的訊息,而這
類訊息包含的所有資料,都由NOTIFYICONDATA這個數據結構封裝起來:
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
TCHAR szTip[64];
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];

union {
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
} NOTIFYICONDATA, *PNOTIFYICONDATA;

NOTIFYICONDATA內的各項說明,請參閱
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/structures/notifyicondata.asp

3. SysTray圖示應用實例要使用NOTIFYICONDATA,必須要在程式碼加入shellapi.h
#include shellapi.h

4. 使用提示本程式的按鈕會讓程式視窗隱藏起來,並即時設置SysTray圖示,當使用者把滑鼠放
上該SysTray圖示時,便會把視窗還原,並且刪除SysTray中的圖示。
當使用者把滑鼠放上圖示時,WM_SYSTRAYNOTIFY(是一個使用者定義的訊息,其名字可以
隨意更改)便會被發出,當時滑鼠的訊息(如 WM_LBUTTONUP、WM_RBUTTONDOWN等)
也會一併送出,並記錄在「lParam」中,而該圖示的uID也會記錄在「wParam」中,程式員
可利用「lParam」及「wParam」作更仔細的SysTray圖示處理,例如功能選單。

5. 後記根據MSDN(Microsoft Developer Network) Library所提及:
The taskbar notification area is sometimes erroneously called the "tray."

Folder Browser

#include shlobj.h

OnBTGetPath() {
char.zPathBuf[MAX_PATH];
BROWSEINFO bi;

bi.hwndOwner = m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szPathBuf; //存放路徑的buffer
bi.lpszTitle = "選擇目錄:"; //對話框標題
bi.ulFlags = 0 ;
bi.lpfn = NULL ;
bi.lParam = 0 ; //顯示瀏覽資料夾對話框

LPITEMIDLIST lpIDList = SHBrowseForFolder (&bi);

if (lpIDList) { //取得資料夾路徑至Buffer裡
SHGetPathFromIDList(lpIDList, szPathBuf);

if(memcmp(szPathBuf, "", sizeof(szPathBuf)) != 0) {
m_edPath.SetWindowText((LPCTSTR)szPathBuf);
m_csPath = szPathBuf;
}
}
LPMALLOC lpMalloc;

if(FAILED(SHGetMalloc(&lpMalloc))) return; //釋放內存
lpMalloc->Free(lpIDList);
lpMalloc->Release();
}
/*
如果想要在瀏覽資料夾的對話框開啟時,展開樹狀目錄在特定的資料夾上時,可做下列修改:
LPCTSTR lpszInitialPath = m_csPath;
bi.lpfn = BrowseCallBackProc;
bi.lParam = (LPARAM)lpszInitialPath; //預設的資料夾

然後再上面的OnBTGetPath()之前加上:
int CALLBACK BrowseCallBackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData){
if (uMsg == BFFM_INITIALIZED && lpData != NULL) {
::SendMessage(hwnd, BFFM_SETSELECTION, true, lpData);
}
return 0;
}
*/

[轉貼]WINDOWS執行指令集

善用「執行」對話框非常重要,因為有很多程式和某些功能必須使用「執行」對話框輸入指令來開啟,例如有名的登錄編輯程式regedit(當然你也可以到system32資料夾底下尋找,不過我相信你不會想這麼做的),下面幾個表列出了Windows的常見指令集,標示紅字的是我個人常用的指令,給各位做個參考:

屬於系統管理工具的:
‧certmgr.msc 憑證管理程式
‧compmgmt.msc 電腦管理
‧rdcomcnfg 系統元件服務
‧diskmgmt.msc 磁牒管理
‧eventvwr.msc 事件檢視器
‧fsmgmt.msc 共用資料夾管理程式
‧gpedit.msc 群組原則
‧lusrmgr.msc 本機使用者和群組設定
‧msconfig.exe 系統設定公用程式
‧ntmsmgr.msc 卸除式存放裝置管理程式
‧odbcad32 ODBC資料來源管理程式
‧rsop.msc 群組原則結果組
‧secpol.msc 本機安全性設定值
‧services.msc 本機服務元件設定
‧sysedit 系統組態編輯程式
‧wmimgmt.msc Windows管理體系結構(WMI)

屬於附屬應用程式的:
‧calc 啟動小算盤
‧charmap 啟動字元對應表
‧cleanmgr 磁碟檔案清理
‧chkdsk.exe 磁牒檢查程式
‧dfrg.msc 磁碟重組程式
‧eudcedit 造字程式
‧explorer 檔案總管
‧magnify 啟動放大鏡公用程式
‧mobsync 啟動同步處理程式
‧mspaint 啟動小畫家
‧mstsc 遠端桌面
‧notepad 開啟記事本
‧ntbackup 啟動備份還原精靈
‧osk 開啟螢幕小鍵盤
‧sndrec32 錄音程式
‧sndvol32 音量控制程程式
‧utilman 協助工具管理程式
‧winmsd 系統資訊
‧write 啟動WordPad  

不會顯示在開始捷徑列上的程式:
‧conf 啟動NetMeeting
‧ciadv.msc 索引服務程式
‧cliconfg SQL SERVER 用戶端網路公用程式
‧clipbrd 剪貼簿檢視器
‧ddeshare DDE共用設定程式
‧drwtsn32 系統醫生
‧dvdplay DVD播放程式
‧dxdiag 檢查DirectX資訊
‧iexpress 啟動iexpress
‧mplayer2 啟動windows media player 6 的版本
‧narrator Microsoft朗讀程式
‧packager 物件封裝程式
‧perfmon.msc 電腦效能監測程式
‧regedt32,regedit 登錄編輯程式
‧sigverif 檔案簽章驗證程式
‧taskmgr 工作管理員(2000/XP/2003)
‧tourstart XP簡介(安裝完成後出現的介紹XP程式)
‧winchat 區域網路聊天程式
‧wscript windows script host設定  

屬於控制台的:
‧devmgmt.msc 裝置管理員
‧mmc 開啟控制台
‧wiaacmgr 掃瞄機和數位相機精靈

DOS/特殊指令:
‧cmd.exe CMD命令提示字元
‧logoff 登出指令
‧net start messenger 開始messenger服務
‧net stop messenger 停止messenger服務
‧nslookup IP位址偵測器
‧oobe/msoobe /a 檢查Windows XP是否啟用
‧regsvr32 /u *.dll 停止dll檔案執行(*為dll檔名)
‧regsvr32 /u zipfldr.dll 取消Windows XP內建程式對ZIP支援
‧rononce -p 15秒倒數關機指令
‧sfc /scannow windows檔案保護,掃瞄並復原系統檔案
‧shrpubw 新增共用資料夾
‧syncapp 新增一個公事包
‧telnet telnet終端機
‧syskey 使用者帳戶加密,登入系統的雙重密碼
‧tsshutdn 60秒倒數計時關機指令
‧winver 檢查Windows版本
‧wupdmgr Windows Update