他のアプリケーションに移った(キーボード)フォーカスを戻すには?


ゆたぷ  2003-09-22 18:39:48  No: 108773

はじめまして。過去のログを読ませていただきながら、
この掲示板にたどり着きました。
よろしくお願いします。

早速質問なのですが、今私が作っているアプリケーションは、
デスクトップ画面(イメージ)をキャプチャして、マウスドラッグに
より(キャプチャした)画面上をペイントするというタイプのものです。

ウィンドウズキー(やAlt+Tabなど)を押すことにより、キーボードのフォーカスが他のアプリケーションに移動しますが(その事象自体は必要)、
タイマーなどを使って、キーボードのフォーカスを自身のアプリケーションに自動的に戻すことはできないでしょうか?

同義の質問かと思うのですが、Shiftキーを押したまま、アプリケーションを起動すると、キーボードのフォーカスは立ち上げたアプリケーションに存在しない形で起動されるのですが、自動的に起動したアプリケーションにキーボードのフォーカスを与えることはできないでしょうか?
長くなりましたがよろしくお願いします。


Say  2003-09-22 18:43:41  No: 108774

要はグローバルキーフックをしたいということでしょうか?
フックプロシージャをVC++などでdllとして作成すれば可能です。


ゆたぷ  2003-09-23 01:55:13  No: 108775

Sayさんコメントありがとうございます。
詳しくは存じていないのですが、
グローバルフックと呼ばれる手段で
解決が可能であることは了解いたしました。

しかしながら、Shiftキーを押したまま
アプリケーションを起動したときに
Sub MainでShiftキーの印加を
If Control.ModifierKeys And Keys.Shift ・・・
により確認できるにも関わらず
その後Form1.ShowDialogで表示するフォームが
KeyDownのイベントのフォーカスから外れてしまうのが
理解しにくい状態です。
(Shiftキーを押したままでなければ、KeyDownのイベントは
発生します)
先に行った質問のうち下の質問のみを考慮したものですが、
恐れ入りますが、解決策等のコメントをお願いいたします。


ゆたぽん  2003-09-23 08:23:29  No: 108776

少々補足をさせていただきます。
Sub Mainの中で呼ばれるフォームは
PictureBoxが配置されており、DockがFillの状態に
なっています。FormはTopMostがTrueになっていて
呼ばれた時には最大化されるようになっています。

Form_Loadの中で、
Form.activate()
Form.PictureBox.focus()
を行っていますが、効果は確認できません。
よろしくお願いいたします。

VB.NET 2003


ゆたぷ  2003-09-23 08:23:43  No: 108777

少々補足をさせていただきます。
Sub Mainの中で呼ばれるフォームは
PictureBoxが配置されており、DockがFillの状態に
なっています。FormはTopMostがTrueになっていて
呼ばれた時には最大化されるようになっています。

Form_Loadの中で、
Form.activate()
Form.PictureBox.focus()
を行っていますが、効果は確認できません。
よろしくお願いいたします。

VB.NET 2003


satoru-i  2003-09-23 23:40:53  No: 108778

根本的な解決にはなりませんが、
  AppActivate "フォームのタイトル(TextかCaption)"
をタイマーの中などで、実行してみてください。
アクティブが帰ってくると思います。

根本的な解決でない理由は、
他のアプリがアクティブになろうとしているときなど、
アクティブになれずにタスクバーのボタンが点滅するだけになることが
あるからです。

意味が違ったらごめんなさい。


ゆたぷ  2003-09-24 03:55:09  No: 108779

satoru-iさん、コメントをありがとうございます。

早速AppActivateをタイマーから呼び出してみたのですが・・・。
確かに、対象とするフォームはアクティブになっている
ようなのですが(タイトルバーの色で判断)
キーボードのキーを押しても、KeyDownのイベントは
発生しないようです。

Shiftキーを押しながら起動したアプリケーションの
(メインの)フォームではキーボードのフォーカスが
別に行ってしまうのでしょうか?

不思議なのですが、VB.NET2003の開発環境から
Shiftキー+開始ボタンで開始した場合は所望の動きをします。

再度補足になるのですが、表示されたフォーム(上のピクチャボックス)
上をクリックすると、キーボードのイベントはフォーム上で発生する
ようになります。そこで、API32のSendMessageを使って、
Dim wHnd As Int32
Const WM_LBUTTONDOWN = &H201        'マウスのボタンを押す
Const WM_LBUTTONUP = &H202          'マウスのボタンを離す

wHnd = Me.PictureBox.Handle.ToInt32
’マウスのクリックを擬似的に再現
Call SendMessage(wHnd, WM_LBUTTONDOWN, 0, 0)
Call SendMessage(wHnd, WM_LBUTTONUP, 0, 0)

も行ってみたのですが、これも効果ありませんでした。
重ねてコメントをお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加