ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 14:39

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2008年4月11日(金) 12:09 
 むーと申します。 
AB歴1ヶ月(プログラムはABが初) AB4.23使用

 ボタンをクリックすると
他のアプリケーション(メモ帳やIEなど)の非アクティブウィンドウを
アクティブにしたり最小化する方法がわかりません。

自身を最小化することで誤魔化そうと思ったのですが
複数のウィンドウが重なっている場合、目的のウィンドウがアクティブに
ならなくて・・・

検索の単語が悪かったのか、見つかりませんでした。
自分のウィンドウ以外は操作できないのでしょうか?


通報する
ページトップ
   
投稿記事Posted: 2008年4月11日(金) 21:04 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
>  ボタンをクリックすると
> 他のアプリケーション(メモ帳やIEなど)の非アクティブウィンドウを
> アクティブにしたり最小化する方法がわかりません。
非アクティブウィンドウは大抵複数あると思うので、それらを同時にアクティブにすることってできるんでしょうかね...?

非アクティブウィンドウを最小化する方法は以下のようになります。 特定のウィンドウをアクティブ、例えば親がいる可視状態の非アクティブウィンドウのIEだけとか、~のメモ帳だけとかならFindWindow()関数も一緒に合わせれば出来るような気もします。

ただ、範囲を狭めても~のIEが複数ある場合や、~のメモ帳が複数ある場合は、結局最初書いた通り複数のウィンドウを同時にアクティブにできるのか? ということになります。

もしアクティブという状態を、最大化も最小化もされていない状態のことだと捉えていたとしたら、ShowWindow()関数の第二引数をSW_SHOWNORMALだかにするとうまくいくかと思います。


通報する
ページトップ
投稿記事Posted: 2008年4月13日(日) 11:35 
 早い返答ありがとうございます。
やりたいことそのもでした。

その他のウィンドウを特に最小化せずに
メモ帳(すでに起動された)を前面にするには


hWnd = GetWindow("notepad.exe",GW_OWNER)
ShowWindow(hWnd,SW_RESTORE)

で、いけるのかと思ったのですが・・・
違うようで。


通報する
ページトップ
   
投稿記事Posted: 2008年4月13日(日) 12:40 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
> メモ帳(すでに起動された)を前面にするには
>
>
> hWnd = GetWindow("notepad.exe",GW_OWNER)
> ShowWindow(hWnd,SW_RESTORE)
>
> で、いけるのかと思ったのですが・・・
> 違うようで。
そうですね...。
ヘルプを見てみると分かるんですけど、GetWindow()関数の第一引数にはウィンドウ ハンドルを指定するので、"notepad.exe"という文字列を指定するのは間違いです。
GetWindow()関数は、メモ帳のエディットボックスのウィンドウ ハンドルを取得したいような時に使えます。

で、起動しているメモ帳のウィンドウ ハンドルは以下のようにして取得します。
コメントアウトを外すと、ついでにメモ帳のエディットボックスに文字列を設定します。 これだと、起動しているメモ帳一つだけなので、すべてのメモ帳に対して処理をしたい場合は、前回投稿したコードをちょっと書き換えます。


通報する
ページトップ
投稿記事Posted: 2008年4月14日(月) 02:18 
 何度も素早い回答ありがとうございます。

 とりあえずメモ帳1つとIEなどその他イロイロを起動した状態で
試してみたのですが、ボタンを押してもメモ帳がアクティブにならず、
自身がアクティブ?(デスクトップにフォーカスしてるのかも)に、
なってしまう事があります。WinXP P SP3v3264 で確認。
(今回指定したメモ帳と自身以外は最小化はされる)

自分自身も最小化することで回避するしかないのでしょうか?


 教えていただいたコードをコピー&ペーストするだけでは、納得
いかないもので、基本的な事かも知りませんが、幾つか質問しても
よいでしょうか。

・毎回ハンドルを取得する理由。
 ShowWindow(2098862,SW_RESTORE) のような書き方は不可?
 ハンドルは固定ではない?

・クラス名はどのように調べばよい?メモ帳以外も操作したいので。
 クラス名≠タイトルバーの文字列?

