CをC#に移植したときに問題が発生しました
- 題名: CをC#に移植したときに問題が発生しました
- 著者: meruru
- 日時: 2011/08/18 13:29:28
- ID: 28908
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: CをC#に移植したときに問題が発生しました
- 著者: Azulean
- 日時: 2011/08/18 23:00:27
- ID: 28911
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: CをC#に移植したときに問題が発生しました
- 著者: meruru
- 日時: 2011/08/19 17:29:49
- ID: 28914
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: CをC#に移植したときに問題が発生しました
- 著者: meruru
- 日時: 2011/08/19 21:32:41
- ID: 28915
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: CをC#に移植したときに問題が発生しました
- 著者: Azulean
- 日時: 2011/08/19 23:24:36
- ID: 28917
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: CをC#に移植したときに問題が発生しました
- 著者: meruru
- 日時: 2011/08/21 13:55:50
- ID: 28919
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
こちらのサイトをC#に移植したのですが
http://katahiromz.web.fc2.com/win32/desktop.html
新しいデスクトップの作成はできたのですがメッセージボックス(MessageBox.Showの方)をしたところ元のデスクトップのほうに表示されてしまい、元のデスクトップに戻れなくなってしまいました
このソースの中にはスレッドを新しいデスクトップに移すメソッドがあったと思うのですが、どうしてうまくいかなかったのでしょうか。
API郡はdllにしているのでプログラムの中にはDllImportはしていません
[dll : user32クラス]
http://msdn.microsoft.com/ja-jp/library/cc364750.aspx
[DllImport("user32.dll")]
public static extern IntPtr GetThreadDesktop(uint dwThreadId);
http://msdn.microsoft.com/ja-jp/library/cc410938.aspx
[DllImport("user32.dll")]
public static extern IntPtr OpenInputDesktop(uint dwFlags, bool fInherit, DESKTOP dwDesiredAccess);
http://msdn.microsoft.com/ja-jp/library/cc410718.aspx
[DllImport("user32.dll", EntryPoint = "CreateDesktopW", CharSet = CharSet.Unicode, SetLastError = true, PreserveSig = true)]
public static extern IntPtr CreateDesktop(string lpszDesktop, IntPtr lpszDevice, IntPtr pDevmode, int dwFlags, DESKTOP dwDesiredAccess, ref SECURITY_ATTRIBUTES lpsa);
http://msdn.microsoft.com/ja-jp/library/cc411078.aspx
[DllImport("user32.dll")]
public static extern Boolean SetThreadDesktop(IntPtr hDesktop);
http://msdn.microsoft.com/ja-jp/library/cc411215.aspx
[DllImport("user32.dll")]
public static extern Boolean SwitchDesktop(IntPtr hDesktop);
http://msdn.microsoft.com/ja-jp/library/cc410665.aspx
[DllImport("user32.dll")]
public static extern Boolean CloseDesktop(IntPtr hDesktop);
[プログラム側]
const DESKTOP access=(DESKTOP.DESKTOP_CREATEMENU | DESKTOP.DESKTOP_CREATEWINDOW |
DESKTOP.DESKTOP_READOBJECTS | DESKTOP.DESKTOP_SWITCHDESKTOP | DESKTOP.DESKTOP_WRITEOBJECTS |
DESKTOP.DESKTOP_ENUMERATE | DESKTOP.DESKTOP_HOOKCONTROL | DESKTOP.DESKTOP_JOURNALPLAYBACK |
DESKTOP.DESKTOP_JOURNALRECORD);
IntPtr old = user32.GetThreadDesktop(kernel32.GetCurrentThreadId());
if (old == null) return;
IntPtr input = user32.OpenInputDesktop(0, false, access);
if (input == null) return;
SECURITY_ATTRIBUTES s = new SECURITY_ATTRIBUTES();
IntPtr newdesk = user32.CreateDesktop("newdesktop", IntPtr.Zero, IntPtr.Zero, 0,access, ref s);
if (newdesk == null) { user32.CloseDesktop(input); return; }
user32.SetThreadDesktop(newdesk);
user32.SwitchDesktop(newdesk);
MessageBox.Show("新しいデスクトップ");
user32.SetThreadDesktop(old);
user32.SwitchDesktop(old);
user32.CloseDesktop(newdesk);
user32.CloseDesktop(input);