2012/10/31

【Windows8】取得Auto Rotation狀態

先前同事提了個需求要能用程式判斷當前Auto Rotation狀態,查了一下發現有個GetAutoRotationState()函數可以調用,透過這函數呼叫可以查知目前系統Auto Rotation是否被開啟,直接看程式內容吧!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>

#pragma comment (lib, "User32")

int _tmain(int argc, _TCHAR* argv[])
{
 enum tagAR_STATE state;
 bool blResult = GetAutoRotationState(&state);
 if(blResult)
 {
  if(0 == state)
   printf("Auto Rotation: ON\n");
  else
   printf("Auto Rotation: OFF\n");
 }
 else
  printf("Access rotation status ... fail\n");
 return  0;
}

需要注意的是這函數是Windows8才加入User32.dll的,因此如果拿這程式在Windows7以前版本執行的話會遇到這樣的錯誤:
如果要避免這樣的錯誤,需要用動態載入dll方式進行呼叫。

在Windows8上執行截圖如下:


附註:tagAR_STATE詳細屬性:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public enum tagAR_STATE : uint
{
 AR_ENABLED = 0x0,
 AR_DISABLED = 0x1,
 AR_SUPPRESSED = 0x2,
 AR_REMOTESESSION = 0x4,
 AR_MULTIMON = 0x8,
 AR_NOSENSOR = 0x10,
 AR_NOT_SUPPORTED = 0x20,
 AR_DOCKED = 0x40,
 AR_LAPTOP = 0x80
}

Keyword:Windows API、System Call

2012/10/9

【Windows】Process Explorer

  在Windows系統上一般要查看執行中的處理程序可以開啟Windows工作管理員(可用快截鍵Ctrl + Shift + ESC開啟)來查看,這用來查看系統中哪個處理程序吃掉太多CPU或記憶體資源或是想殺掉某些用不到又吃資源的處理程序很好用,但若要進一步查看程式呼叫了哪些DLL、存取哪些Handle或是動了哪些Registry等詳細訊息就不夠用了!

  要進一步查看Process的相關資訊可以到Sysinternals網站下載Process Explorer,這工具以樹狀關係顯示Process之間的關係,把滑鼠移到某個Process上停著會顯示執行擋完整的路徑名稱,連帶起來的參數資訊都會顯示出來,不同的程序也可用不同顏色顯示(ex. 預設Service會以粉紅色顯示、一般程序則是藍色顯示...等),雙點某個程序則會顯示進一步詳細資訊,像是CPU佔用時間、記憶體資源或是IO資訊等,最厲害的大概就是可以查看Process執行載入了哪些DLL或是開啟了哪些Handle資訊,這些資訊對於開發人員要找問題可是有很大的幫助!


2012/8/29

【C++】縮小命令提示字元視窗

上次寫了如何用C#讓命令提示字元視窗在執行時縮小(參考這篇),今天又有同事提出需求要在另一支用C++完成的工具也要做到一樣效果,有了上次的經驗這次很快就完成了任務需求,一樣用FindWindow與ShowWindow系統函數來達成,只是這次要多調用一個GetConsoleTitle函數來做輔助,直接看Code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>
#include <Windows.h>

#pragma comment(lib, "User32.lib")

int main(int argc, char* argv[])
{
 char cTitle[512];
 GetConsoleTitle(cTitle, 512);
 HWND hWnd = FindWindow(NULL, cTitle);
 ShowWindow(hWnd, SW_SHOWMINIMIZED);
 return 0;
}

  1. 先用GetConsoleTitle函數取得執行程式命令提示字元的顯示標題列內容。
  2. 再用取得的視窗標題找出HWND。
  3. 最後用FindWindow函數控制視窗的呈現。
  • ShowWindow第二個函數用來決定視窗要如何呈現:最大、最小...等。詳細請參考MSDN說明頁面。

2012/8/18

【Windows】關於Windows8的關機與開機

Link:Delivering fast boot times in Windows 8
Windows8很強調快速開機這個使用體驗,從開始接觸Windows8產品設計到現在,開機速度確實是越來越快(雖說快,但也要幾十個秒啦),究竟微軟是讓Windows8吃了什麼神奇藥丸可以飆速開機、又為什麼關機再開機會比重開機來得快呢?就讓我們看下去...

在傳統操作上,電腦長時間不用會選擇關機的理由絕對不是因為捨不得電腦這樣燃燒生命,多半是因為電腦在那邊發呆也是要吃電耶!特別是電價越來越貴...真是讓人捨不得。上面這篇文章則提到:其實很多人都很喜歡睡眠(Sleep)這個功能,用過的人都會發現睡過的電腦開機快很多捏。其實工作原理是讓電腦大部分的元件能關就盡量關掉,留下記憶體在那邊認真工作(記憶體若斷電,記錄的資料都會消失,所以睡眠時記憶體的電量是要持續消耗的,這樣一旦使用者要繼續使用電腦,就不用把資料從龜速的硬碟機慢慢載入了),有看到關鍵點了嗎?就是給電腦睡覺還是會吃一點點的電啦,雖然跟開機比少吃很多電,但是會吃電就是會吃電,結論:好,但還不夠好。
PS. 現在智慧型手機的待命就相當於是睡眠模式。

文章接著介紹休眠(Hibernate)功能:其實我覺得休眠這個翻譯不太好,每次在選睡眠、休眠都讓我想很久,我覺得應該用哈利波特裡面的咒語"整整(Petrificus Totalus)"或是"凍結"、"石化"之類的比較貼切。這工作原理跟睡眠差不多,但是會把當前的工作狀態儲存到硬碟上(因為硬碟是非揮發性儲存裝置,也就是說斷電再開啟資料也不會不見),經過這樣一道手續,電腦就可以放心的去休息啦。這個好處是電腦不會偷吃電、喚醒電腦很快,壞處則是會佔用一些硬碟空間(不過在這個硬碟便宜到隨處可撿的時代,一點都不會心痛呢!)。

在Windows8上,微軟覺得休眠明明就很好用,但是太多使用者都不知道好好利用,那我就改變一下關機原則,幫休眠技術做個微整型,換湯不換藥重新推出,到時在市場上還可以打著快速開機的廣告!

Windows8的關機基本上就是休眠,但是在休眠之前多做了一些程序:清除使用者工作狀態(User Sessions)、但是原先關機接續會清除系統核心資訊(Kernel Sessions)等後續動作則是跳過了,接著就開始做跟休眠一樣的行為,把系統核心狀態資訊通通寫到硬碟去了(別擔心,這個動作很快,因為新出來的產品都會默默幫你搭上象徵極速與高貴的固態硬碟,平板產品就更不用說了,沒人會把傳統硬碟裝在平板上的),完成後就可以關掉電源啦!

當使用者按下電源開關,Windows發現硬碟藏有上次關機儲存的系統狀態,就馬上把他通通讀到記憶體裡,只要再完成一些一定得重新初始的硬體元件即可,搞定後就算是完成開機啦,接著就準備登入使用者之類的程序了,就是你在使用Windows的狀態了,整個差別可以用下面這張圖簡單說明:可以看到系統初始化(System Initialization)是很浪費時間的,特別是你硬體元件什麼都沒有更動,何必這樣浪費時間呢?

 文章一開始有提到關機在開機可能會比直接重開機來得更快,原因在於這句話:"choosing Restart from the UI will do a full shutdown, followed by a cold boot.",應該是基於更新韌體或是安裝新軟體需使用者重新登入之類的理由,重開機選項會讓系統做完整的關機與開機,讓新的韌體或是軟體可以正確工作。

另外,如果你是個有潔癖的人,覺得關機就是要關得乾淨,開機就是要做得完整,一點都不能馬虎,那你也可以選擇使用"shutdown /s /full / t 0"命令讓系統乖乖聽話做完整套的關機流程,不過開機就會慢一點囉!

2012/8/16

【Windows】Free Touchpad Blocker

每台Notebook都會搭一個Touch Pad做為滑鼠的對應工具,這東西在沒有外接滑鼠時是非常好用的裝置,但是有些Notebook的機構配置讓人很容易在打字的時候不小心觸動到,導致敲鍵盤時候被干擾。
今天同事推薦了一套小工具:Touchpad Blocker。試用後覺得效果很好,概念基本上就是偵測到敲鍵盤時會把滑鼠事件給暫停,至於要停多久可以到工具選單做設定(參考下圖)。
不過有一好就有一壞,如果不是單純文字輸入的話,這樣的功能就會變得礙手礙腳,像是用快捷鍵複製(Ctrl + C)或貼上(Ctrl + V)之類的,雖然這軟體會把功能按鍵(Ex. Ctrl、Shift)排除偵測,但因快捷鍵通常會結合一般按鍵,這時候就會覺得滑鼠卡卡的了,此時可以透過(Ctrl + F9)將此工具暫停,就可以避免滑鼠卡卡的,當要大量使用文字輸入時再把功能打開即可。
下載可到官網:http://touchpad-blocker.com/

2012/8/15

【C#】縮小命令提示字元視窗

今天同事提了個奇怪的需求:執行程式時要能把命令提是字元視窗縮小,查了一下網路發現可以利用FindWindow()與ShowWindow()兩個函數達成此需求,直接看以下範例:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace HideConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            IntPtr ParenthWnd = new IntPtr(0);
            
            ParenthWnd = Findindow(null, Console.Title);
            if (ParenthWnd == IntPtr.Zero)
                Console.WriteLine("Find Window ... FAIL");
            else
                ShowWindow(ParenthWnd, SW_SHOWMINIMIZED);
        }

        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private static extern IntPtr Findindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll", EntryPoint = "ShowWindow")]
        private static extern IntPtr ShowWindow(IntPtr hWnd, int type);
        const int SW_HIDE = 0;
        const int SW_SHOWMINIMIZED = 2;
        const int SW_MAXIMIZE = 3;
    }
}

流程說明:
  1. 用Console.Title找出命令提示字元視窗本身的標題字串,並透過FindWindow找出Handler
  2. 將Handler傳給ShowWindow函數,並傳入參數讓視窗進行改變,範例標了幾個視窗屬性SW_HIDE, SW_SHOWMINIMIZED與SW_MAXIMIZE,完整的參數可以參考MSDN的參考網頁( http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx)
因使用了DllImport,記得要加入
1
using System.Runtime.InteropServices;

Keyword:How to Minimize Terminal on Windows、C# Programming、Minimize Command Prompt on Windows

2012/8/9

【上海】晾衣文化

這張是上海很常見的晾衣曬被方式:幾根長長的竿子從窗戶伸出來,這樣就成了曬衣服曬被子的架子了,算是這邊的標準曬衣文化。
下面這張則是更高竿的曬衣工夫:電線就直接拿來當做天然的晾衣架了!
在人民公園停車場出口看過更絕的:空間極致利用。八成是停車場管理員沒窗戶可以掛欄杆,又沒現成電線可以利用的最後大決。