Windows對話框在屏幕居中顯示

Windows對話框在屏幕居中顯示

對話框(DIALOG)模板可以設定顯示位置,但因屏幕大小不一,總想讓對話框在屏幕居中顯示.

  1. 獲取窗口的矩形區域GetWindowRect(),計算窗口的寬和高
  2. 獲取屏幕寬和高GetSystemMetrics()
  3. 重新設置窗口位置

下面給出C源代碼便於移值到其它工程

bool CentreWindow(HWND hWnd)

{

RECT rect;

int width,height;

int x,y;

if(IsWindow(hWnd) == false)

return false;

::GetWindowRect(hWnd,&rect); // 獲取窗口的

width  = rect.right – rect.left; // 計算窗口寬度

height = rect.bottom – rect.top; // 計算窗口高度

x = GetSystemMetrics(SM_CXSCREEN)/2-width/2;// 計算窗口居中X

y = GetSystemMetrics(SM_CYSCREEN)/2-height/2;// 計算窗口居中Y

SetWindowPos(hWnd,HWND_TOP,x,y,0,0,SWP_NOSIZE);  // 移動窗口

return true;

}

Windows啟動瀏覽器並打開網頁

Windows啟動瀏覽器並打開網頁

啟動瀏覽器最簡單的方法是使用ShellExecute(),但無返回進程句炳,要關閉瀏覽器只能查找窗口.更好的方法是CreateProcess()啟動瀏覽器新進程並打帶網頁,並返回進程句柄,方便關閉瀏覽器.

BOOL CreateProcess(LPCTSTR lpApplicationName,//執行模塊名填空NULL即可

LPTSTR  lpCommandLine,//命令行填”瀏覽器Path+空格+網頁URL”

LPSECURITY_ATTRIBUTES lpProcessAttributes,//進程屬性  LPSECURITY_ATTRIBUTES lpThreadAttributes,//線程屬性

BOOL bInheritHandles,  //繼承進程句柄false

DWORD dwCreationFlags, //創建標誌填CREATE_NEW_CONSOLE

LPVOID lpEnvironment, //進程環境

LPCTSTR lpCurrentDirectory,// 進程的工作路徑填NULL

LPSTARTUPINFO lpStartupInfo, //STARTUPINFO結構

LPPROCESS_INFORMATION lpProcessInformation//PROCESS_INFORMATION結構

);

  1. 要注意的是命令行lpCommandLine:瀏覽器Path+空格+網頁URL
  2. 命令行最好使用寬字符Unicode否則路徑有漢字或非ASCII碼則無法運行
  3. 返回不為false則調用成功
  4. 保存lpProcessInformation返回瀏覽器新進柄

 

下麵給打開網頁源代碼,便於

bool Open_Url(char * url,char * browser_Path)

{

int result = 0;

char CommandA[2056];

WCHAR CommandW[2056];

int length;

SECURITY_ATTRIBUTES Security_Attributes_Process;// 進程屬性

SECURITY_ATTRIBUTES Security_Attributes_Thread;// 線程屬性

STARTUPINFO        Startup_Info;// 啟動信息

PROCESS_INFORMATION Process_Information;//  進程信息

strcpy(CommandA,browser_Path);

strcat(CommandA,” “);

strcat(CommandA,url);

// 轉換UNICODE

length = MultiByteToWideChar(CP_ACP, NULL, CommandA, strlen(CommandA), CommandW, sizeof(CommandW));

CommandW[length] = NULL;

// 進程屬性

Security_Attributes_Process.nLength              = sizeof(SECURITY_ATTRIBUTES);

Security_Attributes_Process.lpSecurityDescriptor = NULL;

Security_Attributes_Process.bInheritHandle       = true;

// 線程屬性

Security_Attributes_Thread.nLength               = sizeof(SECURITY_ATTRIBUTES);

Security_Attributes_Thread.lpSecurityDescriptor  = NULL;

Security_Attributes_Thread.bInheritHandle        = true;

// 啟動信息

ZeroMemory( &Startup_Info, sizeof(STARTUPINFO) );

Startup_Info.cb = sizeof(STARTUPINFO);

ZeroMemory( &Process_Information, sizeof(PROCESS_INFORMATION) );

// 創建進程

result = CreateProcessW(NULL,

CommandW,

&Security_Attributes_Process,

&Security_Attributes_Thread,

FALSE,

CREATE_NEW_CONSOLE,

NULL,

NULL,

&Startup_Info,

&Process_Information);

// 獲取進程句柄

if(result != 0)

return true;

else

return false;

}

