C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ファイルを開くときの大きさを指定したい


(過去ログ 147 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■86108 / inTopicNo.1)  ファイルを開くときの大きさを指定したい
  
□投稿者/ まなみ (1回)-(2017/12/18(Mon) 20:43:21)

分類:[VB.NET/VB2005 以降] 

VB.NET ボタンをクリックしてからフォトViewerでpngファイルを開く際に、
ファイルを開くときの大きさを指定して開きたい

\\サーバ名\共有\共有1にある写真1.png ファイルを
フォトViewerで開きたいと思っています

Private Declare Function MoveWindow Lib "user32" Alias "MoveWindow" _
(ByVal hwnd As IntPtr, ByVal x As Integer, ByVal y As Integer, _
ByVal nWidth As Integer, ByVal nHeight As Integer, _
ByVal bRepaint As Integer) As Integer

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start("\\サーバ名\共有\共有1\写真.png")
'ウィンドウの位置指定
MoveWindow(p.MainWindowHandle, 0, 10, 300, 200, 1)

End Sub

上記で実行するとpngファイルは開きますが、nullreferenceexceptionは、ハンドルされませんでしたと
表示されてしまいます

MoveWindow(p.MainWindowHandle, 0, 10, 300, 200, 1)のコードがなければ、
pngファイルを開く事は可能ですが、ファイルを開くときの大きさの指定ができません

pngファイルを開くときの大きさを指定して開くにはどのようにしたらよいでしょうか?

ご教示ください
引用返信 編集キー/
■86112 / inTopicNo.2)  Re[1]: ファイルを開くときの大きさを指定したい
□投稿者/ Jitta (348回)-(2017/12/19(Tue) 08:41:37)
No86108 (まなみ さん) に返信
> VB.NET ボタンをクリックしてからフォトViewerでpngファイルを開く際に、
> ファイルを開くときの大きさを指定して開きたい

ファイルの大きさかと思った。
ファイルを開くときに、開くために使ったアプリケーション ウィンドウの大きさ、ね。


>
> \\サーバ名\共有\共有1にある写真1.png ファイルを
> フォトViewerで開きたいと思っています
>
> Private Declare Function MoveWindow Lib "user32" Alias "MoveWindow" _
> (ByVal hwnd As IntPtr, ByVal x As Integer, ByVal y As Integer, _
> ByVal nWidth As Integer, ByVal nHeight As Integer, _
> ByVal bRepaint As Integer) As Integer
>
> Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
>
> Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start("\\サーバ名\共有\共有1\写真.png")
> 'ウィンドウの位置指定
> MoveWindow(p.MainWindowHandle, 0, 10, 300, 200, 1)
>
> End Sub
>
> 上記で実行するとpngファイルは開きますが、nullreferenceexceptionは、ハンドルされませんでしたと
> 表示されてしまいます
>
> MoveWindow(p.MainWindowHandle, 0, 10, 300, 200, 1)のコードがなければ、
> pngファイルを開く事は可能ですが、ファイルを開くときの大きさの指定ができません
>
> pngファイルを開くときの大きさを指定して開くにはどのようにしたらよいでしょうか?
>
> ご教示ください


pは、何を指していますか。
このコードを書いた意図は「フォトビューアー」だと思いますが、違うものだと思います。
ビューアーとその引数という形で起動するか、
起動したものを探すことになるでしょう。
引用返信 編集キー/
■86113 / inTopicNo.3)  Re[2]: ファイルを開くときの大きさを指定したい
□投稿者/ まなみ (2回)-(2017/12/19(Tue) 09:00:56)
Jitta さん)

ありがとうございます

アプリケーションウインドウの大きさでした
失礼しました

フォトビューアのウインドウの大きさを指定する方法や
参考になるURL等をご教示くださいませんか?

1週間以上悩んでおり、解決に導けそうにないです
引用返信 編集キー/
■86114 / inTopicNo.4)  Re[1]: ファイルを開くときの大きさを指定したい
□投稿者/ 魔界の仮面弁士 (1514回)-(2017/12/19(Tue) 09:52:12)
2017/12/19(Tue) 09:53:05 編集(投稿者)

No86108 (まなみ さん) に返信
> VB.NET ボタンをクリックしてからフォトViewerでpngファイルを開く際に、
> ファイルを開くときの大きさを指定して開きたい
Windows フォトビューワー限定の方法を探している、ということでしょうか。
(Windows フォトビューワーは、Windows 10 で廃止されています)
https://support.microsoft.com/ja-jp/help/4027135/windows-10-photo-viewer


> Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start("\\サーバ名\共有\共有1\写真.png")
> 'ウィンドウの位置指定
> MoveWindow(p.MainWindowHandle, 0, 10, 300, 200, 1)
関連付け起動の場合、起動するのがフォトビューワーであるとは限りません。

また、Process.Start(String) の場合に Nothing が返される理由については、下記で述べられています。
https://dobon.net/vb/dotnet/process/shell.html
http://bbs.wankuma.com/index.cgi?mode=al2&namber=67866&KLOG=115



> MoveWindow(p.MainWindowHandle, 0, 10, 300, 200, 1)のコードがなければ、
> pngファイルを開く事は可能ですが、ファイルを開くときの大きさの指定ができません

起動後に HWND から辿ってサイズを変更するのではなく、起動前に
 HKEY_CURRENT_USER\Software\Microsoft\Windows Photo Viewer\Viewer\MainWndPos
をセットしておくというのはどうでしょう。サイズを変えながら連続起動するなどの用途には向きませんが。


やはり HWND を得たい、ということであれば、たとえば

Dim args As String
'案1
args = """C:\Program Files (x86)\Windows Photo Viewer\PhotoViewer.dll"",ImageView_Fullscreen "
'
'案2
'args = "C:\WINDOWS\System32\shimgvw.dll,ImageView_Fullscreen "
'
args &= "\\サーバ名\共有\共有1\写真.png"

Dim psi As New ProcessStartInfo("rundll32.exe", args)
Dim p As Process = Process.Start(psi)
MsgBox("起動待ち")
Dim hwnd As IntPtr = p.MainWindowHandle

こんな感じで渡すという手はあります。

ただし起動して間もないうちは、p.MainWindowHandle が
IntPtr.Zero を返してくる可能性がありますので、
待ち合わせをどのように実装するのかが悩みどころです。
(p.WaitForInputIdle でも待ち合わせできないようで)
引用返信 編集キー/
■86140 / inTopicNo.5)  Re[2]: ファイルを開くときの大きさを指定したい
□投稿者/ まなみ (3回)-(2017/12/21(Thu) 09:35:52)
魔界の仮面弁士さん

ありがとうございます
返信が遅れてすみません

やはりアプリケーション ウィンドウの大きさを指定する事は出来ないのでしょうか?
引用返信 編集キー/
■86141 / inTopicNo.6)  Re[3]: ファイルを開くときの大きさを指定したい
□投稿者/ 魔界の仮面弁士 (1521回)-(2017/12/21(Thu) 12:35:52)
No86140 (まなみ さん) に返信
> アプリケーション ウィンドウの大きさを指定する事は出来ないのでしょうか?

「前回のウィンドウ終了位置」をどこで管理しているのかが特定できれば、
No86114 の方法でいけるかな…と仮説を立てては見たのですが、今のところ、
下記のコードでも期待動作までは持ち込めていません。


Public Sub RunPhotoViwer(imageFile As FileInfo, rect As Rectangle, ByVal maxmized As Boolean, Optional ByVal backgroundColor As Color = Nothing)
  Dim bin As Byte() = _
    BitConverter.GetBytes(rect.Left).Concat( _
    BitConverter.GetBytes(rect.Right)).Concat( _
    BitConverter.GetBytes(rect.Top)).Concat( _
    BitConverter.GetBytes(rect.Bottom)).Concat( _
    New Byte() {If(maxmized, 1, 0), 0, 0, 0}).ToArray()
  Debug.WriteLine(BitConverter.ToString(bin))

  Const keyViewer As String = "Software\Microsoft\Windows Photo Viewer\Viewer"
  Microsoft.Win32.Registry.SetValue("HKEY_CURRENT_USER\" & keyViewer, "MainWndPos", bin)
  If backgroundColor = Color.Empty Then
    Dim key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(keyViewer, True)
    If key IsNot Nothing AndAlso key.GetValue("BackgroundColor", Nothing) IsNot Nothing Then
      key.DeleteValue("BackgroundColor")
      key.Close()
    End If
  Else
    Dim c As Integer = Color.FromArgb(&HFF, backgroundColor).ToArgb()
    Microsoft.Win32.Registry.SetValue("HKEY_CURRENT_USER\" & keyViewer, "BackgroundColor", c)
  End If

  Const dllPathWithQuote As String = """C:\Program Files (x86)\Windows Photo Viewer\PhotoViewer.dll"""
  Dim filePathWithoutQuote As String = imageFile.FullName
  Process.Start("rundll32.exe", dllPathWithQuote & ",ImageView_Fullscreen " & filePathWithoutQuote)
End Sub
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -