喫茶XRAYトップページ

[スレッド全体
]

[8539] Re4:ダウンロードしてね返信 削除
2015/3/5 (木) 11:00:34 たてぐや
▼ SOさん

> 既存も含め、アンチフィルスソフトが2つ存在するのも気持ち悪いし、
> よく干渉起こさないですね。(もしかしたら、干渉起こしてるかも)


 前の職場で3つ入れている人がいました。彼いわく「何があってもどれか
に引っかかるから安心」だそうですが、いずれもパターンファイルの期限が
とうの昔に過ぎているという…。
 私は7ではPanda Cloudというのを、10ではこれが互換性の問題で使えなかっ
たのでAviraを使っています。


[8541] Re5:ダウンロードしてね返信 削除
2015/3/5 (木) 15:40:03 Mr.XRAY
> に引っかかるから安心」だそうですが、いずれもパターンファイルの期限が
> とうの昔に過ぎているという…。


ハハハッ.そういうことはよくあることです.

SO さん wrote
>McAfeeも入ったりしますね。

最近の Adobe Reader そうですね.最初ビックリしました.
ともかく,マルウェアもそうですが,表示というか,内容がエンドユーザ
だけでなく,私も(エンドユーザ?) には難しいです.
インターネットオプションの設定だって,ハッキリ言ってわかりせん.

だからね.
[フォーム右上の閉じるボタンのヒント表示を変更するには]
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201502/15020017.txt

こういうことをしちゃダメです!!
これは「閉じる」ボタンなんです,「キャンセル」ではありません.
人心を惑わすようなことを,プログラマーがしちゃダメよ.
そうでなくても,パソコンは難解なんだから.


[8543] Re6:ダウンロードしてね返信 削除
2015/3/5 (木) 16:22:20 SO
▼ Mr.XRAYさん

> だからね.
> [フォーム右上の閉じるボタンのヒント表示を変更するには]
> http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201502/15020017.txt
>
> こういうことをしちゃダメです!!
> これは「閉じる」ボタンなんです,「キャンセル」ではありません.
> 人心を惑わすようなことを,プログラマーがしちゃダメよ.
> そうでなくても,パソコンは難解なんだから.


