質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

2428閲覧

ChangeWindowMessageFilterEx を使用したい

tarhoT

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

2クリップ

投稿2019/04/10 06:34

編集2019/04/10 09:01

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarhoT

2019/04/10 08:54

ご教示いただいたページも拝見しており、同じように調整してみてはいるのですがうまく動作していないようです。 最後の引数については、参考ページにありますとおりにもともとは数値の0を指定していたのですが、そのままではエラーが発生してしまいコンパイルも通らない状況でしたので変更していました。 「'int' から 'System.IntPtr' に変換できません」と出ていたため「(IntPtr)0」と変更し、検証を進めていくうちに「(IntPtr)1」となっていたようです。 こちらの値を「(IntPtr)0」に戻しましたが動作はしていない状況です。
Zuishin

2019/04/10 09:08

TextBox のハンドルを渡してみたらどうなりますか?
tarhoT

2019/04/10 09:20

1番目の引数を「textBox1.Handle」で指定してみましたが動作しませんでした。 また、元のコードに追加でtextboxのハンドルも渡してみましたが動作しないようです。 ご指摘頂いた4番目の引数も「IntPtr.Zero」に変更してみましたがこれも動作は変わらずといった状況です。
Zuishin

2019/04/10 09:25

Application.Handle だとどうですか?
tarhoT

2019/04/10 09:36

ApplicationにHandleを探せませんでした。 usingでの宣言に不足があるでしょうか?
Zuishin

2019/04/10 10:00

すみません。こちらのミスです。Application.Handle はありません。 コードが触れる状況になったので調べてみます。
guest

回答1

0

リンク先の通りにしてみましたが、ドラッグ・ドロップできませんでした。
念のため、さらにその先の VB ソースを移植して試してみましたが、できませんでした。
ソースコード以外のところに問題があるのだと思います。

Windows 10 アニバーサリーアップデートでこのあたりが変わっているという情報をみつけたので、次の方法でレジストリを変更して試してみてください。

Windows10でファイルをドラッグ&ドロップ出来ない?! を解決する方法

投稿2019/04/10 13:30

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/04/10 13:51

ただ、このような仕様変更があったということは、管理者モードで動いているアプリにドラッグ&ドロップをすることが良くないことだということです。学習のためということですが、この方法を極めても実用に使う機会は無いかもしれません。
tarhoT

2019/04/11 00:51

検証ありがとうございます。 ソース以外に問題がある可能性ですか...こうなってくると解決が難しそうですね。 ただ、リンク先で検証されている方はWindows10 x64環境であり、その後のアップデートで仕様変更による影響は十分に考えられるのですが、私の環境がWindows7 x64のためそこまで環境に影響しないのでは?と考えておりました。 この当たりについてはもう少し検証を行ってみます。
Zuishin

2019/04/11 01:00

レジストリの値を変更して試してみてください。
tarhoT

2019/04/11 06:26

レジストリの変更にて検証してみました。 また、Windowsの違いでも差が出るかも含めて確認を行ってみました。 検証として今までの端末とは別にWindows 7 Ent x86とWindows 7 Ent x64を用意しそれぞれで検証しました。 検証したソフトも「this.Handle」のみ、「textBox1.Handle」のみ、その両方をそれぞれ検証しています。 結果は依然として動作しておりません。 動作自体も変化無しです。 念のためレジストリ適応後の再起動とは別に再起動を行って検証しましたが変化はありませんでした。
Zuishin

2019/04/11 07:22

動作例が無いなら「この方法じゃダメ」とわかるんですが、動作してる人がいるというのが謎ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問