2015年4月19日日曜日

日記ちゃん

noneScreenSave公開。
 起動している間だけスクリーンセーバーが動かなくなるようにするアプリケーションです。
ゲームパッド使ってゲームしてたらスクリーンセーバーが起動して大参事、というときや、
攻略サイト表示しながらゲームするときなどにちょっと便利。
起動して終了するだけのシンプルな仕様にしました。

 このソフトを作るときに紆余曲折あって、初版では
WM_SYSCOMMAND の SC_SCREENSAVE と SC_MONITORPOWER にてreturn 1をすることでスクリーンセーバーを阻止していたんだけど、
ソフトがアクティブでないと機能しないことが発覚し、最近ようやく作り直すことに。

 ver1.00bでは、
タイマーで定期的にキーボードに存在しないキーを押させることでスクリーンセーバーを阻止していたが、
このとき、ツールチップの表示が消える問題が発覚し、また作り直しに。
※ツールチップ=フォルダの上にカーソルを置いておくとサイズなどの表示がされる薄黄色いウィンドウ

 ver1.10にて、
WM_SYSCOMMANDが非アクティブでも受けられるようグローバルフックを使用したらいけるんじゃね? 
と実装。とりあえず問題なく動く。

 ver1.20
ちょっと検索掛けたら、カーソルを0dot動かすことで阻止できるとわかったので、
グローバルフックからタイマーに戻し、スクリーンセーバーが起動する直前になったら0dot動かす仕様に変更した。
グローバルフックよりタイマーのほうがシンプルでいいよね。

noneScreenSave ver1.20


■ダウンロード

file: noneScreenSave120.zip
size: 29.5KB



■概要
    スクリーンセーバー、モニタの電源オフを一時的に無効にします。



■動作環境
    Windows XP, 8
    CPU 800MHz以上
    メモリ 256MB以上



■アンインストール
    レジストリは触っておりません。
    削除の際はフォルダごとゴミ箱へ。



■使い方
    起動するとスクリーンセーバーとモニタの電源オフが無効化されます。
    「閉じる」ボタンをクリックすると終了します。



■そのほか
    このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。



■更新履歴
    2015-04-18 ver 1.20
        うまく動いていなかったので、タイマーにてカーソルを0dot動かすことで阻止するよう修正
    2015-04-16 ver 1.10
        キー押しだとヘルプチップが表示されないなどの問題があるとわかったので、
        DLLによるグローバルフックにてスクリーンセーバーを封じるよう修正
    2015-04-12 ver 1.0b
        アクティブでないときに機能してなかったのを修正。適当に使ってないキーを押す処理を追加。
    2013-08-09 ver 1.0

2015年3月28日土曜日

日記ちゃん

 いままで、OpenClipboard( NULL )として使ってて、
どうもexplorerとコピーの動作が違うなと思ってたんだけど、
OpenClipboard( hWnd )とちゃんとウィンドハンドルを指定するようにしたら
explorerのコピーと同様の動作になった。
 たぶんどこかのサンプルのコピペでNULLを指定してたんだろうけど
意外なところで落とし穴があった。

2015年3月12日木曜日

pointClick ver1.00a



■ダウンロード

File: pointClick100.zip
Size: 48.3KB



■現在発覚しているバグ
 まれにクリック離し処理が実行されないことがあるバグがあります。5000クリックに一回ぐらい。


■概要
    クリックしたときに、マウスがちょっと動いてしまってドラッグになってしまうのを防ぎます。



■動作環境
    Windows 8.1
    CPU 1GHz以上
    メモリ 1GB以上



■アンインストール
    レジストリは触っておりません。
    削除の際はフォルダごとゴミ箱へ。



■使い方
    ○ on/off
        位置を補正する機能のオンオフを行います

    ○左クリック、ホイールクリック、右クリック
        位置補正機能を有効にするマウスのボタンを選択できます。

    ○処理タイプ
        ・Type-A
            マウスボタンを押して、離したときにカーソル位置を押した位置に戻す処理方法
            ボタンの押し離しのタイミングはそのままでカーソル位置だけ手を加えるので処理がシンプル
            Webサイトの画像ボタンなどはこの処理でもドラッグになってしまうことがある
        ・Type-B
            マウスボタンを押したときにはボタンを押したことにせず、離したときにボタンを押し離し処理を行う方法
            クリックしている時間が短くなるのでドラッグになりにくい
            実際にクリック処理されるタイミングが、マウスのボタンを離したときなのでワンテンポ遅れるのが欠点

    ○有効時間
        マウスのボタンを押してから離すまでの時間設定
        設定した時間よりも長くマウスのボタンを押されていると、位置補正機能は働きません

    ○有効距離
        マウスのボタンを押してから離すまでに移動した距離の設定
        設定した距離よりも長く移動していたら、位置補正機能は働きません

    ○クリック時間(ms)
        Type-Bで、クリックしている時間を設定します
        あまり短すぎるとクリックしたことにならない場合があります

    ○ログ表示
        ログ表示機能のオンオフを行います

    ○ログ表示数
        表示するログの数の設定


    ●ログ表示
        有効時間、有効距離の設定にお役立てください

        ○判定
            位置を補正する機能が働いたら○が、
            時間が超過しているかカーソルの移動距離が設定より大きいと×が表示されます
        ○マウス
            マウスの右クリック、左クリック、中クリックのどれであるかが表示されます
        ○経過時間(ms)
            マウスのボタンが押されてから離されるまでに経過した時間が表示されます
        ○距離
            マウスのボタンが押されてから離されるまでに移動した距離が表示されます



■そのほか
    このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。



■更新履歴
    2015-03-12 ver1.01a
        アイコン変更
        終了確認をするよう修正
        Type-Bにてクリック後カーソル位置がずれることがあるのを修正
        Type-Bにてカーソルが有効距離以上動くと、ただちにボタン押し処理が実行されるよう修正
        Type-Bにてボタンを押しているときホイールをまわすと、ただちにボタン押し処理が実行されるよう修正
    2015-03-07 ver1.00

2015年3月11日水曜日

日記ちゃん

mouse_event 関数
https://msdn.microsoft.com/ja-jp/library/cc410921.aspx

 mouse_event()のMOUSEEVENTF_ABSOLUTEフラグって全然効いてなくね? って思ったら、
指定する座標がスクリーン座標系じゃなかったでござる。
0~65535で指定するのはわかったけど、マルチディスプレイだとどうなるんこれ。
 MOUSEEVENTF_MOVE指定しないと座標指定しても意味ないのか。
てっきり指定座標でMOUSEEVENTF_RIGHTDOWNなりをしてくれるのかと思ってた。

mouse_event( MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_ABSOLUTE, clickPos.x, clickPos.y, 0, 0 );

mouse_event( MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, clickPos.x, clickPos.y, 0, 0 );

 ちゃんとMOUSEEVENTF_MOVEを指定して実験してみたところ、
メインモニタの座標になる様子だった。
メイン以外のモニタでMOUSEEVENTF_ABSOLUTEは多分できない。
 
 指定座標でクリックさせるなら、
潔くSetCursorPos()してmouse_event()でクリック処理して、って流れのほうがシンプルでわかりやすいと思う。

2015年3月7日土曜日

pointClick ver1.00



■ダウンロード

File: pointClick100.zip
Size: 47.4KB




■概要
    クリックしたときに、マウスがちょっと動いてしまってドラッグになってしまうのを防ぎます。



■動作環境
    Windows 8.1
    CPU 1GHz以上
    メモリ 1GB以上



■アンインストール
    レジストリは触っておりません。
    削除の際はフォルダごとゴミ箱へ。



■使い方
    ○ on/off
        位置を補正する機能のオンオフを行います

    ○左クリック、ホイールクリック、右クリック
        位置補正機能を有効にするマウスのボタンを選択できます。

    ○処理タイプ
        ・Type-A
            マウスボタンを押して、離したときにカーソル位置を押した位置に戻す処理方法
            ボタンの押し離しのタイミングはそのままでカーソル位置だけ手を加えるので処理がシンプル
            Webサイトの画像ボタンなどはこの処理でもドラッグになってしまうことがある
        ・Type-B
            マウスボタンを押したときにはボタンを押したことにせず、離したときにボタンを押し離し処理を行う方法
            クリックしている時間が短くなるのでドラッグになりにくい
            実際にクリック処理されるタイミングが、マウスのボタンを離したときなのでワンテンポ遅れるのが欠点

    ○有効時間
        マウスのボタンを押してから離すまでの時間設定
        設定した時間よりも長くマウスのボタンを押されていると、位置補正機能は働きません

    ○有効距離
        マウスのボタンを押してから離すまでに移動した距離の設定
        設定した距離よりも長く移動していたら、位置補正機能は働きません

    ○クリック時間(ms)
        Type-Bで、クリックしている時間を設定します
        あまり短すぎるとクリックしたことにならない場合があります

    ○ログ表示
        ログ表示機能のオンオフを行います

    ○ログ表示数
        表示するログの数の設定


    ●ログ表示
        有効時間、有効距離の設定にお役立てください

        ○判定
            位置を補正する機能が働いたら○が、
            時間が超過しているかカーソルの移動距離が設定より大きいと×が表示されます
        ○マウス
            マウスの右クリック、左クリック、中クリックのどれであるかが表示されます
        ○経過時間(ms)
            マウスのボタンが押されてから離されるまでに経過した時間が表示されます
        ○距離
            マウスのボタンが押されてから離されるまでに移動した距離が表示されます



■そのほか
    このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。



■更新履歴
    2015-03-07 ver 1.00

2015年2月24日火曜日

日記ちゃん


正統派! 乙女系 シューティングRPG ゴシックは魔法乙女 - YouTube
ゴシックは魔法乙女~さっさと契約しなさい!~ Cave新作スマフォSTG。

 稼ぐと好感度が上がるSTGといえばプロギアだったけど、この作品はどういうのなんだろうか。
エフェクトなんかはドンパッチ寄りっぽい。
事前登録でなんかもらえるっぽいの出取りあえず登録しておいた。
ゲーム配信開始時に登録したメールアドレスへシリアルコードが送られてくるそうだ。
手持ちのスマフォで遊べるかどうかはまだわからん。

2015年2月18日水曜日

バルーンチップを表示するプログラム


 タスクトレイにアイコンを置き、バルーンチップを表示するプログラムサンプル。
WM_CREATEでトレイアイコンを設置。
ボタンを押すとトレイアイコンの位置にバルーンチップを表示します。
参考になれば幸い。

#define _WIN32_WINNT 0x501
#include <windows.h>

#define CLASS_NAME  TEXT("BalloonTest") 
#define WINDOW_TITLE TEXT("BalloonTest")
#define BUTTON_TITLE TEXT("Balloon")
#define IDC_BTN_BALLOON 1
#define TASKTRAY_ID  2
#define WM_TASKTRAY    (WM_APP+1)





void balloon( HWND hWnd )
{
 if ( hWnd )
 {
  NOTIFYICONDATA notifyIcon = {0};
  notifyIcon.cbSize = sizeof(notifyIcon);
  notifyIcon.hWnd = hWnd;
  notifyIcon.uID = TASKTRAY_ID;
  notifyIcon.uFlags = NIF_INFO;
  notifyIcon.dwInfoFlags = NIIF_ERROR;

  lstrcpy( notifyIcon.szInfoTitle, TEXT("バルーンタイトル") );
  lstrcpy( notifyIcon.szInfo, TEXT("バルーン文字") );
  
  Shell_NotifyIcon( NIM_MODIFY, ¬ifyIcon );
 }
}



void putTrayIcon( HWND hWnd )
{
 // タスクトレイアイコン追加
 NOTIFYICONDATA notifyIcon = {0};
 notifyIcon.cbSize = sizeof(notifyIcon);
 notifyIcon.uID = TASKTRAY_ID;
 notifyIcon.hWnd = hWnd;
 notifyIcon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
 notifyIcon.uCallbackMessage = WM_TASKTRAY;
 notifyIcon.hIcon = LoadIcon( NULL, IDI_APPLICATION );
 lstrcpy( notifyIcon.szTip, WINDOW_TITLE );
 Shell_NotifyIcon( NIM_ADD, ¬ifyIcon );
}



void removeTrayIcon( HWND hWnd )
{
 NOTIFYICONDATA notifyIcon = {0};
 notifyIcon.cbSize = sizeof(notifyIcon);
 notifyIcon.hWnd = hWnd;
 notifyIcon.uID = TASKTRAY_ID;
 Shell_NotifyIcon( NIM_DELETE, ¬ifyIcon );
}




LRESULT CALLBACK wndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp )
{
 static UINT uiTaskbarRestart = WM_NULL;
 switch ( msg )
 {
 case WM_CREATE:
  putTrayIcon( hWnd );
  uiTaskbarRestart = RegisterWindowMessage( TEXT("TaskbarCreated") );
  break;
 case WM_CLOSE:
  removeTrayIcon( hWnd );
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 case WM_COMMAND:
  switch( LOWORD(wp) )
  {
  case IDC_BTN_BALLOON:
   balloon( hWnd );
   break;
  }
  return 0;
 case WM_TASKTRAY:
  switch ( lp )
  {
  case WM_LBUTTONDOWN:
   MessageBox( hWnd, TEXT("タスクトレイクリック"), WINDOW_TITLE, MB_OK );
   return 0;
  case NIN_BALLOONUSERCLICK:
   MessageBox( hWnd, TEXT("バルーンクリック"), WINDOW_TITLE, MB_OK );
   return 0;
  }
  break;
 }

 // タスクバー再起動時のアイコン再設定処理
 if ( msg == uiTaskbarRestart )
 {
  removeTrayIcon( hWnd );
  putTrayIcon( hWnd );
 }

 return DefWindowProc( hWnd , msg , wp , lp );
}



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow )
{

 WNDCLASS winc = {0};
 winc.style  = CS_HREDRAW | CS_VREDRAW;
 winc.lpfnWndProc = wndProc;
 winc.cbClsExtra = 0;
 winc.cbWndExtra = 0;
 winc.hInstance  = hInstance;
 winc.hIcon   = LoadIcon(NULL , IDI_APPLICATION);
 winc.hCursor  = LoadCursor(NULL , IDC_ARROW);
 winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 winc.lpszMenuName = NULL;
 winc.lpszClassName = CLASS_NAME;

 if ( !RegisterClass(&winc) ) return 0;

 HWND hWnd = CreateWindow(
   CLASS_NAME, WINDOW_TITLE,
   WS_OVERLAPPEDWINDOW | WS_VISIBLE,
   CW_USEDEFAULT, CW_USEDEFAULT, 400, 200, NULL, NULL,
   hInstance, NULL );
 if ( hWnd == NULL ) return 0;


 
 CreateWindow(
  TEXT("BUTTON"), BUTTON_TITLE,
  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  10, 10, 300, 100, hWnd, reinterpret_cast(IDC_BTN_BALLOON), hInstance, NULL );


 MSG msg;
 while ( GetMessage(&msg, NULL, 0, 0) )
 {
  DispatchMessage(&msg);
 }
 

 return msg.wParam;
}

 ちなみに、dwInfoFlags にNIIF_ERRORを指定するとバルーンのアイコンがこうなります。


 NIIF_NONEだとアイコンなしに。




 2015-03-19
uiTaskbarRestart の初期値を WM_NULL に変更。存在を忘れてた。

2015年2月15日日曜日

windowCap ver1.00a





■ダウンロード

File: windowCap100a.zip
Size: 135KB




■概要
    PrintScreenが押されると、ウィンドウのスクリーンショットを撮って画像ファイルで出力します。
    対応出力形式:BMP、PNG
    ShiftやCtrl、Altキーの同時押しによる、キャプチャ範囲の個別設定が可能。(3つまで)
    音とバルーン表示でわかりやすく出力確認。
    出力ファイル名に日付を入れるといった、ちょっとだけ柔軟な名前設定もできます。



■動作環境
    Windows 8.1
    CPU 1GHz以上
    メモリ 1GB以上



■アンインストール
    レジストリは触っておりません。
    削除の際はフォルダごとゴミ箱へ。



■使い方
    ●キー設定
        スクリーンショットの撮り方と記録キーを設定できます。
        3種類まで設定できます。
        3種類で同じ記録キー設定も使用できます。その場合、複数枚の画像ファイルが出力されます。
        (クリップボード出力の場合は下側の設定が優先されます)

        ○記録するウィンドウに関する設定
        ・なし
            キーが押されても何もしません。
        ・デスクトップ全体
            メインディスプレイ全体を範囲とします。
        ・アクティブウィンドウ
            現在アクティブなウィンドウを範囲とします。
        ・アクティブウィンドウのクライアント領域
            現在アクティブなウィンドウのクライアント領域を範囲とします。
            *クライアント領域はウィンドウからタイトルバーなどのフレーム部分を除いた領域のこと。
        ・カーソル下のウィンドウ
            マウスカーソルの下にあるウィンドウを範囲とします。
        ・カーソル下のウィンドウのクライアント領域
            マウスカーソルの下にあるウィンドウのクライアント領域を範囲とします。
        ・複数のデスクトップ全体
            マルチディスプレイ用の設定で、複数ディスプレイそれぞれを範囲とします。
            ファイル出力の場合、複数ファイルに出力され、
                ファイル名には(1),(2)なと末尾に数値が追記されます。
            クリップボード出力だとプライマリディスプレイのみ対象になります。(デスクトップ全体と同じ)
        ・カーソル下のデスクトップ全体
            現在カーソルがあるディスプレイ全体を範囲とします。

        ○記録キーの同時押しの設定
            PrintScreenキー と同時に Shift、Ctrl、Alt キーを同時に押させるかを設定できます。

    ●キャプチャ設定
        マウスカーソルを含める
            チェックをいれると、画像にカーソルを含むことができます。
        出力先
            ファイルかクリップボードから選択できます。

    ●通知
        バルーン
            記録に成功したらバルーン表示でお知らせします。
        音を鳴らす
            記録に成功したら音を鳴らします。
            実行ファイルと同フォルダにある sound.wav を置き換えて好きな音に変更してください

    ●ファイル設定
        ファイル形式
            ビットマップかPNGで画像ファイルを保存できます
        上書き時に確認ウィンドウを出す
            画像ファイル出力先に出力するファイル名が既に存在していたら、確認ウィンドウを出すようにします。
            チェックが入っていなければ、自動的に上書きします。
        出力先フォルダ
            画像ファイルが出力されるフォルダを設定できます。
            指定したフォルダが存在していないと出力されませんのでご注意ください。
        ...ボタン
            フォルダ選択ウィンドウを出します。出力したいフォルダを選択してください。
        出力先フォルダを開く
            設定したフォルダを開きます。
            指定フォルダが存在してないと、グレー表示になり押すことができなくなります。
        ファイル名
            画像ファイル名を設定できます。
            ファイル名には「\」「/」?」「*」「"」「>」「<」「|」の文字は設定できません。
            また、以下の指定文字を使用すると、自動的に数値に置き換えられます。
                 「%y」年4桁
                 「%m」月
                 「%d」日
                 「%h」時
                 「%i」分
                 「%s」秒
                 「%l」ミリ秒
                 「%Y」年(下2桁。2015年であれば15と出力されます)
                 「%M」月(2桁。1月であれば01と出力されます)
                 「%D」日(2桁)
                 「%H」時(2桁)
                 「%I」分(2桁)
                 「%S」秒(2桁)
                 「%L」ミリ秒(3桁)
                 「%n」連番値
                 「%%」文字の%
            例
                [%y%m%d]cap%n → [2015213]cap0001
                [%Y%M%d]cap%n → [150213]cap0001
                [%Y-%M-%d]cap%n → [15-02-13]cap0001
                [%y%M%d_%H%I%S]cap%n → [20150213_010101]cap0001

            拡張子はファイル形式で設定されたファイルの拡張子が自動的につきます。

        連番値
            画像が出力されるごとに+1されていく数値です。ファイル名%nにて使用することできます。
        連番桁数
            ファイル名で%nを使用したときに、連番値が設定した桁数になるよう調整されます。
            4桁であれば1 → 0001、7桁であれば1 → 0000001 とファイル名に設定されるようになります。



■そのほか
    このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。

    zlibライブラリを使用しています。
        Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
        http://www.winimage.com/zLibDll/

    libpngライブラリを使用しています。
        Copyright (c) 1998-2007 Glenn Randers-Pehrson
        http://www.libpng.org/



■更新履歴
    2015-02-15 ver 1.00a
        終了確認メッセージウィンドウが出ているときにキャプチャすると強制終了していたのを修正
    2015-02-14 ver 1.00

日記ちゃん

 さっそくバグ発見。終了確認ウィンドウを表示中にキャプチャすると強制終了する。
あと音が鳴ったりならなかったりするバグも確認しているが原因がわからない。
起動後クリップボード出力なら音が鳴るが、ファイル出力だと鳴らなくなる。
これはファイル出力側の処理で、触ったらダメなところに触ってる系の動きっぽい。

 どのタイミングから音が出なくなるんだろうかとチェックするため、
1処理ごとに音を鳴らしながら確認した。
音ファイル読み込み直後→鳴る。
コンフィグ読み込み直後→鳴る。
キャプチャ受けつけ直後→なる。
画面コピー直後    →なる。
ファイル名生成直後  →ならない。
 といった感じにちまちま探した結果、以下のように間違っていた。

ZeroMemory( outputFileName, fileNameBufSize );
ZeroMemory( outputFileName, filePathBufSize );
↓ただしくはこう
ZeroMemory( outputFileName, fileNameBufSize );
ZeroMemory( outputFilePath, filePathBufSize );

 うん。
この手のバグはデバッガにどう表示したものかわからん。難しい。

 あとバルーン表示したときに「ぽっ」って音が鳴ってた覚えがあるんだけど、
デバッグしてても全然音がしない。
サウンド設定でならないようになってんのかな? 
と思いついて設定をのぞいてみたらそもそもWindows8では「ぽっ」って音じゃなくなってる。
「ぽーん」って感じに。
 でもそれ以前にほかのアプリで表示された時も音なんてした覚えがないぞ! と検索掛けてみたら、
Windows7では音が出ないんだそうな。だからたぶんWindows8でもこの音出てない。たぶんね!