デスクトップ非アクティブで離席中がロック画面で働かない

286 views
Skip to first unread message

A.GOTO

unread,
Jul 19, 2017, 4:59:24 AM7/19/17
to IP Messenger掲示板
良いソフトありがとうございます。
かれこれ20年近く使用させていただいてます。

V4.50から追加になった「デスクトップ非アクティブで離席中に」するオプションが
ロック画面(ctrl+alt+del)で動作しない模様です。弊社では離席時にロックする習慣があり、
せっかくのオプションなのですが少し残念です。

ソースを見たのですがTMainWin::CleanupProcで使用しているGetForegroundWindowが
スクリーンセーバではNULLを返しますが画面ロックでは有効なハンドルを返し続ける事が問題のようです。

同オプションがなかった時代に社内限定ですが自動的に不在になるようにソースを修正していました。
(スクリーンセーバとは無関係に不在になるまでの時間を任意に設定できるようにしていました)
現在、同じやり方でV4.50を修正して一応凌いでおります・・(下記)

できましたら画面ロックにも対応していただければと思います。
(おそらく何らかのAPIを使用してもっとスマートにできるものと思います)

長文すいません。ご検討よろしくお願いいたします。

**********************************************************************************
#define DESKTOP_LOCKMAX 5
#define LEAVE_SEAT_MAX (5 * 60) // 5分固定

BOOL TMainWin::CleanupProc()
{
static DWORD last;
DWORD cur = GetTick();

if (cfg->useLockName) {
static POINT LastMP;
POINT NowMP;
static DWORD NoTouchTimer;
DWORD i, ks;
BOOL lock = FALSE;
BOOL need_br = FALSE;

// 現在のマウス位置を得る、前回からキーが押されたか調べる
::GetCursorPos(&NowMP);
for (i = ks = 0; i < 256; i++) ks |= ::GetAsyncKeyState(i);
// マウス位置、キーに変化があるかチェック
if (NowMP.x != LastMP.x || NowMP.y != LastMP.y || (ks & 1) == 1)
NoTouchTimer = LEAVE_SEAT_MAX; // 変化有ればタイマープリセット
else if (NoTouchTimer > 0)
NoTouchTimer--; // 変化がなければダウンカウント
else
lock = TRUE; // タイムアップしたのでロックフラグセット
// マウス位置を保存する
LastMP = NowMP;

// これ以降はオリジナルの処理(省略)
if (lock && desktopLockCnt < DESKTOP_LOCKMAX) {
if (++desktopLockCnt >= DESKTOP_LOCKMAX) {
need_br = TRUE;
}


Hiroaki SHIROUZU

unread,
Jul 19, 2017, 7:48:40 AM7/19/17
to ipms...@googlegroups.com
なるほど。
次のバージョンで、何らかの対処を入れておきますね。

P.S ソースコードを変更して使いやすい形に作り直すというのは、オープンソースの利点を有効活用なさってますね(笑)

A.GOTO

unread,
Jul 19, 2017, 10:18:19 PM7/19/17
to IP Messenger掲示板
返信ありがとうございます。

オープンソースとしての活用はずいぶん前からになります。
実はVer1.42の頃に自動不在と同時に今のメンバーマスターのような機能を実装して使用しておりました。
各拠点に1台中継用のIPMSGを立ち上げておいて、今でもある「LocalNetwork以外へのBroadCast設定」に
他拠点の中継用IPMSGをユニキャストアドレスで設定しておきます。
中継用IPMSGはIPMSG_BR_ENTRY/IPMSG_BR_EXIT/IPMSG_BR_ABSENCEを受信するとホスト名の文字列に
中継を示す識別子と送信元のIPアドレスを追加して他拠点の中継用IPMSGに送信します。
中継先ではこれをブロードキャストでローカルに送信し、末端のIPMSGは中継識別子を確認すると
中継元のIPアドレスではなくホスト名に追加されたIPアドレスをホストのIPアドレスとして置き換えて
識別子以降を削除するといったしくみでした。一応まともに動作していました。

多岐にわたり手を入れたため本家のバージョンアップに全くついていけず、つい最近まで
Ver1.42改として使用していました。皆からなぜ便利な最新版にできないのか不思議がられても
IPMSGはメッセージの送受信が本質だ!と強弁して抵抗しておりましたが、本家についに
メンバーマスターが追加されたのを見て一気に置き換えたところです。

また長文になってしまいましたが、こんな活用をしてる者もいたとお知らせしたく。
よろしくお願いいたします。

Hiroaki SHIROUZU

unread,
Jul 20, 2017, 1:00:23 AM7/20/17
to ipms...@googlegroups.com
ご報告ありがとうございます。

それにしても、v1.42 (2001/01リリース)をずっと改造して、マスター機能的なものまで実装していたとはすごいですね。

ちなみに、v4.5から新しく考えたIPDictというフォーマットを使った通信となったため、独自オプション拡張などはとても楽になりました。
(v4.5以降同士のみですが)

A.GOTO

unread,
Jul 20, 2017, 6:00:36 AM7/20/17
to IP Messenger掲示板
作者の方にお褒め頂き大変光栄です。

いま皆が16年分のあらゆるアップデートを怒涛の如く享受しており感動しきりです。

新しいIPDictフォーマットもまた勉強させていただきます。

ありがとうございました。





Reply all
Reply to author
Forward
0 new messages