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資訊,這些資訊對於開發人員要找問題可是有很大的幫助!