9

これが私の問題です。私たちの製品には自動化されたビルド プロセスがあります。VB6 プロジェクトの 1 つのコンパイル中にメッセージ ボックスが吐き出され、次に進む前にユーザーが [OK] をクリックする必要があります。自動化されたプロセスであるため、これは悪いことです。メッセージ ボックスを非表示にするために VB6 コードを調べましたが、今のところその方法を理解できる人はいないようです。そのため、一時的な修正として、バックグラウンドで実行され、メッセージ ボックスがポップアップしたときに閉じるプログラムに取り組んでいます。これまでのところ、メッセージがいつポップアップするかを検出できますが、メッセージを適切に閉じる機能が見つからないようです。プログラムは C# で記述されており、user32.dll の FindWindow 関数を使用してウィンドウへのポインターを取得しています。これまで私は' closeWindow、endDialog、および postMessage を試して閉じようとしましたが、どれも機能していないようです。closeWindow はそれを最小化するだけで、 endDialog は不良メモリ例外を引き起こし、 postMessage は何もしません。これを処理する他の関数、またはこのメッセージを取り除く他の方法を知っている人はいますか? 前もって感謝します。

ここに私が現在持っているコードがあります:

class Program
{
     [DllImport("user32.dll", SetLastError = true)]
     private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

     static void Main(string[] args)
     {
         IntPtr window = FindWindow(null, "Location Browser Error");
         while(window != IntPtr.Zero)
         {
             Console.WriteLine("Window found, closing...");

             //use some function to close the window    

             window = IntPtr.Zero;                  
         }    
    }
} 
4

2 に答える 2

12

ウィンドウを見つける必要があります。これが最初のステップです。SC_CLOSEを使用してメッセージを送信した後SendMessage

サンプル

[DllImport("user32.dll")]
Public static extern int SendMessage(int hWnd,uint Msg,int wParam,int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_CLOSE = 0xF060;

IntPtr window = FindWindow(null, "Location Browser Error");
if (window != IntPtr.Zero)
{
   Console.WriteLine("Window found, closing...");

   SendMessage((int) window, WM_SYSCOMMAND, SC_CLOSE, 0);  
}

詳しくは

于 2012-07-30T20:52:04.500 に答える
1

メッセージボックスを見つけたらWM_NOTIFYBN_CLICKEDタイプとOKボタンのIDで送信してみてください。

于 2012-07-30T20:51:38.717 に答える