|
分類:[C#]
お世話になっています。
OpenFileDialogのカスタマイズというよくあることをやっていたのですが、
変な事象が発生したので、ご教授して頂けないでしょうか。
変な事象というのはWindowsVistaで「CDM_GETFILEPATH」が仕事をしないという事象です。
(XPやWin7の環境がないため、Vista以外では確認しておりません)
ソースは以下の通りです。お目汚しなソースですが、ご容赦ください。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
[DllImport("user32.dll")]
internal static extern IntPtr CreateWindowEx(
uint dwExStyle, string lpClassName, string lpWindowName, uint dwStyle, int x, int y,
int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
internal static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, StringBuilder lParam);
const uint WS_VISIBLE = 0x10000000;
static readonly IntPtr HWND_MESSAGE = new IntPtr(-3);
static readonly IntPtr NULL = IntPtr.Zero;
public static IntPtr target = IntPtr.Zero;
public Form1()
{
InitializeComponent();
IntPtr dummy = CreateWindowEx(0, "Message", null, WS_VISIBLE, 0, 0, 0, 0,
HWND_MESSAGE, NULL, NULL, NULL);
new HandlerHelper().AssignHandle(dummy);
OpenFileDialog dlg = new OpenFileDialog();
dlg.ShowHelp = true;
dlg.ShowDialog(this);
dlg.Dispose();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (target != IntPtr.Zero)
{
StringBuilder filePath = new StringBuilder(256);
uint cd = 0x0465;//CDM_GETFILEPATH;
SendMessage(target, cd, (IntPtr)256, filePath);
Debug.WriteLine(filePath.ToString());
}
}
public class HandlerHelper : NativeWindow
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0006) //WM_ACTIVATE
{
if (Form1.target == IntPtr.Zero)
{
Form1.target = m.LParam;
}
}
base.WndProc(ref m);
}
}
}
}
この状態で実行すると「CDM_GETFILEPATH」はちゃんと仕事を行い、
選択しているファイルを取得してきます。
しかし、
//dlg.ShowHelp = true;
とし、ヘルプボタンを表示しないようにします。
そうすると、「VistaっぽいOpenFileDialog」になるのですが…
これで実行すると、「CDM_GETFILEPATH」は仕事をしてくれません。
いろいろググってみたのですが…原因が分かりませんでした。
どなたかご教授して頂けないでしょうか。
|