ChangeWindowMessageFilterEx を使用したい
現在学習のために管理者権限で実行したアプリと非管理者権限で動作しているアプリでメッセージのやり取りを行う検証を行っています。
Web等の情報よりChangeWindowMessageFilterEx を使用すると実現可能なことがわかったのですが、うまく動作しません。
この関数はどう使えばフィルターの制御が行えるのでしょうか。
試したこと
C#にて検証用にテキストボックスを1つだけ追加したフォームアプリを作成しました。
このアプリ内のテキストボックスにファイル等をD&Dすると、D&Dされたアイテムの名前を表示する動作を設定し、通常権限で動作することを確認しました。
その後にマニュフェストファイルにて管理者権限での動作設定を行いました。
ここでExplorerからのD&Dが受け付けられなくなったことを確認し、ChangeWindowMessageFilterExの関数の処理を加えて見ましたが動作しません。
関数の処理タイミング変更等いろいろと行ってみましたが動作しませんでした。
何か情報があればご指摘頂けると助かります。
使用ツール・環境
- Windows 7 Ent x64
- Visual Studio 2010 C#
該当のソースコード
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Windows.Forms; 9using System.Runtime.InteropServices; 10 11 12namespace AdminForm_test01 13{ 14 public partial class Form1 : Form 15 { 16 private const uint MSGFLT_ALLOW = 1; 17 18 private const uint WM_DROPFILES = 0x233; 19 private const uint WM_COPYDATA = 0x004A; 20 private const uint WM_COPYGLOBALDATA = 0x0049; 21 22 [DllImport("user32", SetLastError = true)] 23 static extern bool ChangeWindowMessageFilterEx(IntPtr hWnd, uint msg, uint action, IntPtr unused); 24 25 26 public Form1() 27 { 28 InitializeComponent(); 29 30 ChangeWindowMessageFilterEx(this.Handle, WM_DROPFILES, MSGFLT_ALLOW, (IntPtr)0); 31 ChangeWindowMessageFilterEx(this.Handle, WM_COPYDATA, MSGFLT_ALLOW, (IntPtr)0); 32 ChangeWindowMessageFilterEx(this.Handle, WM_COPYGLOBALDATA, MSGFLT_ALLOW, (IntPtr)0); 33 } 34 35 36 private void textBox1_DragDrop(object sender, DragEventArgs e) 37 { 38 string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false); 39 40 for (int i = 0; i < files.Length; i++) { 41 string filename = files[i]; 42 textBox1.Text += filename + "\r\n"; 43 } 44 } 45 46 47 private void textBox1_DragEnter(object sender, DragEventArgs e) 48 { 49 // カーソルアイコン変更 50 if (e.Data.GetDataPresent(DataFormats.FileDrop)) 51 { 52 e.Effect = DragDropEffects.All; 53 } 54 else 55 { 56 e.Effect = DragDropEffects.None; 57 } 58 } 59 } 60} 61
恐らくご覧になったと思いますが、これで解決しませんか?
https://social.msdn.microsoft.com/Forums/officeocs/ja-JP/eea435b3-e1a9-4065-af36-a68008fadd90/3164929702327732717738480123912345534892123771242712392?forum=netfxgeneralja
なぜ最後の引数が (IntPtr)1 なのか理解できません。
どういう意味がありますか?
ご教示いただいたページも拝見しており、同じように調整してみてはいるのですがうまく動作していないようです。
最後の引数については、参考ページにありますとおりにもともとは数値の0を指定していたのですが、そのままではエラーが発生してしまいコンパイルも通らない状況でしたので変更していました。
「'int' から 'System.IntPtr' に変換できません」と出ていたため「(IntPtr)0」と変更し、検証を進めていくうちに「(IntPtr)1」となっていたようです。
こちらの値を「(IntPtr)0」に戻しましたが動作はしていない状況です。
TextBox のハンドルを渡してみたらどうなりますか?
1番目の引数を「textBox1.Handle」で指定してみましたが動作しませんでした。
また、元のコードに追加でtextboxのハンドルも渡してみましたが動作しないようです。
ご指摘頂いた4番目の引数も「IntPtr.Zero」に変更してみましたがこれも動作は変わらずといった状況です。
Application.Handle だとどうですか?
ApplicationにHandleを探せませんでした。
usingでの宣言に不足があるでしょうか?
すみません。こちらのミスです。Application.Handle はありません。
コードが触れる状況になったので調べてみます。