・コードの目的。
 If lstrcmp(className,"Progman")=0 Then Exit Function


 タスクバーの [メモ帳] をクリックした時の動作(と同じ効果)
をするのに、ここまで悩むとは、まだまだ勉強不足です・・・

.


通報する
ページトップ
   
投稿記事Posted: 2008年4月14日(月) 21:02 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
>  とりあえずメモ帳1つとIEなどその他イロイロを起動した状態で
> 試してみたのですが、ボタンを押してもメモ帳がアクティブにならず、
> 自身がアクティブ?(デスクトップにフォーカスしてるのかも)に、
> なってしまう事があります。WinXP P SP3v3264 で確認。
> (今回指定したメモ帳と自身以外は最小化はされる)
∑( ̄□ ̄;)
そうでしたそうでした...。アクティブにしたいんでしたよね...。忘れてました。
ウィンドウをアクティブにするにはSetForegroundWindow()関数を使います。
SetActiveWindow()関数と違うということを覚えていてください。
以下修正部分。
コード:
	If lstrcmp(className,"Notepad")=0 Then
		ShowWindow(hWnd,SW_RESTORE)
		SetForegroundWindow(hWnd)
	End If
>  教えていただいたコードをコピー&ペーストするだけでは、納得
> いかないもので、基本的な事かも知りませんが、幾つか質問しても
> よいでしょうか。
納得するということは理解することで、理解するということは応用できるということに繋がるのでドンドンしてもらって構いません。
そもそも、忙しくてササッと返信してしまうので説明不足なんですよね。

> ・毎回ハンドルを取得する理由。
>  ShowWindow(2098862,SW_RESTORE) のような書き方は不可?
>  ハンドルは固定ではない?
これは目的によってハンドルを毎回取得するかどうかを判断します。
一度メモ帳のハンドルを取得したらずっとそれを使い続けても構いません。
ただ、メモ帳のハンドルを取得した後にメモ帳を終了した場合、そのハンドルはもう使えません。もう一度メモ帳を起動してハンドルを再取得する必要があります。

2098862と書いた所から察するに、ウィンドウ ハンドルをアプリケーションの識別番号みたいな感じで捉えているかもしれませんが、それは間違いです。
ウィンドウ ハンドルはアプリケーションが起動する度にWindows(?)から与えられるもので、固定された値ではありません。
アプリケーションが起動してるうちは有効ですが、再起動したアプリケーションのウィンドウ ハンドルに再度その値が与えられるとは限りません。

> ・クラス名はどのように調べばよい?メモ帳以外も操作したいので。
>  クラス名≠タイトルバーの文字列?
クラス名とタイトル名は必ずしもイコールであるとは限らないですね。
インターネットで「メモ帳 クラス名」とか「IE クラス名」って調べるという手もありますが、クラス名を見るだけのソフトを用意しました。
getclassname.lzh
※もし暇ならブログもどうぞ。
そのうちもっと綺麗な物を作ってプロジェクト毎公開しようかと思います...。

> ・コードの目的。
>  If lstrcmp(className,"Progman")=0 Then Exit Function
これはプログラム マネージャーのウィンドウを対象から外すのが目的です。
自分が昔書いたコードから引っ張ってきたので、消しても問題無いかもしれません。
たしか、TerminateProcess()関数でウッカリ強制終了させたりしない為に書いてた気がします。

>  タスクバーの [メモ帳] をクリックした時の動作(と同じ効果)
> をするのに、ここまで悩むとは、まだまだ勉強不足です・・・
むーさんは勉強したらバキバキ伸びて、いつの間にか回答専門になってると思います(笑)


通報する
ページトップ
投稿記事Posted: 2008年4月15日(火) 00:18 
 動作確認できました。
質問の回答も、ありがとうございます。
getclassname.lzh 活用させてもらいます。
ブログブックマーク入りです♪

 SetForegroundWindow() や SetActiveWindow()
と言った関数すら見つけられなかったのはちっと恥ずかしいです。
ヘルプを一通り見ることからはじめようと思います。

 いずれ理解出来る様になったときは回答側もやりたいです。
いつになったらできるかなぁ
...


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Bing [Bot] & ゲスト[11人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean