MoveWindowでウィンドウを操作できない問題について

このQ&Aのポイント
  • vb2008でウィンドウを管理するアプリケーションを製作していますが、MoveWindowを使用しても希望した結果になりません。
  • Form2のウィンドウが画面いっぱいに表示されない問題が発生しています。
  • Form2のFormBorderStyleはNoneで、最大化もされていませんが、MoveWindowコードの実行によって表示が変わりません。
回答を見る
  • ベストアンサー

MoveWindow

現在、vb2008でウィンドウを管理するアプリケーションを製作しております。 本来ならほかのアプリケーションのウィンドウを操作しなければいけないわけですが、テストのために下のようなコードを実行しても希望した結果(Form2が画面いっぱいに表示される)になりません。 なお、Form2 FormBorderStyle はNoneで、最大化はされていません。 Public Declare Function MoveWindow Lib "user32" (ByVal hWnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long Sub Test() Dim NewWin as New Form2 NewWin.Show() Dim Ptr As System.IntPtr = NewWin.Handle Dim Ret As Long = MoveWindow(Ptr.ToInt64d, 0, 0, _ Screen.PrimaryScreen.WorkingArea.Width, _ Screen.PrimaryScreen.WorkingArea.Height, 1) End Sub

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

MoveWindowの宣言で、引数と戻り値は32bitの整数型ですので、LongではなくInteger又はInt32で指定してください。 ※VB6.0やVBAは Long=32bit / Integer=16bit であるため、VB6/VBAのサンプルコードあるいはVB6のAPIビューアからコピーした場合は手作業で書き換える必要があります。

talosoft
質問者

お礼

ご回答ありがとうございます。 オーバーフローが心配で、Integer型でなくLong型を使っていた次第です。 プログラム中に使われた関連するLongをInteegrに直しましたが改善されませんでした。

関連するQ&A

  • Access ウィンドウサイズの変更

    Access2000を使っています。 Accessを指定サイズで開く様にしたのですが、閉じる時に元のサイズに戻せないでしょうか。(次回別のAccessを開いた時に変更したサイズで開いてしまい困っています) 初心者の為、記述内容と記述する場所を教えて頂けると助かります。 開くときは下記の記述をしています。 Declarationsへ Declare Function MoveWindow Lib "user32" _ (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, _ ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long プロシージャへ Dim lngRet As Long lngRet = MoveWindow(Application.hWndAccessApp, 0, 0, 800, 600, True)

  • コマンドボタンにEXEファイルのアイコンを表示

    コマンドボタンにEXEファイルのアイコンの表示に ついてWebで色々と調べてやってみたのですが、 どうも上手くいきません・・・。(^^; 下記の条件・コードでやってみました。 原因等わかる方いましたら、どうか宜しくお願いします。 ---環境--- OS:Windows2000 Pro VB:VB6 Pro SP6 ---ソースコード(標準モジュール)--- Public Declare Function DrawIconEx Lib "USER32" (ByVal hDC&, ByVal xLeft&, _ ByVal yTop&, ByVal hIcon&, ByVal cxWidth&, ByVal cyWidth&, ByVal istepIfAniCur&, _ ByVal hbrFlickerFreeDraw&, ByVal diFlags&) As Long Public Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" _ (ByVal lpszFile As String, ByVal nIconIndex As Long, phiconLarge As Long, _ phiconSmall As Long, ByVal nIcons As Long) As Long Public Const DI_NORMAL = &H3 ---ソースコード(フォームモジュール)--- Private Sub Command1_Click() Dim Ret As Long Dim nFile As String Dim L As Long Dim S As Long nFile = "C:\Windows\calc.exe" Ret = ExtractIconEx(nFile, 0, L, S, 1) DrawIconEx Form1.Picture1.hDC, 0, 0, L, 0, 0, vbNull, 0, DI_NORMAL Set Form1.Command1.Picture = Form1.Picture1.Image End Sub

  • VB BitBlt他でのエラー

    ネットを見ながらVisual Basicを触り始めたのですが、下記のようなコードを実行すると「スタックを不安定にしています」といった感じのエラーが出てしまいます。 多分基本的な見落としだとは思うのですが、調べても上手い解決策が見つからず、質問させて頂いた次第です。  どうか、皆様のお知恵をお貸しください。 ・環境 Windows7 64bit - Microsoft Visual studio2017 - Visual Basic - Windowsデスクトップ - Windowsフォームアプリケーション ・やりたい事 別ソフトのウィンドウのタイトル、座標、画像を取得したい。 ・エラー 下記コードを開始(上の緑の三角)して実行すると、(1)のGetForegroundWindowは問題ないのですが、(2)のGetClientRect、(3)のGetWindowText、(4)のBitBltの部分を実行する際に、次のようなエラーが出てしまいます(3か所とも、関数名以外は同じエラーです)。 マネージド デバッグ アシスタント 'PInvokeStackImbalance' Message=マネージド デバッグ アシスタント 'PInvokeStackImbalance' : 'PInvoke 関数 'WindowsApp1!WindowsApp1.Form1::BitBlt' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメーターがターゲットのアンマネージ シグネチャに一致していることを確認してください。' ・コード Imports OpenCvSharp Public Class Form1 Declare Function GetForegroundWindow Lib "user32" () As Long Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As Rect) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long Public Const SRCCOPY = &HCC0020 'S Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click System.Threading.Thread.Sleep(1000) '指定ミリ秒待機する Dim hWnd As IntPtr = GetForegroundWindow() '(1)選択ウィンドウのハンドルを取得 'Dim winRect As New Rect 'GetClientRect(hWnd, winRect) '(2)ウィンドウ座標取得 Dim Title As String = Space(255) Dim ret As Long = GetWindowText(hWnd, Title, Len(Title)) '(3)ウィンドウのタイトルを取得 Title = Microsoft.VisualBasic.Left(ret, InStr(ret, vbNullChar) - 1) Dim img As IntPtr BitBlt(img, 0, 0, 100, 100, hWnd, 0, 0, SRCCOPY) '(4)ウィンドウの画像を取得 End Sub End Class

  • VB2010で、2つめのフォームを表示させると、フォームを閉じるまで1

    VB2010で、2つめのフォームを表示させると、フォームを閉じるまで1つめのフォームの操作ができないのですが、どなたか解決方法を御存じないでしょうか。 よろしくお願いします。 Form1のピクチャーボックスに描いた折れ線グラフ上のカーソル(Form11)が、 マウスの動きに合わせてグラフ線上をたどっていくようにしようとしています。 【Form1のボタンを押すと2つめのフォームを呼び出す】 Dim Mark As New Form11 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 'グラフカーソル表示 Mark.Show() 【呼び出されたフォームのコード】 Imports System.Drawing Public Class Form11 Private Sub Form2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 'フォームのクライアント領域のサイズを設定 Me.ClientSize = New System.Drawing.Size(20, 20) 'カーソルを描く Dim MarkPen As New Pen(Color.Red, 1) Dim g As Graphics = e.Graphics g.DrawEllipse(MarkPen, 0, 0, 20, 20) '円の描画 Me.TopMost = True '最全面 Me.TransparencyKey = Me.BackColor '透明色の設定 Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None '枠なし End Sub End Class

  • VB初心者です。コードの書き方が分かりません。

    VB初心者です。 VBで(zのn乗)-(xのn乗+yのn乗)の計算が出来るようにしたいのですが、答えが必ず-1になってしまいます。 Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) End Sub End Class 正しいコードの書き方を教えて下さい。 また特定の答えのときにメッセージを表示したいのですが、どうすればいいですか?

  • VB 2008: 文字サイズの指定要領が判りません!

    指定秒だけメッセージを表示する関数を作成しています。 しかし、文字サイズの設定要領が判りません。 VB.NET 学習40日余という初学者です。 宜しくお願いします。   Sub PauseMsg2(ByVal Msg As String, ByVal PauseTime As Double, ByVal aColor As Color, ByVal iFontSize AS Integer)     Dim frm As New Form     Dim lbl As New Label()     With lbl       .Text = Msg       .BorderStyle = BorderStyle.None       .Location = New Point(10, 10)       .ForeColor = aColor       .Size = XXXXX       .Width = 478     End With     With frm       .HelpButton = False       .FormBorderStyle = FormBorderStyle.FixedDialog       .ControlBox = False       .MaximizeBox = False       .MinimizeBox = False       .Text = ""       .Width = 500       .Height = 20       .StartPosition = FormStartPosition.CenterScreen       .Controls.Add(lbl)       .Show()       Pause(PauseTime)       .Close()     End With   End Sub   ' ------------   ' ポーズ関数   ' ------------   Sub Pause(ByVal PauseTime As Double)     Dim Finish As Double = DateAndTime.Timer + PauseTime     Do       DoEvents()     Loop Until DateAndTime.Timer > Finish   End Sub

  • Formを動かせるようにしたい

    お世話になります。 OS XP PRO  VB6(SP5)で開発しています。 ディスプレイのサイズによりFormを動かせたり固定させたりしたいのですが、 規定値は固定にしたいのでFormプロパティのMoveableはFalseにしてあります。 下記のようにプログラミングしたのですが固定されたままです。 Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long Private Declare Function GetSystemMenu Lib "user32" (ByVal _ hwnd As Long _ , ByVal bRevert As Long) As Long Private Declare Function RemoveMenu Lib "user32" ( _ ByVal hMenu As Long, ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Private Declare Function DrawMenuBar Lib "user32" ( _ ByVal hwnd As Long) As Long Private Const MF_BYCOMMAND = &H0 Private Const SC_MOVE = &HF010 Private Sub Form_Load() Dim kk As Long kk = GetSystemMenu(.hwnd, bb) Call RemoveMenu(kk, SC_MOVE, MF_BYCOMMAND) Call DrawMenuBar(.hwnd) End Sub アドバイス頂きたくよろしくお願いします。 以上です。

  • Visual Basic.NETのエラー("オブジェクト参照がオブジェクト インスタンスに設定されていません。")について

    DLLを読み込むプログラムで、以下のように宣言した関数"VCread_wave_file"を呼び出そうとすると、 "オブジェクト参照がオブジェクト インスタンスに設定されていません。" というエラーが出てしまうのですが、なぜなのでしょうか? プログラムは以下のようになっています。 Public Class Form1 Inherits System.Windows.Forms.Form Dim status As Integer Dim wavelength As Long Dim samplf As Double Private Declare Function VCread_wave_file Lib "Vcon.dll" (ByVal FileName As String, ByVal tmpFilename As String, ByVal wavelength As Long, ByVal samplingFrequency As Double) As Integer (中略) Private Sub ChangeStartButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChangeStartButton.Click status = VCread_wave_file("rectmp.wav", "rectmp.raw", wavelength, samplf) Label4.Text = status End Sub よろしくお願いいたします。

  • 「コンパイルエラー End Subが必要です。」

    Access2016でファイルを作成しているのですが、下記のVBAを実行しようとすると、「コンパイルエラー End Subが必要です。」とエラーメッセージが返ってきてしまいます。 構文の修正が必要であるとお気づきであれば、その箇所を教えていただけないでしょうか。初歩的な質問で恥ずかしい限りですが、何卒よろしくお願い致します。 Option Compare Database Option Explicit Public Declare PtrSafe Function SetWindowPos Lib "user32" _ (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _ ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, _ ByVal fuFlags As Long) As Long Public Declare PtrSafe Function GetSystemMenu Lib "user32" _ (ByVal hWnd As Long, ByVal fRever As Long) As Long Public Declare PtrSafe Function RemoveMenu Lib "user32" _ (ByVal hMenu As Long, ByVal uItem As Long, ByVal fuFlags As Long) As Long Public Const SWP_NOMOVE = &H2 Public Const SWP_NOSIZE = &H1 Public Const HWND_TOP = &H0 Public Const SC_SIZE = &HF000 Public Const SC_MAXIMIZE = &HF030 Public Const SC_CLOSE = &HF060 Public Const SC_RESTORE = &HF120 Public Const MF_BYCOMMAND = &H0& Public Sub test() Private Sub Form_Open(Cancel As Integer) Dim hWnd As Long hWnd = Application.hWndAccessApp SetWindowPos hWnd, HWND_TOP, 0, 0, 800, 600, SWP_NOMOVE hWnd = GetSystemMenu(hWnd, 0) RemoveMenu hWnd, SC_SIZE, MF_BYCOMMAND End Sub

  • VBA MCSC_MONTHBKの色が反映しない

    VBAのUserForm1にCreateWindowExWでカレンダーを追加し、MCSC_MONTHBKの背景色を変えたくSendMessageW hChild, MCM_SETCOLOR, MCSC_MONTHBK, &HFFFF00とコーディングしましたが反映されません、どこが悪いのでしょうか?ご教授頂ければ幸いです。 ちなみに、MCSC_BACKGROUNDの方は色が反映されました。 Windows10Pro 64、Excel2016 32ビットになります 何卒、よろしくお願いします。 UserForm1コード Option Explicit Private Declare Function InitCommonControlsEx& Lib "comctl32" _ (ByVal lpInitCtrl&) Private Declare Function CreateWindowExW& Lib "user32" _ (ByVal dwExStyle&, _ ByVal lpClassName&, _ ByVal lpWindowName&, _ ByVal dwStyle&, _ ByVal x&, ByVal y&, _ ByVal nWidth&, ByVal nHeight&, _ ByVal hParent&, _ ByVal hMenu&, _ ByVal hInstance&, _ ByVal lParam&) Private Declare Function SendMessageW& Lib "user32" _ (ByVal hwnd&, _ ByVal uMsg&, _ ByVal wParam&, _ ByVal lParam&) Private Declare Function MoveWindow& Lib "user32" _ (ByVal hwnd&, _ ByVal x&, ByVal y&, _ ByVal nWidth&, ByVal nHeight&, _ ByVal bRepaint&) Private Const ICC_DATE_CLASSES = &H100& Private Const WM_SETFONT = &H30 Private Const WS_CHILD = &H40000000 Private Const WS_VISIBLE = &H10000000 Private Const MCS_DAYSTATE = 1 Private Const MCM_SETCOLOR = &H100A Private Const MCM_GETMINREQRECT = &H1009 Private Const MCM_GETMAXTODAYWIDTH = &H1015 Private Const WS_CLIPSIBLINGS = &H4000000 Private Const WS_EX_WINDOWEDGE = &H100& Private Const DTM_SETMCCOLOR = &H1006 Private Const MCSC_BACKGROUND = 0 ' 月間背景色を指定 Private Const MCSC_TEXT = 1 ' 選択日付の色 Private Const MCSC_TITLEBK = 2 ' タイトルバーの背景色 Private Const MCSC_TITLETEXT = 3 ' タイトルバーのテキスト色 Private Const MCSC_MONTHBK = 4 ' カレンダーの背景色 Private Const MCSC_TRAILINGTEXT = 5 Private Sub UserForm_Initialize() Dim ii&(1) Dim wd&, ro#, rc&(3) Dim fnt As stdole.IFont Dim i&, buf&(3) Dim hParent As Long Dim hChild As Long Dim fr As IOptionFrame Dim m_hr As MSForms.IControl Dim acc As IAccessible Set fr = Controls.Add("Forms.Frame.1") Set m_hr = fr hParent = m_hr.[_GethWnd] Set acc = fr Set fnt = fr.Font acc.accLocation 0, 0, wd, 0 ro = fr.Width / wd ii(0) = 8 ii(1) = ICC_DATE_CLASSES InitCommonControlsEx (VarPtr(ii(0))) hChild = CreateWindowExW(WS_EX_WINDOWEDGE, _ StrPtr("SysMonthCal32"), 0, _ WS_CHILD Or WS_VISIBLE Or WS_CLIPSIBLINGS Or MCS_DAYSTATE, _ 0, 0, 0, 0, _ hParent, 0, 0, 0) SendMessageW hChild, MCM_SETCOLOR, MCSC_BACKGROUND, &HFFFF00 SendMessageW hChild, MCM_SETCOLOR, MCSC_MONTHBK, &HFFFF00 SendMessageW hChild, MCM_GETMINREQRECT, 0, VarPtr(rc(0)) i = SendMessageW(hChild, MCM_GETMAXTODAYWIDTH, 0, 0) MoveWindow hChild, 0, 0, i + 100, rc(3), 0 With fr .Width = (i + 100) * ro .Height = rc(3) * ro End With End Sub

専門家に質問してみよう