5

Visual C#2010-Windowsフォームアプリケーションで外部プロセスを開始しようとしています。目標は、プロセスを非表示のウィンドウとして開始し、後でウィンドウを再表示することです。

進捗状況を更新しました:

//Initialization
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool EnableWindow(IntPtr hwnd, bool enable);
[DllImport("user32.dll")]
private static extern bool MoveWindow(IntPtr handle, int x, int y, int width, 
int height, bool redraw);

SW_SHOW = 5;

以下は私の主な機能に配置されました:

ProcessStartInfo info = new ProcessStartInfo("process.exe");
info.WindowStyle = ProcessWindowStyle.Hidden;
Process p = Process.Start(info);

p.WaitForInputIdle();
IntPtr HWND = p.MainWindowHandle;

System.Threading.Thread.Sleep(1000);    

ShowWindow(HWND, SW_SHOW);
EnableWindow(HWND, true);
MoveWindow(HWND, 0, 0, 640, 480, true);

ただし、ウィンドウは「非表示」として開始されたため、p.MainWindowHandle = 0。ウィンドウを正常に表示できません。私も試しHWND = p.Handleましたが成功しませんでした。

ウィンドウに新しいハンドルを提供する方法はありますか?これで問題が解決する可能性があります。

参照:

MSDN ShowWindow

MSDNフォーラム

.dllをインポートする方法

4

3 に答える 3

11

最後に、プロセスは正常に動作しています。あなたのすべての助けのおかげで、私はこの修正を思いついた。

p.MainWindowHandleは0だったので、user32 FindWindow()関数を使用してウィンドウハンドルを取得する必要がありました。

//Initialization
int SW_SHOW = 5;

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

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);

[DllImport("user32.dll")]
private static extern bool EnableWindow(IntPtr hwnd, bool enabled);

そして私の主な機能では:

ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "notepad";
info.UseShellExecute = true;
info.WindowStyle = ProcessWindowStyle.Hidden;

Process p = Process.Start(info);
p.WaitForInputIdle();
IntPtr HWND = FindWindow(null, "Untitled - Notepad");

System.Threading.Thread.Sleep(1000);

ShowWindow(HWND, SW_SHOW);
EnableWindow(HWND, true);

参照:

pinvoke.net:FindWindow()

編集:dllImport宣言からWindowShowStyleを削除しました:代わりにこれをintとして定義できます。この記事で概説されている定数を定義するために、WindowShowStyleという列挙型を定義しました。定数またはハードコーディングされた値を使用する代わりに、列挙型を定義する方がコーディングパターンにぴったりです。

于 2012-05-01T15:44:54.017 に答える
2

ウィンドウを再表示するためのサンプルコード:

int hWnd;
Process[] processRunning = Process.GetProcesses();
foreach (Process pr in processRunning)
{
    if (pr.ProcessName == "notepad")
    {
        hWnd = pr.MainWindowHandle.ToInt32();
        ShowWindow(hWnd, SW_HIDE);
    }
}
于 2012-04-30T17:31:21.780 に答える
1

使用するドキュメントの詳細もfalse ProcessWindowStyle.Hiddenに設定する必要があります。http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle.aspxProcessStartInfo.UseShellExecute

後で再表示するには、ウィンドウハンドルをどういうわけか知っている必要があります。

于 2012-04-30T17:15:29.753 に答える