Windows 默認瀏覽器路徑

Windows 默認瀏覽器路徑

Windows默認瀏覽器的路徑在註冊表(REGEDIT.EXE)的HKEY_CLASSES_ROOT\http\shell\open\command\,提取數據需要使用下面三個註冊表操作函數.並給出設計思路源碼

  1. 打開註冊表句柄RegOpenKeyEx()
  2. 提取數據RegQueryValueEx()
  3. 關閉註冊表句柄RegCloseKey()
  4. 提取在雙引號中的瀏覽器路徑

 

char   Browser_Path[2056];// 瀏覽器路徑

// ————————————————————–

// 獲取系統默認瀏覽器路徑

// ————————————————————–

char * Get_WebBrowserPath_SEO(void)

{

long ret;

HKEY hKey;// 註冊表句柄

WCHAR path[2056];//

char  data[2056];

DWORD length;

// 打開註冊表

// HKEY_CLASSES_ROOT\http\shell\open\command

ret = RegOpenKeyExW(HKEY_CLASSES_ROOT,L”http\\shell\\open\\command”,0,KEY_ALL_ACCESS,&hKey);

if(ret != ERROR_SUCCESS)

return NULL;

// 獲取REG_SZ

DWORD type = REG_SZ;//類型

length = sizeof(path);//

ret = RegQueryValueExW(hKey,NULL,NULL,&type,(PBYTE)path,&length);

if(ret != ERROR_SUCCESS)

return NULL;

// 關閉註冊表句柄

RegCloseKey(hKey);

// 轉換為UTF-8

length  = WideCharToMultiByte(CP_UTF8, NULL, path, wcslen(path), data, sizeof(data), NULL, NULL);

data[length] = NULL;

// 清零

memset(Browser_Path,0,sizeof(Browser_Path));

// 提取路徑

for(int i = 0,index = 0;i<(int)length; ++i)

{

if(data[i] == ‘”‘ && index != 0)

break;// 讀取完畢跳出

if(data[i] != ‘”‘)

{

Browser_Path[index] = data[i];

++index;

}

}

return Browser_Path;// 返回路徑

}

Windows之ANSI和UNICODE與UTF8相互轉換

Windows之ANSI和UNICODE與UTF8相互轉換

因為Windows控件全部使用UNICODE編碼字符(或ANSI),而我文人卻喜歡使用UTF8編碼字符,所以需要在UTF8與UNICODE之間相互轉換,而我在2010年12月7日寫的一個字符轉換函式庫剛好派上用場.所有轉換MultiByteToWideChar()與WideCharToMultiByte()兩個函式完成,轉換後以NULL字符結尾.特將其簡化並記錄如下,便於以後移植使用.

多字節字符(ANSI/UTF-8)轉換寬字符(UNICODE)

int MultiByteToWideChar(

UINT CodePage,         // 代碼頁

DWORD dwFlags,         // 字符標誌, 默認設為0

LPCSTR lpMultiByteStr, //多字節字符

int cchMultiByte,      //多字節字符個數

LPWSTR lpWideCharStr,  // 寬字符輸出緩存

int cchWideChar        //寬字符緩存大小

);

寬字符(UNICODE)轉換多字節字符(ANSI/UTF-8)

int WideCharToMultiByte(

UINT CodePage,         //代碼頁

DWORD dwFlags,         // 字符標誌, 默認設為0

LPCWSTR lpWideCharStr, // 寬字符

int cchWideChar,       //寬字符長度

LPSTR lpMultiByteStr,  //多字節字符輸出緩存

int cchMultiByte,      //多字節字符緩存輸出大小

LPCSTR lpDefaultChar,  // 自定義寬字符,默認設為NULL

LPBOOL lpUsedDefaultChar   // 是否使用寬字符

);

//——————————————————————

// Ansi轉換Unicode

// Unicode:Unicode碼文本輸出

// Unicode_Size:Unicode碼輸出緩衝區WORD的長度

