Skip to content

Instantly share code, notes, and snippets.

@kimoto
Created June 3, 2011 11:44
Show Gist options
  • Select an option

  • Save kimoto/1006220 to your computer and use it in GitHub Desktop.

Select an option

Save kimoto/1006220 to your computer and use it in GitHub Desktop.
toggle Windows Aero (Aeroを有効/無効切り替えるためのコード)
#include "dwmswitch.h"
void ShowLastError(void){
LPVOID lpMessageBuffer;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // デフォルト ユーザー言語
(LPTSTR) &lpMessageBuffer,
0,
NULL );
MessageBox(NULL, (LPCWSTR)lpMessageBuffer, TEXT("Error"), MB_OK);
//... 文字列が表示されます。
// システムによって確保されたバッファを開放します。
LocalFree( lpMessageBuffer );
}
void TasktrayAddIcon(HINSTANCE hInstance, UINT msg, UINT id, UINT iconId, LPCTSTR tips, HWND hWnd)
{
NOTIFYICONDATA nid;
nid.cbSize = sizeof( NOTIFYICONDATA );
nid.uFlags = (NIF_ICON|NIF_MESSAGE|NIF_TIP);
nid.hWnd = hWnd; // ウインドウ・ハンドル
nid.hIcon = ::LoadIcon(hInstance, MAKEINTRESOURCE(iconId)); // アイコン・ハンドル
nid.uID = id; // アイコン識別子の定数
nid.uCallbackMessage = msg; // 通知メッセージの定数
lstrcpy(nid.szTip, tips); // チップヘルプの文字列
// アイコンの変更
if( !Shell_NotifyIcon( NIM_ADD, &nid ) )
::ShowLastError();
}
void TasktrayModifyIcon(HINSTANCE hInstance, UINT msg, UINT id, HWND hWnd, LPCTSTR tips, UINT icon)
{
NOTIFYICONDATA nid;
nid.cbSize = sizeof( NOTIFYICONDATA );
nid.uFlags = (NIF_ICON|NIF_MESSAGE|NIF_TIP);
nid.hWnd = hWnd; // ウインドウ・ハンドル
nid.hIcon = ::LoadIcon(hInstance, MAKEINTRESOURCE(icon)); // アイコン・ハンドル
nid.uID = id; // アイコン識別子の定数
nid.uCallbackMessage = msg; // 通知メッセージの定数
lstrcpy( nid.szTip, tips ); // チップヘルプの文字列
if( !::Shell_NotifyIcon(NIM_MODIFY, &nid) )
::ShowLastError();
}
void TasktrayDeleteIcon(HWND hWnd, UINT id)
{
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd; // メインウィンドウハンドル
nid.uID = id; // コントロールID
if( !::Shell_NotifyIcon(NIM_DELETE, &nid) )
::ShowLastError();
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HMENU hMenu, hSubMenu;
static UINT msgTaskbarCreated;
switch(message){
case WM_CREATE:
if( FAILED(::DwmEnableComposition(DWM_EC_DISABLECOMPOSITION)) ){
::ShowLastError();
return FALSE;
}
// メニューの準備
hMenu = ::CreateMenu();
hSubMenu = ::CreateMenu();
::AppendMenu(hSubMenu, MF_STRING, IDM_EXIT, L"終了");
::AppendMenu(hMenu, MF_POPUP, (UINT)hSubMenu, NULL);
return TRUE;
case WM_DESTROY:
::DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);
::PostQuitMessage(0);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDM_EXIT:
::DestroyWindow(hWnd);
break;
}
return TRUE;
case WM_TASKTRAY:
switch(lParam){
case WM_RBUTTONDOWN:
POINT point;
::GetCursorPos(&point);
::SetForegroundWindow(hWnd);
::TrackPopupMenu(hSubMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, 0, hWnd, NULL);
return TRUE;
}
}
return ::DefWindowProc(hWnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
//wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.style = 0;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = ::LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = ::LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
RegisterClassEx(&wcex);
int z = 0;
HWND hWnd = CreateWindowEx(0, szWindowClass, szWindowTitle,
WS_OVERLAPPEDWINDOW, z, z, z, z,
NULL, NULL, hInstance, NULL);
if(!hWnd){
::ShowLastError();
return FALSE;
}
::ShowWindow(hWnd, SW_HIDE) && ::UpdateWindow(hWnd);
::TasktrayAddIcon(hInstance, WM_TASKTRAY, ID_TASKTRAY, IDI_MAIN, ::szWindowTitle, hWnd);
MSG msg;
while(::GetMessage(&msg, NULL, 0, 0)){
if(!::TranslateAcceleratorA(msg.hwnd, NULL, &msg)){
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
::TasktrayDeleteIcon(hWnd, ID_TASKTRAY);
return TRUE;
}
#include <windows.h>
#include <WindowsX.h>
#include <tchar.h>
#include <commctrl.h>
#include <richedit.h>
#include <dwmapi.h>
#pragma comment(lib, "dwmapi.lib")
#define WM_TASKTRAY (WM_APP + 1)
#define ID_TASKTRAY 1
#define IDM_EXIT 2000
#define IDI_MAIN 101
LPTSTR szWindowTitle = L"dwmswitch";
LPTSTR szWindowClass = L"dwmswitchClass";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment