[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/01/24(Mon) 10:45
投稿者名:TERU
URL :
タイトル:
画面が背面に
はじめまして。TERUと申します。
大変申し訳ございませんが教えて頂きたい事があります。

メニュー画面から起動したアプリの画面がメニューの背面に隠れてしまうのです。

現在、VB2.0アプリケーションをWinXPで稼動させています。
メニュー画面にボタンを付けて、ボタンが押されたら
SHELLで該当アプリを起動します。
windowsstyle引数にはvbNormalFocus(1)を指定しています。

一旦アプリ画面は表示されるのですが直ぐにメニューの背面に隠れてしまったり
数秒経ってから隠れたりしてしまう場合もあります。

Win95ではこのような現象はおきていませんでした。
またWinXPでもこのような現象が起こらないものが多いのですが。

何が考えられるのでしょうか?
対応策をご存知の方は是非教えていただきたく思います。

(出来る限りSHELLで起動後、メニューを消す事はしたくありません。)

よろしくお願いいたします。

投稿時間:2005/01/24(Mon) 11:22
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 画面が背面に
多分、Win98からの仕様の変更によるものと思われます。
(詳しくは、MSの技術情報を参照)

一度、ここの フォームを常に手前に表示する 等を試して見て下さい。

投稿時間:2005/01/24(Mon) 14:25
投稿者名:TERU
URL :
タイトル:
Re^2: 画面が背面に
早速のレスありがとうございます。

スキル不足でなかなか解決できません。
MSの技術情報見てみましたが、なかなか探しきれていない状態です。
もうすこしがんぱってみますが、他にヒントがあれば
教えていただきたいのですが。

宜しくお願いいたします。


> 多分、Win98からの仕様の変更によるものと思われます。
> (詳しくは、MSの技術情報を参照)
>
> 一度、ここの フォームを常に手前に表示する 等を試して見て下さい。

投稿時間:2005/01/24(Mon) 15:48
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 画面が背面に
> もうすこしがんぱってみますが、他にヒントがあれば
> 教えていただきたいのですが。

一度、ここの フォームを常に手前に表示する 等を試して見て下さい。

上記は試されたのでしょうか?

投稿時間:2005/01/24(Mon) 17:07
投稿者名:TERU
URL :
タイトル:
Re^4: 画面が背面に
> > もうすこしがんぱってみますが、他にヒントがあれば
> > 教えていただきたいのですが。
>
>  一度、ここの フォームを常に手前に表示する 等を試して見て下さい。
>
> 上記は試されたのでしょうか?

申し訳ございません。
どういう事か理解できませんでしたので下記の事をやっていました。
多分、提案頂いた事と違う事をやっているのだと思い、
この件に関してはレスしていませんでした。

1・この掲示板やログから「フォームを常に手前に表示」で検索しました。
2・WinXPのタスクマネージャのオプションで「常に手前に表示」を選択して
 どのような動きをするのか見てみました。

[1]は対象はありませんでした。
[2]の確認はしましたが、こういう動きで良いかどうか考えています。
   他アプリを裏で動かして処理したい人が多いと聞いたことがありましたので。

ご提案頂いた事と違う事をしてませんか?
全くスキルが無くて、自分がやる事に自身が持てません。
ご指摘お願いいたします。

投稿時間:2005/01/24(Mon) 17:30
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: 画面が背面に
>  一度、ここの フォームを常に手前に表示する 等を試して見て下さい。

[フォームを常に手前に表示する] とは、左のメニューの[画面・文字等の表示]の
中の[フォームを常に手前に表示する]というサンプルがあるのでそれを試してください。
という事です。
又は左のメニューより逆引きヘルプ一覧表内から[フォームを常に手前に表示する]を探し
試して下さい。と書いたつもりです。

投稿時間:2005/01/24(Mon) 16:13
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 画面が背面に
サービス技術情報に掲載されていた記事は見つからなかったのですが
下記リンクの「最前面ウィンドウの扱い」の項に同様の事が書かれています。

hhttp://www.microsoft.com/japan/technet/prodtechnol/winxppro/deploy/exappmigratoxp.mspx

又、ここの[当サイト内・外の検索]から
[GetForegroundWindow GetWindowThreadProcessId]をキーワードにGoogle等で
検索して見て下さい。
サンプルがごろごろしています。

但し、詳しい状況が解りませんのでまずは、先に提案した方法を試して見て下さい。

投稿時間:2005/01/24(Mon) 18:39
投稿者名:TERU
URL :
タイトル:
Re^4: 画面が背面に
> サービス技術情報に掲載されていた記事は見つからなかったのですが
> 下記リンクの「最前面ウィンドウの扱い」の項に同様の事が書かれています。
>
> hhttp://www.microsoft.com/japan/technet/prodtechnol/winxppro/deploy/exappmigratoxp.mspx
>
> 又、ここの[当サイト内・外の検索]から
> [GetForegroundWindow GetWindowThreadProcessId]をキーワードにGoogle等で
> 検索して見て下さい。
> サンプルがごろごろしています。
>
> 但し、詳しい状況が解りませんのでまずは、先に提案した方法を試して見て下さい。

いろいろとありがとうございます。

VB2.0のアプリでUSER32.DLLは読めるのでしょうか?
Win95,WinXP両方のOSで実行してみましたら「ファイルが見つかりません」でエラーと
なってしまいます。
申し訳ございませんがご指導、ご指摘ください。

投稿時間:2005/01/24(Mon) 19:07
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: 画面が背面に
> VB2.0のアプリでUSER32.DLLは読めるのでしょうか?
> Win95,WinXP両方のOSで実行してみましたら「ファイルが見つかりません」でエラーと
> なってしまいます。

私には貴方が何を、いつ、どのようにされているのかが見えません。
もう少し順を追って説明願います。特にエラーの原因究明となると1文字書き違えて
いただけでもエラーがおきますので。

又、開発環境等も詳しく書かないとVB2.0となると余計かと思いますよ。

投稿時間:2005/01/25(Tue) 10:16
投稿者名:TERU
URL :
タイトル:
Re^6: 画面が背面に
> > VB2.0のアプリでUSER32.DLLは読めるのでしょうか?
> > Win95,WinXP両方のOSで実行してみましたら「ファイルが見つかりません」でエラーと
> > なってしまいます。
>
> 私には貴方が何を、いつ、どのようにされているのかが見えません。
> もう少し順を追って説明願います。特にエラーの原因究明となると1文字書き違えて
> いただけでもエラーがおきますので。
>
> 又、開発環境等も詳しく書かないとVB2.0となると余計かと思いますよ。

大変申し訳ございません。
以下のとおり私なりの説明をさせていただきます。

<環境>
開発環境:Win95
          VB2.0

<実行環境>
メニュー VB2.0
(FORMにボタンを配置しボタンクリックイベントでSHELLで下位業務アプリケーション起動)
業務アプリケーション VB2.0
稼動OS Win95とWinXP

1.上記の環境でボタンをクリックしたら業務アプリが一旦表示されるものの
 直ぐに、または数秒たつとメニューの背面に隠れてしまう現象が起こる。
2.この掲示板に問合せさせていただきました。
3.くだらない質問をいたしましたが最終的には
 サンプルのSetWindowPosとGetForegroundWindowを業務アプリケーションの
 FORM LOADに記述し実行してみました。

<記述したCode>
Option Explicit
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAft
er As
Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As
Long) As Long
'ウインドウをウインドウリストの一番上に配置する
Const HWND_TOPMOST = (-1)
'ウインドウの現在のサイズを保持する
Const SWP_NOSIZE = &H1&
'ウインドウの現在位置を保持する
Const SWP_NOMOVE = &H2&

Sub Form_Load()
    Dim retValue As Long
    '現在の位置とサイズでウインドウリストの一番上に配置する
    retValue = SetWindowPos(Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

4.[3]のFORM LOADで「ファイルが見つかりません。 53」でエラーとなりました。

説明下手、スキル不足により正しくお伝えできなかったり、
くだらない質問になってしまいますが上記から
USER32がVB2.0では使用できないのかと思い、先の質問をさせていただきました。

大変お恥ずかしいのですがお付き合い頂けるとうれしいです。
まだ不足があればご指摘ください。

投稿時間:2005/01/25(Tue) 12:31
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^7: 画面が背面に
> <環境>
> 開発環境:Win95
>           VB2.0
……10年以上前のVB製品ですか。大変ですね。(^^;

>  サンプルのSetWindowPosとGetForegroundWindowを業務アプリケーションの
>  FORM LOADに記述し実行してみました。
あれは 16bit版向けのサンプルではないので、VB4(32bit版)以降でないと動かないかと。

SetWindowPos APIであれば、標準モジュールの定義は、
Declare Sub SetWindowPos Lib "User" (ByVal hWnd As Integer, ByVal hWndInsertAfter As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer)
となります。上記を、改行させずに 1行で書いてください。

Win32 API用の宣言を、Win16環境にそのまま持ち込んでも、まず、正常には動作しません。
32bit版で"User32" と書かれていた部分が "user" になったり、あるいは、
As Long の宣言が As Integer になっていたりしますし。

投稿時間:2005/01/28(Fri) 13:22
投稿者名:TERU
URL :
タイトル:
Re^8: 画面が背面に
> > <環境>
> > 開発環境:Win95
> >           VB2.0
> ……10年以上前のVB製品ですか。大変ですね。(^^;
>
> >  サンプルのSetWindowPosとGetForegroundWindowを業務アプリケーションの
> >  FORM LOADに記述し実行してみました。
> あれは 16bit版向けのサンプルではないので、VB4(32bit版)以降でないと動かないかと。
>
> SetWindowPos APIであれば、標準モジュールの定義は、
> Declare Sub SetWindowPos Lib "User" (ByVal hWnd As Integer, ByVal hWndInsertAf
ter As
Integer, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer,
ByVal wFlags As Integer)
> となります。上記を、改行させずに 1行で書いてください。
>
> Win32 API用の宣言を、Win16環境にそのまま持ち込んでも、まず、正常には動作しません。
> 32bit版で"User32" と書かれていた部分が "user" になったり、あるいは、
> As Long の宣言が As Integer になっていたりしますし。

[魔界の仮面弁士]さん、[花ちゃん]さん
ありがとうございました。

大変助かりました。
ちょっと時間がかかってしまいましたが、できました。

これに懲りず今後ともよろしくお願いいたします。

投稿時間:2005/01/25(Tue) 12:19
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 画面が背面に
宣言部分を下記のように変更して試して見て下さい。

Private Declare Function SetWindowPos Lib "user" _
  (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, _
  ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, _
  ByVal cy As Integer, ByVal wFlags As Integer) As Integer

Const HWND_TOPMOST = (-1)
'ウインドウの現在のサイズを保持する
Const SWP_NOSIZE = 1
'ウインドウの現在位置を保持する
Const SWP_NOMOVE = 2

Sub Form_Load()
  Dim retValue As Integer
  '現在の位置とサイズでウインドウリストの一番上に配置する
  retValue = SetWindowPos(Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub


投稿時間:2005/01/26(Wed) 15:32
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^2: 画面が背面に
> 宣言部分を下記のように変更して試して見て下さい。

検証のため、VB2とWin3.1をダウンロードしてきて、Virtual PC上に
構築して確認してみましたが、残念ながらエラーになってしまいました。

# VB2は、VB4以降と比べると、文法的な違いが結構あります。
# "Private Declare" も、"行継続文字" もサポートされていません。

せっかくなので、この
》花ちゃん 01/25-12:19 No.1736
で提供されたコードを、VB2向けに書き換えてみました。

下記の「VERSION 2.00」から下の行を、"FORM1.FRM"というファイル名で保存して、
プロジェクトに追加してみてください。


VERSION 2.00
Begin Form Form1
   Caption         =   "Form1"
   Height          =   3855
   Left            =   1035
   LinkTopic       =   "Form1"
   ScaleHeight     =   3450
   ScaleWidth      =   7965
   Top             =   1275
   Width           =   8085
End
Declare Function SetWindowPos Lib "user" (ByVal hWnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer

Const HWND_TOPMOST = (-1)
'ウインドウの現在のサイズを保持する
Const SWP_NOSIZE = 1
'ウインドウの現在位置を保持する
Const SWP_NOMOVE = 2

Sub Form_Load ()
    Dim retValue As Integer
    '現在の位置とサイズでウインドウリストの一番上に配置する
    retValue = SetWindowPos(Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub