0

以下のコードは、ファイル名でアプリケーションを閉じる方法を示しています。そして、ドキュメントを保存せずに閉じます。メモ帳でファイル名を指定すると、直接閉じず、保存するかどうかを尋ねられます。ドキュメントを直接保存してアプリケーションを閉じたい。

コードを修正するためのアイデアはありますか?

Const WM_Close As UInteger = &H10
    Const WM_KEYDOWN = &H100
    Const WM_COMMAND = &H112

Private Sub searchnclosedoc(ByVal noextfilename As String, ByVal ms_appname As String)
    For Each wproc As Process In Process.GetProcessesByName(ms_appname)
        If wproc.MainWindowTitle.Contains(noextfilename) Then
            If PostMessage(wproc.MainWindowHandle, WM_Close, WM_KEYDOWN, Keys.Enter) Then
                'MessageBox.Show("not closed, dialog asked")
                'PostMessage(wproc.MainWindowHandle, WM_KEYDOWN, WM_COMMAND, Keys.Enter)
                MyThreadedControl(lbltest, "Text", noextfilename & " was SAVED and CLOSED to Prevent Conflict")
            Else
                MyThreadedControl(lbltest, "Text", noextfilename & " was CLOSED to Prevent Conflict")
            End If
        End If
    Next
    End Sub

これにより、保存するかどうかを確認せずに msword が閉じます。これは、閉じた後にドキュメントを保存しません。しかし、閉じる前にドキュメントを保存したいのです。メモ帳では、保存するかどうかを尋ねるダイアログ ボックスが表示されます。アプリケーションを閉じて、ダイアログ ボックスを表示せずに編集したドキュメントを直接保存したい。

    PostMessage(wproc.MainWindowHandle, WM_Close, WM_KEYDOWN, Keys.Enter)

これが私が手順を使用した方法です。

           searchnclosedoc(dfilenamewithoutextension, "MSWORD")
           searchnclosedoc(dfilenamewithoutextension, "notepad")

私もこれを試しました、

Private Sub searchnclosedoc(ByVal noextfilename As String, ByVal ms_appname As String)
    For Each wproc As Process In Process.GetProcessesByName(ms_appname)
        If wproc.MainWindowTitle.Contains(noextfilename) Then
            If PostMessage(wproc.MainWindowHandle, WM_Close, 0, 0) Then
                'MessageBox.Show("not closed, dialog asked")

                Dim h, h2, h3, h4 As IntPtr
                If ms_appname = "notepad" Then
                    h = FindWindowA(h, "Notepad")
                ElseIf ms_appname = "Foxit Reader" Then
                    h = FindWindowA(h, "Foxit Reader")
                Else
                    h = FindWindowA(h, ms_appname)
                End If

                If h = 0 Then Exit Sub

                If ms_appname = "notepad" Then
                    h2 = FindWindowEx(h, IntPtr.Zero, "Button", "&Yes")
                ElseIf ms_appname = "Foxit Reader" Then
                    h2 = FindWindowEx(h, IntPtr.Zero, "Button", "&No")
                Else
                    h3 = FindWindowEx(h, IntPtr.Zero, "Button", "&Save")
                End If

                If h2 <> 0 Then h4 = h2 Else h4 = h3
                If h4 <> 0 Then
                    PostMessage(h4, &HF5, 0, 0)
                End If

                MyThreadedControl(lbltest, "Text", noextfilename & " was SAVED and CLOSED to Prevent Conflict")
            Else
                MyThreadedControl(lbltest, "Text", noextfilename & " was CLOSED to Prevent Conflict")
            End If
        End If
    Next
End Sub

メモ帳がうまくいかない、保存する、ダイアログボックスで尋ねられることもある、Foxit ReaderはOK、NOの場合は保存しない、msWORDは保存せず、閉じたいものを直接閉じる、保存した、閉じた.

このコードで解決しました:(コードを変更します)以下。

Private Sub searchnclosedoc(ByVal noextfilename As String, ByVal ms_appname As String)
    For Each wproc As Process In Process.GetProcessesByName(ms_appname)
        If wproc.MainWindowTitle.Contains(noextfilename) Then
            SetForegroundWindow(wproc.MainWindowHandle)
            SendKeys.SendWait("^(s)")
            Thread.Sleep(100)
            SendKeys.SendWait("%{F4}")
            Thread.Sleep(100)
            SendKeys.SendWait("{ENTER}")
            MyThreadedControl(lbltest, "Text", noextfilename & " was SAVED and CLOSED to Prevent Conflict")
        End If
    Next
End Sub

このコードをしばらく使用すると、正常に動作します。

Private wordApp as New Word.Application
Private Sub searchnclosedoc(ByVal noextfilename As String, ByVal ms_appname As String)
    For Each wproc As Process In Process.GetProcessesByName(ms_appname)

        If ms_appname.Contains("WINWORD") Then
            If wproc.MainWindowTitle.Contains(noextfilename) Then
                wordapp = DirectCast(GetObject(, "Word.Application"), Word.Application)
                AddHandler wordapp.DocumentBeforeClose, AddressOf WordClose
                PostMessage(wproc.MainWindowHandle, WM_Close, 0, 0)
                MyThreadedControl(lbltest, "Text", noextfilename & " was SAVED and CLOSED to Prevent Conflict")
            End If
        End If

    Next
End Sub

ありがとう

4

1 に答える 1

1

WM_Close を送信する前に Ctrl-S を送信してみましたか?

于 2013-06-06T12:40:09.643 に答える