むーと申します。
AB歴1ヶ月(プログラムはABが初) AB4.23使用
ボタンをクリックすると
他のアプリケーション(メモ帳やIEなど)の非アクティブウィンドウを
アクティブにしたり最小化する方法がわかりません。
自身を最小化することで誤魔化そうと思ったのですが
複数のウィンドウが重なっている場合、目的のウィンドウがアクティブに
ならなくて・・・
検索の単語が悪かったのか、見つかりませんでした。
自分のウィンドウ以外は操作できないのでしょうか?
非アクティブウィンドウをアクティブにするには?
Re: 非アクティブウィンドウをアクティブにするには?
> ボタンをクリックすると
> 他のアプリケーション(メモ帳やIEなど)の非アクティブウィンドウを
> アクティブにしたり最小化する方法がわかりません。
非アクティブウィンドウは大抵複数あると思うので、それらを同時にアクティブにすることってできるんでしょうかね...?
非アクティブウィンドウを最小化する方法は以下のようになります。
ただ、範囲を狭めても~のIEが複数ある場合や、~のメモ帳が複数ある場合は、結局最初書いた通り複数のウィンドウを同時にアクティブにできるのか? ということになります。
もしアクティブという状態を、最大化も最小化もされていない状態のことだと捉えていたとしたら、ShowWindow()関数の第二引数をSW_SHOWNORMALだかにするとうまくいくかと思います。
> 他のアプリケーション(メモ帳やIEなど)の非アクティブウィンドウを
> アクティブにしたり最小化する方法がわかりません。
非アクティブウィンドウは大抵複数あると思うので、それらを同時にアクティブにすることってできるんでしょうかね...?
非アクティブウィンドウを最小化する方法は以下のようになります。
[ここをクリックすると内容が表示されます]
特定のウィンドウをアクティブ、例えば親がいる可視状態の非アクティブウィンドウのIEだけとか、~のメモ帳だけとかならFindWindow()関数も一緒に合わせれば出来るような気もします。コード: 全て選択
TypeDef WNDENUMPROC = *Function(hwnd As HWND, lParam As LPARAM) As BOOL
Declare Function EnumWindows Lib "user32" (
ByVal lpEnumFunc As WNDENUMPROC,
ByVal lPalam As LPARAM) As BOOL
Function EnumWndProc(ByVal hWnd As HWND,ByVal lParam As LPARAM) As BOOL
Dim className[256] As Byte
EnumWndProc=TRUE
' 親がいる可視状態の非アクティブウィンドウだけピックアップ
If (hWnd=hMainWnd) Or (GetForegroundWindow()=hWnd) Or (IsWindowVisible(hWnd)<>TRUE) Or (GetWindow(hWnd,GW_OWNER)<>NULL) Then Exit Function
GetClassName(hWnd,className,256)
If GetWindowTextLength(hWnd)=0 Then Exit Function
If lstrcmp(className,"Progman")=0 Then Exit Function
' 件のウィンドウだけ最小化
ShowWindow(hWnd,SW_MINIMIZE)
End Function
Sub MainWnd_CommandButton1_Click()
EnumWindows(AddressOf(EnumWndProc),0)
End Sub
ただ、範囲を狭めても~のIEが複数ある場合や、~のメモ帳が複数ある場合は、結局最初書いた通り複数のウィンドウを同時にアクティブにできるのか? ということになります。
もしアクティブという状態を、最大化も最小化もされていない状態のことだと捉えていたとしたら、ShowWindow()関数の第二引数をSW_SHOWNORMALだかにするとうまくいくかと思います。
Re: 非アクティブウィンドウをアクティブにするには?
早い返答ありがとうございます。
やりたいことそのもでした。
その他のウィンドウを特に最小化せずに
メモ帳(すでに起動された)を前面にするには
hWnd = GetWindow("notepad.exe",GW_OWNER)
ShowWindow(hWnd,SW_RESTORE)
で、いけるのかと思ったのですが・・・
違うようで。
やりたいことそのもでした。
その他のウィンドウを特に最小化せずに
メモ帳(すでに起動された)を前面にするには
hWnd = GetWindow("notepad.exe",GW_OWNER)
ShowWindow(hWnd,SW_RESTORE)
で、いけるのかと思ったのですが・・・
違うようで。
Re: 非アクティブウィンドウをアクティブにするには?
> メモ帳(すでに起動された)を前面にするには
>
>
> hWnd = GetWindow("notepad.exe",GW_OWNER)
> ShowWindow(hWnd,SW_RESTORE)
>
> で、いけるのかと思ったのですが・・・
> 違うようで。
そうですね...。
ヘルプを見てみると分かるんですけど、GetWindow()関数の第一引数にはウィンドウ ハンドルを指定するので、"notepad.exe"という文字列を指定するのは間違いです。
GetWindow()関数は、メモ帳のエディットボックスのウィンドウ ハンドルを取得したいような時に使えます。
で、起動しているメモ帳のウィンドウ ハンドルは以下のようにして取得します。
コメントアウトを外すと、ついでにメモ帳のエディットボックスに文字列を設定します。
>
>
> hWnd = GetWindow("notepad.exe",GW_OWNER)
> ShowWindow(hWnd,SW_RESTORE)
>
> で、いけるのかと思ったのですが・・・
> 違うようで。
そうですね...。
ヘルプを見てみると分かるんですけど、GetWindow()関数の第一引数にはウィンドウ ハンドルを指定するので、"notepad.exe"という文字列を指定するのは間違いです。
GetWindow()関数は、メモ帳のエディットボックスのウィンドウ ハンドルを取得したいような時に使えます。
で、起動しているメモ帳のウィンドウ ハンドルは以下のようにして取得します。
コメントアウトを外すと、ついでにメモ帳のエディットボックスに文字列を設定します。
[ここをクリックすると内容が表示されます]
これだと、起動しているメモ帳一つだけなので、すべてのメモ帳に対して処理をしたい場合は、前回投稿したコードをちょっと書き換えます。コード: 全て選択
Dim hWnd As HWND
' Dim hNoteEdit As HWND
hWnd=FindWindow("Notepad",NULL)
ShowWindow(hWnd,SW_RESTORE)
' hNoteEdit=GetWindow(hWnd,GW_CHILD)
' SendMessage(hNoteEdit,WM_SETTEXT,0,"メモ帳のエディットボックスを操作")
[ここをクリックすると内容が表示されます]
コード: 全て選択
Function EnumWndProc(ByVal hWnd As HWND,ByVal lParam As LPARAM) As BOOL
Dim className[256] As Byte
EnumWndProc=TRUE
' 親がいる可視状態の非アクティブウィンドウだけピックアップ
If (hWnd=hMainWnd) Or (GetForegroundWindow()=hWnd) Or (IsWindowVisible(hWnd)<>TRUE) Or (GetWindow(hWnd,GW_OWNER)<>NULL) Then Exit Function
GetClassName(hWnd,className,256)
' ~だけのメモ帳だけピックアップ
If lstrcmp(className,"Notepad")=0 Then
ShowWindow(hWnd,SW_RESTORE)
End If
End Function
Re: 非アクティブウィンドウをアクティブにするには?
何度も素早い回答ありがとうございます。
とりあえずメモ帳1つとIEなどその他イロイロを起動した状態で
試してみたのですが、ボタンを押してもメモ帳がアクティブにならず、
自身がアクティブ?(デスクトップにフォーカスしてるのかも)に、
なってしまう事があります。WinXP P SP3v3264 で確認。
(今回指定したメモ帳と自身以外は最小化はされる)
自分自身も最小化することで回避するしかないのでしょうか?
教えていただいたコードをコピー&ペーストするだけでは、納得
いかないもので、基本的な事かも知りませんが、幾つか質問しても
よいでしょうか。
・毎回ハンドルを取得する理由。
ShowWindow(2098862,SW_RESTORE) のような書き方は不可?
ハンドルは固定ではない?
・クラス名はどのように調べばよい?メモ帳以外も操作したいので。
クラス名≠タイトルバーの文字列?
・コードの目的。
If lstrcmp(className,"Progman")=0 Then Exit Function
タスクバーの [メモ帳] をクリックした時の動作(と同じ効果)
をするのに、ここまで悩むとは、まだまだ勉強不足です・・・
.
とりあえずメモ帳1つとIEなどその他イロイロを起動した状態で
試してみたのですが、ボタンを押してもメモ帳がアクティブにならず、
自身がアクティブ?(デスクトップにフォーカスしてるのかも)に、
なってしまう事があります。WinXP P SP3v3264 で確認。
(今回指定したメモ帳と自身以外は最小化はされる)
自分自身も最小化することで回避するしかないのでしょうか?
教えていただいたコードをコピー&ペーストするだけでは、納得
いかないもので、基本的な事かも知りませんが、幾つか質問しても
よいでしょうか。
・毎回ハンドルを取得する理由。
ShowWindow(2098862,SW_RESTORE) のような書き方は不可?
ハンドルは固定ではない?
・クラス名はどのように調べばよい?メモ帳以外も操作したいので。
クラス名≠タイトルバーの文字列?
・コードの目的。
If lstrcmp(className,"Progman")=0 Then Exit Function
タスクバーの [メモ帳] をクリックした時の動作(と同じ効果)
をするのに、ここまで悩むとは、まだまだ勉強不足です・・・
.
Re: 非アクティブウィンドウをアクティブにするには?
> とりあえずメモ帳1つとIEなどその他イロイロを起動した状態で
> 試してみたのですが、ボタンを押してもメモ帳がアクティブにならず、
> 自身がアクティブ?(デスクトップにフォーカスしてるのかも)に、
> なってしまう事があります。WinXP P SP3v3264 で確認。
> (今回指定したメモ帳と自身以外は最小化はされる)
∑( ̄□ ̄;)
そうでしたそうでした...。アクティブにしたいんでしたよね...。忘れてました。
ウィンドウをアクティブにするにはSetForegroundWindow()関数を使います。
SetActiveWindow()関数と違うということを覚えていてください。
以下修正部分。
> 教えていただいたコードをコピー&ペーストするだけでは、納得
> いかないもので、基本的な事かも知りませんが、幾つか質問しても
> よいでしょうか。
納得するということは理解することで、理解するということは応用できるということに繋がるのでドンドンしてもらって構いません。
そもそも、忙しくてササッと返信してしまうので説明不足なんですよね。
> ・毎回ハンドルを取得する理由。
> ShowWindow(2098862,SW_RESTORE) のような書き方は不可?
> ハンドルは固定ではない?
これは目的によってハンドルを毎回取得するかどうかを判断します。
一度メモ帳のハンドルを取得したらずっとそれを使い続けても構いません。
ただ、メモ帳のハンドルを取得した後にメモ帳を終了した場合、そのハンドルはもう使えません。もう一度メモ帳を起動してハンドルを再取得する必要があります。
2098862と書いた所から察するに、ウィンドウ ハンドルをアプリケーションの識別番号みたいな感じで捉えているかもしれませんが、それは間違いです。
ウィンドウ ハンドルはアプリケーションが起動する度にWindows(?)から与えられるもので、固定された値ではありません。
アプリケーションが起動してるうちは有効ですが、再起動したアプリケーションのウィンドウ ハンドルに再度その値が与えられるとは限りません。
> ・クラス名はどのように調べばよい?メモ帳以外も操作したいので。
> クラス名≠タイトルバーの文字列?
クラス名とタイトル名は必ずしもイコールであるとは限らないですね。
インターネットで「メモ帳 クラス名」とか「IE クラス名」って調べるという手もありますが、クラス名を見るだけのソフトを用意しました。
getclassname.lzh
※もし暇ならブログもどうぞ。
そのうちもっと綺麗な物を作ってプロジェクト毎公開しようかと思います...。
> ・コードの目的。
> If lstrcmp(className,"Progman")=0 Then Exit Function
これはプログラム マネージャーのウィンドウを対象から外すのが目的です。
自分が昔書いたコードから引っ張ってきたので、消しても問題無いかもしれません。
たしか、TerminateProcess()関数でウッカリ強制終了させたりしない為に書いてた気がします。
> タスクバーの [メモ帳] をクリックした時の動作(と同じ効果)
> をするのに、ここまで悩むとは、まだまだ勉強不足です・・・
むーさんは勉強したらバキバキ伸びて、いつの間にか回答専門になってると思います(笑)
> 試してみたのですが、ボタンを押してもメモ帳がアクティブにならず、
> 自身がアクティブ?(デスクトップにフォーカスしてるのかも)に、
> なってしまう事があります。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()関数でウッカリ強制終了させたりしない為に書いてた気がします。
> タスクバーの [メモ帳] をクリックした時の動作(と同じ効果)
> をするのに、ここまで悩むとは、まだまだ勉強不足です・・・
むーさんは勉強したらバキバキ伸びて、いつの間にか回答専門になってると思います(笑)
Re: 非アクティブウィンドウをアクティブにするには?
動作確認できました。
質問の回答も、ありがとうございます。
getclassname.lzh 活用させてもらいます。
ブログブックマーク入りです♪
SetForegroundWindow() や SetActiveWindow()
と言った関数すら見つけられなかったのはちっと恥ずかしいです。
ヘルプを一通り見ることからはじめようと思います。
いずれ理解出来る様になったときは回答側もやりたいです。
いつになったらできるかなぁ
...
質問の回答も、ありがとうございます。
getclassname.lzh 活用させてもらいます。
ブログブックマーク入りです♪
SetForegroundWindow() や SetActiveWindow()
と言った関数すら見つけられなかったのはちっと恥ずかしいです。
ヘルプを一通り見ることからはじめようと思います。
いずれ理解出来る様になったときは回答側もやりたいです。
いつになったらできるかなぁ
...