多分、メッセージダイアログ的なものを作りたいんですよ(・・?

[8546] Re6:ダウンロードしてね返信 削除
2015/3/6 (金) 08:21:06 おかぽん
▼ Mr.XRAYさん
> だからね.
> [フォーム右上の閉じるボタンのヒント表示を変更するには]
> http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201502/15020017.txt
>
> こういうことをしちゃダメです!!
> これは「閉じる」ボタンなんです,「キャンセル」ではありません.
> 人心を惑わすようなことを,プログラマーがしちゃダメよ.
> そうでなくても,パソコンは難解なんだから.

これができたら、
「まさか・・・
 閉じようとしているの?」
とか、出したりしようかなと思っていました・・・(^^;)

[8547] Re7:ダウンロードしてね返信 削除
2015/3/6 (金) 14:23:27 Mr.XRAY
> 「まさか・・・
>  閉じようとしているの?」


正確にはヒントなのかツールチップなのかは分かりませんが.
このウィンドウそのものが表示した時は検出できる可能性はあります.

  (1) ヒントウィンドウが表示された
  (2) その対象のフォームがアクティブである
  (3) マウスカーソルが非クライアント領域にある
      (ボタン等に[閉じる]のヒントを設定している場合の対策)

ツールチップも,ヒントウィンドウもシステムに 1 つか表示しないので
識別できます.もちろん,グローバルフックです.
ウィンドウハンドルが取得できるということは,そのウィンドウに対しての
操作の可能性があるということになります.
と思います.

[X]ボタンで表示されるこのヒント(ツールチップ)のウィンドウのクラス名は
#32774 です.
下の図は,実際にフォームをキャプチャし,更に[閉じる]ボタンの上に表示
しているヒントウィンドウだけをキャプチャして,重ね描画しています.


[8548] Re8:ダウンロードしてね返信 削除
2015/3/6 (金) 15:08:06 Mr.XRAY
> ウィンドウハンドルが取得できるということは,そのウィンドウに対しての
> 操作の可能性があるということになります.
> と思います.


今思いついたのですが,そのヒントウィンドの位置に,自作のヒントウィンドウ
を表示してしまえばいいのでは...
これなら間違いなく可能だとおもうんですが.


[8552] Re9:ダウンロードしてね返信 削除
2015/3/9 (月) 08:37:57 おかぽん
▼ Mr.XRAYさん
> 今思いついたのですが,そのヒントウィンドの位置に,自作のヒントウィンドウ
> を表示してしまえばいいのでは...
> これなら間違いなく可能だとおもうんですが.

実は、ここまでは思いつきましたが、「ではどうやってやるか?」までは
調べることができませんでした。
WinShight32とかWinspectorとか使ってみたんですけど、すぐに消えるから
捕まえきれなくて。

> [X]ボタンで表示されるこのヒント(ツールチップ)のウィンドウのクラス名は
> #32774 です.

これがわかれば、昔ジョークソフトにあった、常駐タキシード山本仮面様と
同じように、ウインドウが作成(表示)された時にできるのではないかと
考えてみましたが、まぁ、気が向いたときの調査物件入りです。

すばらしい手がかりありがとうございました。


[8563] Re10:ダウンロードしてね返信 削除
2015/3/10 (火) 09:18:21 Mr.XRAY
▼ おかぽんさん

> WinShight32とかWinspectorとか使ってみたんですけど、すぐに消えるから
> 捕まえきれなくて。


そうなんですよー.
何か方法がないもんですかね.
そうすれば,新たにヒントウィンドウ生成しなくても操作可能な気もするんですが.

> 同じように、ウインドウが作成(表示)された時にできるのではないかと
> 考えてみましたが、まぁ、気が向いたときの調査物件入りです。


生成ではなく,表示に注目してみました.
「気が向いたときの調査物件入りです」ですね.


[8567] Re11:ダウンロードしてね返信 削除
2015/3/10 (火) 18:38:59 おかぽん
▼ Mr.XRAYさん
> 「気が向いたときの調査物件入りです」ですね.
気が向いたときと言いつつ、ヒントが出ると、いろいろ調べたくなりますね。

すると、世の中には同じようなことを考える人がいるようです(たぶん)
http://www.progtown.com/topic1060130-how-to-superimpose-system-buttons.html

今のところ、実機が Windows 7 しかないので、検証は多くできませんが
見事に文字を変更できました。

そして、どこにしようかと思ったけど、元ネタのとこに投稿してみました。
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201502/15020017.txt

Mr.XRAYさんの「#32774」のキーワードがなければ、きっと気が向かなかったと思います。
ありがとうございました。

他のアプローチもあるかもしれませんが、とりあえず満足しましたので、完了物件入りです。
なにより使い道がn・・・おっと、これ以上は言えません。


[8568] Re12:ダウンロードしてね返信 削除
2015/3/10 (火) 19:30:04 Mr.XRAY
▼ おかぽんさん

> そして、どこにしようかと思ったけど、元ネタのとこに投稿してみました。
> http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201502/15020017.txt


見ました!! 見ました!!
そうか,なるほど,グローバルフックにしなくても,自アプリだから,
WM_NC 系のメッセージでいいわけですね.
難しく考えてしまっていました.

>すると、世の中には同じようなことを考える人がいるようです(たぶん)
>http://www.progtown.com/topic1060130-how-to-superimpose-system-buttons.html


しかし,まぁ,よく見つけたもんですね.
いや,いや,参りましたです.

ても,何ですね.こうやって,何かプログラムができていくのは
楽しいですね.


[8570] Re13:ダウンロードしてね返信 削除
2015/3/11 (水) 08:04:03 おかぽん
▼ Mr.XRAYさん
パフォーマンスオプションの設定でも変わるんですね。
元のソースは、単一行でのソースでしたから、もしかすると単一行であれば
パフォーマンスオプションにかかわらず、きれいに描画されるのかもしれません。

> ても,何ですね.こうやって,何かプログラムができていくのは
> 楽しいですね.

わくわくしながらプログラムしていた頃を思い出しますね。
どうしたらできるんだろうと、探求する楽しみがありました。


[8569] 閉じるボタンのツールチップ返信 削除
2015/3/10 (火) 22:41:20 Mr.XRAY
なわけで,やってみました.
Windows 7 U64(SP1) + Delphi XE(UP1) Pro でコンパイルしました.
EXE の実行は Windows 7 U64(SP1) です.

図の上が,パフォーマンスオプションの
[ヒントをフェードまたはスライドで表示する]が OFF の時
下が ON の時です.
ON の時ではも少し待つと,OFF の時と同じになる時もあります.

Windows 7 の パフォーマンスオプション の設定ダイアログは,
以下のコマンドを ファイル名を指定して実行で実行すると表示されます.
%SystemRoot%\System32\SystemPropertiesPerformance.exe


[8571] ツールチップのクラス名返信 削除
2015/3/11 (水) 14:38:24 Mr.XRAY
> Mr.XRAYさんの「#32774」のキーワードがなければ、きっと気が向かなかったと思います。

ツールチップのクラス名ですが,以下に記述があります.
https://msdn.microsoft.com/en-us/library/ee671196.aspx


[8551] システムボタンのヒント表示をフック返信 削除
2015/3/9 (月) 05:53:48 Mr.XRAY
>  (1) ヒントウィンドウが表示された
>  (2) その対象のフォームがアクティブである
>  (3) マウスカーソルが非クライアント領域にある
>     (ボタン等に[閉じる]のヒントを設定している場合の対策)


(1) の部分だけテストしてみました.
(2) 以下の処理がないので,別のウィンドウでも検出してしまいます.

http://mrxray.on.coocan.jp/Delphi/zip/CloseButton_HintHook.zip
( 463 KB EXE のみ )

[注]
検出結果を TMemo に表示していますが,表示している文字は,ヒントの
テキストではなく,閉じるボタン等のオブジェクトの名前です.


[8553] ツールチップ返信 削除
2015/3/9 (月) 17:46:50 Mr.XRAY
>システムボタンのヒント

ツールチップのことです.


[8556] Re:ツールチップ返信 削除
2015/3/9 (月) 21:28:09 たてぐや
▼ Mr.XRAYさん
 
> まぁ、気が向いたときの調査物件入りです。

 とか言いながらさらっと作っちゃうんだからさすが我らがMr.XRAYさんです。
好奇心と挑戦力に感心します。私にはとても真似できないエネルギーです。ど
うせ私は不善をなす小人です。ちょっと疲れた…。

[8557] Re2:ツールチップ返信 削除
2015/3/9 (月) 21:49:45 Mr.XRAY
▼ たてぐやさん,おかぽんさん.

いまのところ,ここまでです.
時間があったら,やるかどうかはわかりませんです (^^;
ツールチップの情報が取得できれば,直接操作できるのかも知れませんが,
今のところ分かりません.


[8558] Re3:ツールチップ返信 削除
2015/3/9 (月) 23:01:08 たてぐや
▼ Mr.XRAYさん

> とか言いながらさらっと作っちゃうんだから

 そんなふうに見えているけど、その影では大変な労力をつぎ込んでいるのは
よく解ります。
 毎度ですが、ご苦労さまです。

[8559] Re4:ツールチップ返信 削除
2015/3/9 (月) 23:17:37 Mr.XRAY
▼ たてぐやさん

>  そんなふうに見えているけど、その影では大変な労力をつぎ込んでいるのは
> よく解ります。


ですよ.そうなんですよ.ううっ.
たてぐやさん.ありがとうございます.
方針が決まれば,たとえ時間がかかってもスムーズにいくんでけどね.

今回は
[05_オブジェクトのイベントフック - エクセルの起動と終了等を監視]
http://mrxray.on.coocan.jp/Delphi/plSamples/678_IAccessibleInterface.htm#05

を思い出したので,割とすんなりといきましたが.
その,元のサンプルを作るのだって,実は,結構苦労しているんですよね.


[8554] 閉じるボタンのツールチップの表示をフック返信 削除
2015/3/9 (月) 19:37:14 Mr.XRAY
とりあえず,テストで使用したコードです.
動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    hEventHook : THandle;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses OleAcc;

{$R *.dfm}

// Delphi XEにはないので定義
function AccessibleObjectFromEvent(hWnd : HWND; dwObjewctID : DWORD;
  dwChildID : DWORD; out pacc : IAccessible; out pvarChild   : OleVariant):
  HResult;  stdcall; external 'OLEACC.DLL';
function AccessibleObjectFromPoint(ptScreen: TPOINT; out ppAcc: IAccessible;
  out pvarChild: OleVariant): HRESULT ; stdcall; external 'OLEACC.DLL';


//-----------------------------------------------------------------------------
//  ウィンドウのクラス名を取得する関数
//-----------------------------------------------------------------------------
function GetClassNameStr(hWindow: HWND): String;
var
  Buffer : array[0..MAX_PATH-1] of Char;
  Len    : Integer;
begin
  System.FillChar(Buffer, SizeOf(Buffer), #0);
  Len := Windows.GetClassName(hWindow, Buffer, Length(Buffer));
  if Len > 0 then Result := Buffer else Result := '';
end;

//-----------------------------------------------------------------------------
//  フック関数SetWinEventHookのコールバック関数
//-----------------------------------------------------------------------------
procedure WinEventProc(hWinEventHook: THandle; event: DWORD; hwnd: HWND;
  idObject, idChild: Longint; idEventThread, dwmsEventTime: DWORD); stdcall;
var
  LMousePos : TPoint;
  LpAcc     : IAccessible;
  LText     : WideString;
  Lacc      : IAccessible;
  LvarChild : OleVariant;
begin
  //イベントの引数からAcc(IAccessible)とvarChild(OleVariant)を取得
  //#32774はシステムのツールチップのクラス名
  if AccessibleObjectFromEvent(hwnd, idObject, idChild, Lacc, LvarChild) = S_OK then begin
    if GetClassNameStr(hwnd) = '#32774' then begin
      if event = EVENT_OBJECT_SHOW then begin

        //マウスカーソル位置を取得
        GetCursorPos(LMousePos);

        //マウスカーソル位置のIAccessibleオブジェクトを取得
        //AccessibleObjectFromPoint関数の戻り値のvarChildのvtは,常にVT_I4となっている
        if AccessibleObjectFromPoint(LMousePos, LpAcc, LvarChild) = S_OK then begin
          //Nameプロパティの値を取得
          if LpAcc.Get_accName(LvarChild, LText) = S_OK then begin
            Form1.Memo1.Lines.Add(LText);
          end else begin
            Form1.Memo1.Lines.Add('不明');
          end;
        end;
      end;
    end;
  end;
end;

//=============================================================================
//  [Start HOOK] フック開始
//  hEventHook  : フックのハンドル
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  if hEventHook = 0 then begin
    hEventHook := SetWinEventHook(
                             EVENT_MIN,
                             EVENT_MAX,
                             0,
                             WinEventProc,
                             0,
                             0,
                             WINEVENT_OUTOFCONTEXT);
    if hEventHook = 0 then begin
      Memo1.Lines.Add('フック関数の登録失敗');
    end else begin
      Memo1.Lines.Add('フック開始');
    end;
  end;
end;

//=============================================================================
//  [Stop HOOK] フックの終了
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  if hEventHook <> 0 then begin
    UnhookWinEvent(hEventHook);
    hEventHook := 0;
    Memo1.Lines.Add('フック終了');
  end;
end;

//=============================================================================
//  フォームの作成時 変数の初期化
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  hEventHook := 0;
end;

//=============================================================================
//  フォームを閉じる時は,フックを終了させる
//=============================================================================
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if hEventHook <> 0 then UnhookWinEvent(hEventHook);
end;

end.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82