// Ansi:ANSI碼文本輸入,以NULL字符接尾

// Encode:ANSI文本字符編碼

// 返回值:Unicode 字符個數!(Unicode一個字符需兩個字節)

//——————————————————————

int Ansi_To_Unicode(WCHAR * Unicode,int Unicode_Size,char * Ansi,int Encode)

{

int Unicode_Length;// Unicode 字符個數!非字節數!

if(Unicode == NULL || Ansi == NULL)

return 0;

// Ansi轉換Unicode

Unicode_Length = MultiByteToWideChar(Encode, NULL, Ansi,strlen(Ansi), Unicode, Unicode_Size);// 轉換

Unicode[Unicode_Length] = 0;

return Unicode_Length;

}

 

//——————————————————————

//Unicode轉換Ansi

//Ansi:ANSI碼文本輸出

//Unicode_Size:Unicode碼輸出緩衝區WORD的長度

//Unicode:Unicode碼文本輸入

//返回值:Ansi所占字節數!

//——————————————————————

int Unicode_To_Ansi(char* Ansi,int Ansi_Size,PWORD Unicode)

{

int Ansi_Length;

if(Ansi == NULL || Unicode == 0)

return 0;

//Unicode轉換Ansi

Ansi_Length = WideCharToMultiByte(CP_ACP, NULL, Unicode, wcslen(Unicode), Ansi, Ansi_Size, NULL, NULL);

Ansi[Ansi_Length] = NULL;

return Ansi_Length;

}

 

//——————————————————————

// UTF-8 轉 Unicode

//Unicode:Unicode碼文本輸出

//Unicode_Size:Unicode碼輸出緩衝區WORD的長度

//Utf8:Utf-8文本輸入

//返回值:UTF-8字符個數!

//——————————————————————

int Utf8_To_Unicode(WCHAR * Unicode,int Unicode_SIze,char * Utf8)

{

int Unicode_Length;

if(Utf8 == NULL || Unicode == NULL )

return 0;

// UTF-8 轉 Unicode

Unicode_Length = MultiByteToWideChar(CP_UTF8, NULL, Utf8, strlen(Utf8), Unicode, Unicode_SIze);

Unicode[Unicode_Length] = NULL;

return Unicode_Length;

}

 

//——————————————————————

// UTF-8 轉 Unicode

//Utf8:UTF-8字符輸出

//Utf8_Size:UTF-8碼輸出緩衝區BYTE的長度

//Unicode:Unicode寬字符輸入

//返回值:Unicode所占字節數!

//——————————————————————

int Unicode_To_Utf8(char * Utf8,int Utf8_Size,WCHAR * Unicode)

{

int Utf8_Length;

if(Utf8 == NULL || Unicode == NULL)

return 0;

// UTF-8 轉 Unicode

Utf8_Length = WideCharToMultiByte(CP_UTF8, NULL, Unicode, wcslen(Unicode), Utf8, Utf8_Size, NULL, NULL);

Utf8[Utf8_Length] = NULL;

return Utf8_Length;

}

 

//—————————————————————————

//Ansi 轉 Utf8

//Utf8:UTF-8字符輸出

//Utf8_Size:UTF-8碼輸出緩衝區BYTE的長度

//Ansi:ANSI文本輸入

//Encode:ANSI文本字符編碼

//返回值:Utf8字節長度

//—————————————————————————

int Ansi_To_Utf8(char * Utf8,int Utf8_Size,char * Ansi,int Encode)

{

int Utf8_Length = NULL;

PWORD Unicode;

int   Unicode_Size;

int   Unicode_Length;

Unicode = (PWORD)Utf8;

Unicode_Size = Utf8_Size/2;

// Ansi 轉 Unicode

//Unicode_Length = Ansi_To_Unicode(Unicode,Unicode_Size,Ansi,Encode);

Unicode_Length = MultiByteToWideChar(Encode, NULL, Ansi,strlen(Ansi), Unicode, Unicode_Size);// 轉換

Unicode[Unicode_Length] = 0;

// Unicode 轉 Utf8

//Utf8_Length = ::Unicode_To_Utf8(Utf8,Utf8_Size,Unicode);

Utf8_Length = WideCharToMultiByte(CP_UTF8, NULL, Unicode, wcslen(Unicode), Utf8, Utf8_Size, NULL, NULL);

Utf8[Utf8_Length] = NULL;

return Utf8_Length;

}

//—————————————————————————

// Utf8 轉換 Ansi

// Ansi: ANSI文本輸出

// Ansi_Size:ANSI碼輸出緩衝區BYTE的長度

// Utf8: UTF-8字符輸入

// 返回值:Ansi字節長度

//—————————————————————————

int Utf8_To_Ansi(char * Ansi,int Ansi_Size,char * Utf8)

{

int Ansi_Length = NULL;

PWORD Unicode;

int   Unicode_Size;

int   Unicode_Length;

Unicode = (PWORD)Ansi;

Unicode_Size = Ansi_Size/2;

// Utf8 轉 Unicode

//Unicode_Length = Utf8_To_Unicode(Unicode,Unicode_Size,Utf8);

Unicode_Length = MultiByteToWideChar(CP_UTF8, NULL, Utf8, strlen(Utf8), Unicode, Unicode_Size);

Unicode[Unicode_Length] = NULL;

// Unicode 轉 Ansi

//Ansi_Length = ::Unicode_To_Ansi(Ansi,Ansi_Size,Unicode);

Ansi_Length = WideCharToMultiByte(CP_ACP, NULL, Unicode, wcslen(Unicode), Ansi, Ansi_Size, NULL, NULL);

Ansi[Ansi_Length] = NULL;

return Ansi_Length;

}

 

編碼類型 數值 說明
CP_ACP 0 默認ANSI代碼頁
CP_OEMCP 1 默認OEM代碼頁
CP_MACCP 2 默認MAC代碼頁
CP_THREAD_ACP 3 本線程ANSI代碼頁
CP_SYMBOL 42 SYMBOL轉換
CP_UTF7 65000 UTF-7轉換
CP_UTF8 65001 UTF-8轉換
CP_ANSI 1252 通用ANSI 代碼頁
ISO_8859_1 28591 西歐語言
ARABIC 1256 阿拉伯語
GENERAL 1252 通用
DUTCH 1252 荷蘭,德國
CZECH 1250 捷克斯洛伐克
HUNGARIAN 1250 匈牙利
ICELANDIC 1252 冰島
NORDIC 1252 北歐日耳曼民族的
NORWDAN 1252
POLISH 1250 波蘭
CYRILLIC 1251 西裏爾字母
SPANISH 1252 西班牙
SWEDFIN 1252
TURKISH 1254 土耳其語, 突厥語族
GREEK 1253 希臘
HEBREW 1255 希伯來語
JAPANESE 932 日本
KOREAN 949 朝鮮
BIG5 950 正體中文
GB2312 936 簡體中文
GBK 936 簡體中文
GB18030 54936 簡體中文
SLOVENIAN 1250 未開發

 

 

 

Windows之ANSI與UNICODE

Windows之ANSI與UNICODE

近日寫SEO應用程式,因現在目錄路徑可能會有中文字符或非ASCII字符,所以使用寬字符版的程式,但出現_T()與_TEXT()宏指令無定義:

error C2065: ‘_T’ : undeclared identifier

又不想直接使用L()宏指令定義寬自字符,百思不得其解.原來_T()與_TEXT()宏指令的定義在TCHAR.H文件,添加#include <TCHAR.h>即可解決.

VC使用#define _MBCS定義則使用ANSI字符,而定義#define _UNICODE 則使用UNICODE寬字符.如過想全局定義_MBCS或_UNICOD可在Settings設置如上圖.

Project Settings/C/C++/Category/General/Preprocessor definitions/ WIN32,_DEBUG,_WINDOWS,_UNICODE

平板電腦-安裝Windows10

平板電腦-安裝Windows10

我果台雜牌平板更換電池後獲得新的生命.平板本為雙系統Win8+Android.因為硬盤只有64GB再分給兩系統使用可利用率實在太低.故想重新分區安裝Win10.在微軟下載Windows10 ISO官方鏡像.版本號為1709居然無法安裝第三應用,只可以安裝在應用商店下載的應用或者購買專業版…暈!也就想激活Win10都無可能.之後安裝早期的Win10-ISO鏡像才成攻激活.

P2P下載慢之啟用UPNP

P2P下載慢之啟用UPNP

因為暑熱所以搬離屋企,安裝左”有線電視”的寬帶(139.gd),但總是發覺BT(BitTorrent)下載時比在屋企下載難,當時想是寬帶是內網的問題.但按使用BitComet是發現無法端口阻塞.”你的監聽端口無法被外網用戶連接,你的下載速度可能會受到影響,請檢查防火牆及NAT網關設置”並且”DHT已連接節點為0”

這講明你只能主動鏈接她人,而她人就無法鏈接你,而且DHT協議也是需要監聽端口.因為本人多年前寫過BT下載程序,這種情況當然不是本機的監聽端口無法打開,而網關(路郵)無幫你作端口影射.你需要在網關(路郵)啟用UPNP,這個協議可以幫助由程序向網關(路郵)請求端口影射.

 

以我這台”有線電視”的機頂盒為例啟動UPNP

  1. 在瀏覽器中輸入http://192.168.88.256進入網關(路郵)的WEB網管登錄界面
  2. 默人用戶名admin和密碼96956,進入管理介面
  3. 防火牆設置/UPNP設置
  4. 啟用UPNP
  5. 按確定保存
  6. 管理設置/重啟系統

 

有部分軟件並非自已生成UPNP連接,而是使用Windows自帶的服務.你需令外啟用.

  1. 網上鄰居/網絡任務/顯示聯網的UPNP設備圖標,”安裝組件”並”相關服務”
  2. 控制面板/添加或刪除程序/添加刪除Windows組件/Windows組件嚮導/網絡服務/詳細信息. “Internet網關設備發現和控制客戶端”和“UPnP用戶界面”組件
  3. 控制面板/管理工具/服務/SSDP Discovery Service啟動啟用UPNP設備的發現/狀態設為”已啟動”
  4. 控制面板/Windows防火牆/例外/勾選”UPnP 框架”服務
  5. 網絡連接/Internet連接/鼠標右鍵/屬性/常規/設置
  6. 點擊“添加”,輸入本機的IP地址與影射本機與網關的網絡端口,TCP與UDP需分別添加.

 

這樣你才能被沒有啟用UPNP的用戶peer連接,獲的更快的下速度.

Windows10禁用自動更新

Windows10禁用自動更新
Windows10禁用自動更新

自動更新作為Windows10的系統服務可以保卫,但整天更新也為我地的工作帶來麻煩,所以很多人都想把它禁用,但Windows10卻取消了禁用選項.下麵我介紹通過禁用系統服務達到禁用更新的目的

  1. Win+R打開運行窗口
  2. 輸入msc按確定啟動本地服務
  3. 找出WINDOW Update服務並雙擊
  4. 常規選項框的啟動類型選擇禁用
  5. 恢復選項框的第一次啟動失敗選擇無操作
  6. 重啟計算機
  7. 設置/Windows更新/更新狀態/檢查更新
  8. 會出現(安裝更新時出現一些問題,但我們稍後會重試)
  9. 若想恢復自動更新需把啟動類型設置為自動

Windows鍵盤快捷鍵

Windows鍵盤快捷鍵

為什麼使用滑鼠能完成操作,還要使用鍵盤去完成?假設你右手使用滑鼠完成所有的操作,你右手會很快會過勞而受損,通過左手的配合則能分擔一半勞動強度,而且能加快工作一倍速度。

 

快捷鍵 功能簡介
WIN或CTRL+ESC 打開開始菜單

WIN鍵是有微軟標誌的果個按鍵.

WIN+E 打開資源管理器,

這是我最常用快捷鍵之一,因為它太重要.

WIN+L 快速鎖定系統

暫時離開電腦時最快的鎖定電腦的方法

WIN+M 最小化所有視窗.
WIN+SHIFT+M 還原所有視窗,與WIN+M配合使用
WIN+D 最小化與還原所有視窗之間切換

這個比WIN+M更好用

WIN+F 打開查找視窗
WIN+R 打開運行視窗
WIN+U 打開助功能
WIN+CTRL+M  
WIN+CTRL+F 打開查找電腦視窗
WIN+Pause Break 打開系統屬性

比在資源管理器中打開快多了.

WIN+F1 單獨的打開幫助
WIN+TAB 迴圈切換任務欄上的按扭,但不彈出zh只切換焦點
CTRL+C或CTRL+INSERT 複製
CTRL+V或SHIFT+INSERT 粘貼
CTRL+X 剪切
CTRL+S 保存

這是使用率最高的,因為保存是好習慣

CTRL+A 全選

選擇所有文檔或文本或所有的

CTRL+F 查找

文檔內部查找最常用

DELETE 刪除,移入回收站
SHIFT+DELETE 直接刪除不移入回收站
CTRL+Z 撤銷,例如刪除後的恢復
CTRL+Y 恢復(暫不支持)
CTRL+P 列印文檔
CTRL+W 關閉當前焦點視窗視窗
CTRL+鼠标滚轮 縮小於放大

常用與網頁流覽與文檔編輯

LEFT(拖放)+ CTRL 複製文檔

LEFT滑鼠左鍵拖放文檔+ CTRL鍵

LEFT(拖放)+ CTRL+SHIFT 創建文檔的快捷方式

LEFT滑鼠左鍵拖放文檔+ CTRL鍵+ SHIFT鍵

CTRL+LEFT(選擇) 逐個選擇文檔

CTRL鍵+滑鼠左鍵選擇文檔

SHIFT+LEFT(選擇) 連續選擇文檔

SHIFT鍵+滑鼠左鍵選擇文檔

CTRL+SHIFT+LEFT(選擇) 連續逐個選擇文檔

CTRL鍵+SHIFT鍵+滑鼠左鍵選擇文檔

CTRL+HOME/HOME 移動游標到文檔的開始
CTRL+END/END 移動游標到文檔的結束
ALT+F4 關閉分頁窗口

只能關閉內部分頁視窗

CTRL+W 關閉當前焦點視窗視窗
ALT+F4 關閉當前焦點視窗視窗

能關閉所有視窗.

ALT+ESC 在活动的窗口链中切换
ALT+SHIFT 在輸入法之間切換這是最常用快捷鍵
ATL+TAB 迴圈切換視窗

按住ATL鍵,在按TAB鍵切換視窗

ATL+SHIFT+TAB 反向迴圈切換視窗

按住ATL鍵+SHIFT鍵,在按TAB鍵反向切換視窗

ALT+PRINT SCREEN 將當前焦點窗口截圖

這是最好用截圖工具,比第三方的截圖工具更好使用

PRINT SCREEN 將當前螢幕截圖

與ALT鍵配合使用根本無需第三方的截圖工具

SHIFT+F10 彈出當前焦點菜單
SHIFT+DELETE 直接刪除不移入回收站
F1 説明
F2 重命名檔案名

比滑鼠右鍵彈出功能表要好用

F3 查找

資源管理器中使用

F4 查閱

需與滑鼠配合使用,移動滑鼠到目標然後按F4鍵

F5 刷新

網頁上最常用

F6 窗口内部焦点切换
F10 把焦點切換到菜單欄
F11 視窗與全屏之間切換
F12 另存為

與CTRL+S保存配合使用

ESC 取消當前任務

 

文件保險箱

文件保險箱
文件保險箱

文件保險箱

文件保險箱不但可以讓別人無法看到保險箱下的內容,而且更無法刪除保險箱. 保險箱无法删除更能起到保護文件的作用,文件保險箱其實就是生成無發刪除的文件夹.只要檔夾中包含不規範字符既可.

 

文件保險箱

  1. 新建一個文本文件,寫入命令行指令.
  2. mkdir lock..\
  3. 将文本文件另存为cmd, 編碼選擇ANSI
  4. 双击运行则可生成文件夹,鼠标双击无法打开,也无删除

 

打开保险箱

  1. 新建一個文本文件,寫入命令行指令.
  2. start %cd%\lock..\
  3. 将文本文件另存为cmd, 編碼選擇ANSI
  4. 雙擊運行則可打開文件夹

 

删除保险箱

  1. 新建一个文本文件,寫入命令行指令.
  2. rd /s /q     %cd%\lock..\
  3. 将文本文件另存为cmd, 編碼選擇ANSI
  4. 雙擊運行則可刪除文件夾