tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル拡大鏡の画面四隅へのドッキング状態を解除するには
記事No15846
投稿日: 2014/03/05(Wed) 21:22
投稿者サリー
いつもお世話になっております。

Windows7の拡大鏡(magnify.exe)を所定の位置に表示させるプログラムを
書いています。

拡大鏡を起動し、
    Dim lnghwnd As Long
    Dim i As Long

    lnghwnd = FindWindow("Screen Magnifier Window", vbNullString)
    If lnghwnd = 0 Then
        On Local Error Resume Next
        Call Shell("magnify.exe", vbNormalFocus)
        On Local Error GoTo 0
    End If

つぎの方法で拡大鏡(矩形)の表示位置を任意に指定しています。
    lnghwnd = FindWindow("Screen Magnifier Window", vbNullString)
    Call SetWindowPos(lnghwnd, 0, 50, 100, 150, 300, SWP_NOSIZE)

しかしながら、拡大鏡を起動した際にデスクトップ(画面)の上側に
べったりと吸い付いている場合には、SetWindowPosでの位置指定や
「元のサイズに戻す」コマンドを送って言うことを聞いてくれません。

Const SC_RESTORE = &HF120 '元のサイズに戻す
Const WM_SYSCOMMAND = &H112
Call SendMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0)

画面の上下左右に(タスクバーのように)吸い付いているものをマウス
ドラッグを使わずにこのドッキングペインのようになったものを引き剥が
すうまい方法はありますでしょうか。

ウィンドウをアクティブにしてからメッセージを送ってもみましたが
やはり変化はありませんでした。

Magnification API (Vista以降)も、Magnification.dllに指定した関数が
含まれていないというエラーが発生し袋の小路です。

宜しくお願い致します。

[ツリー表示へ]
タイトルRe: 拡大鏡の画面四隅へのドッキング状態を解除するには
記事No15847
投稿日: 2014/03/06(Thu) 10:15
投稿者YK
こんにちは。

クラス名が間違っていませんか?
Window7
>     lnghwnd = FindWindow("Screen Magnifier Window", vbNullString)

    下記の方法で矩形と図形? 両方とも移動しますが

    'つぎの方法で拡大鏡(図形)の表示位置を任意に指定しています。
    lnghwnd = FindWindow("MagUIClass", "拡大鏡")
    lngRtn = SetWindowPos(lnghwnd, 0, 150, 400, 0, 0, SWP_NOACTIVATE Or SWP_NOZORDER Or SWP_NOSIZE)
    'つぎの方法で拡大鏡(矩形)の表示位置を任意に指定しています。
    lnghwnd = FindWindow("MagUIIconClass", "拡大鏡")
    lngRtn = SetWindowPos(lnghwnd, 0, 150, 400, 0, 0, SWP_NOACTIVATE Or SWP_NOZORDER Or SWP_NOSIZE)

[ツリー表示へ]
タイトルRe^2: 拡大鏡の画面四隅へのドッキング状態を解除するには
記事No15848
投稿日: 2014/03/06(Thu) 14:16
投稿者サリー
YKさん

こんにちは。
コメント有難うございます。

当方では FindWindow("MagUIClass", "拡大鏡")
にてウィンドウハンドルは取得できるのですが、SetWindowPos しても移動させることが
できません。(まだ原因はわかっていません。)

サンプルのNo.449(表示されている全てのウィンドウのタイトル・ハンドル・クラス名を列挙する)
の表示結果では"Screen Magnifier Window"と"MagUIClass"の2つが挙がってきたため、
"Screen Magnifier Window" のウィンドウハンドルを指定したところ、拡大鏡の映像表示
フレームを移動させることができました。

"MagUIIconClass" はNo.449の列挙には含まれていないためYKさんから教わるまで
気づいておりませんでしたが、"MagUIIconClass" のウィンドウハンドルを指定すると
拡大鏡のナビゲーションウィンドウを移動させることができました。


また課題である壁面ドッキング状態の解除に関してレジストリの差分をとってみたところ、
以下のレジストリ値にて状態が保持されていることがわかりました。

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\ScreenMagnifier]

"ClassicDocked"=dword:00000000 ドッキング無し
"ClassicDocked"=dword:00000001 ドッキング有り

このため、RegSetValueEx を使ってそのREG_DWORD値を 1 から 0 に変えたうえで
拡大鏡を起動したところ画面のへりにドッキングした状態の矩形ではなく、独立した
ウィンドウとして拡大鏡を表示させ、その後に移動させることができました。

Private Declare Function RegSetValueEx _
            Lib "advapi32" Alias "RegSetValueExA" _
                            (ByVal hKey As Long, _
                             ByVal lpValueName As String, _
                             ByVal Reserved As Long, _
                             ByVal dwType As Long, _
                             szData As Any, _
                             ByVal cbData As Long _
                             ) As Long

[ツリー表示へ]
タイトルRe^3: 拡大鏡の画面四隅へのドッキング状態を解除するには
記事No15849
投稿日: 2014/03/06(Thu) 15:45
投稿者YK
> YKさん
>
> 当方では FindWindow("MagUIClass", "拡大鏡")
> にてウィンドウハンドルは取得できるのですが、SetWindowPos しても移動させることが
> できません。(まだ原因はわかっていません。)

    lnghwnd = FindWindow("MagUIClass", "拡大鏡")
    lngRtn = SetWindowPos(lnghwnd, 0, 150, 400, 0, 0, SWP_NOACTIVATE Or SWP_NOZORDER Or SWP_NOSIZE)
    'つぎの方法で拡大鏡(矩形)の表示位置を任意に指定しています。
    lnghwnd = FindWindow("MagUIIconClass", "拡大鏡")
    lngRtn = SetWindowPos(lnghwnd, 0, 150, 400, 0, 0, SWP_NOACTIVATE Or SWP_NOZORDER Or SWP_NOSIZE)

を両方とも書いて実行すれば表示されている状態に引っ掛かるからです。
spy++ で拡大鏡を探してみて下さい。2個あると思います。

サリーさんの方法で出来たならそれでよろしかと。

[ツリー表示へ]
タイトルRe^4: 拡大鏡の画面四隅へのドッキング状態を解除するには
記事No15850
投稿日: 2014/03/07(Fri) 10:18
投稿者サリー
YK さん

回答くださり有難うございます。
おかげさまで実現させることが出来ましたのでクローズとさせていただきます。

サンプルプログラムにて MagUIIconClass が表示されなかったのは、
GW_OWNER の値が 0 のウィンドウハンドルだけをリストに表示していたためでした。

MagUIIconClass は子ウィンドウ扱いでした。
-----------------------------------
MagUIClass
GW_OWNER=0
-----------------------------------
MagUIIconClass
GW_CHILD=0
GW_ENABLEDPOPUP=0
-----------------------------------
Screen Magnifier Window
GW_OWNER=0
GW_ENABLEDPOPUP=0
-----------------------------------

[ツリー表示へ]