none
ソフトウェアキーボードを作っています。 RRS feed

  • 全般的な情報交換

  • いつもお世話になります。
    VisualC#2010、Windows7での動作について質問があります。
    ソフトウェアキーボードを作っています。
    ボタンを配置して、
    private void DeleteKey_Click(object sender, EventArgs e) {
     keybd_event((byte)Keys.Delete, 0, 0, (UIntPtr)0);
     keybd_event((byte)Keys.Delete, 0, 2, (UIntPtr)0);
    }
    のようにクリックイベントを作った場合、そのボタンを受ける対象となるウィンドウがメモ帳(など)の場合は、deleteキーとして機能させることができますが、対象となるウィンドウがエクスプローラの場合には、ファイルを削除できません。
    対象となるウィンドウを取得して、アイコンを選択している場合には、File.Delete(対象);とすべきなのかなと思うのですが、その方法をご示唆ください。
    • 種類を変更済み 山本春海 2011年10月31日 6:52 自己解決されているようなのでステータスを変更しました
    2011年10月9日 14:54

すべての返信

  • とりあえずアクティブなウィンドウを取得してみようと、
    [DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    public static extern int GetWindowThreadProcessId(IntPtr handleWindow, out int id);

    // アクティブなプロセスを取得する
    public static Process GetActiveProcess(){
     // アクティブなウィンドウハンドルの取得
     IntPtr handleWindow = GetForegroundWindow();
     int id;
     // ウィンドウハンドルからプロセスIDを取得
     GetWindowThreadProcessId(handleWindow, out id);
     Process process = Process.GetProcessById(id);
     return process;
    }
    としてみました。これでエクスプローラの場合なら、選択しているアイコンを取得して(できるとして)、それのパスを取得して削除すればよいと。
    が、これで取得できるprocessは、ソフトウェアキーボード自身のプロセスでした。キーを押した瞬間にアクティブなのはたしかにソフトウェアキーボードですが…。

    2011年10月10日 0:27
  • 質問事項に対する回答ではありません。

    • 「一般ユーザー」として、実行したときにどう実行されるか、確認しておきましょう。
    • 「管理者として実行」してあるプロセスに対して、どのように動作するか、確認しておきましょう。


    不適切ですか。上位権限で動作しているアプリケーションに対して、UI メッセージを送ることはできないのですが、そういう情報は不要だとおっしゃるのですか。


    Jitta@わんくま同盟
    • 編集済み Jitta 2011年10月10日 11:33
    2011年10月10日 3:33
  • え、この質問が不適切とされてしまうと、回答のしようがないような。d-kotさんは 素直にWindows XP以前のOSを使うしかないのかも。


    • 編集済み 佐祐理 2011年10月10日 14:22
    2011年10月10日 14:22
  • こんにちは、ダッチです。

    「ファイルを削除できません」というのは確認ダイアログが表示されるのがいやだということですよね。

    ごみ箱のプロパティで「削除の確認メッセージを表示する」チェックがあるのでそれを外してみてください。

    Delete キーを押すだけで削除できるようになりますよ。

     

    個人的な意見をいうと ソフトウェア キーボード が Delete キーの動作をアプリ毎に変更するというのはちょっと変かなと思います。

    その時点 でソフトウェア キーボード 以上のレベルの動作になっているからです (それを望んで開発しているかもしれませんが)。

    そこは OS なり各アプリの挙動に従って動作すればいいのではと思います。


    ダッチ http://youryella.wankuma.com/
    2011年10月11日 0:45
  • # UAC とか UIPI も考慮すべきなのにと強く思うのですが、あえて目をつぶって投稿してみます。

    ボタンを配置して、
    private void DeleteKey_Click(object sender, EventArgs e) {
     keybd_event((byte)Keys.Delete, 0, 0, (UIntPtr)0);
     keybd_event((byte)Keys.Delete, 0, 2, (UIntPtr)0);
    }
    のようにクリックイベントを作った場合、そのボタンを受ける対象となるウィンドウがメモ帳(など)の場合は、deleteキーとして機能させることができますが、対象となるウィンドウがエクスプローラの場合には、ファイルを削除できません。

    エクスプローラーの場合には、そもそも Delete キーが効かない(削除確認のメッセージ ボックスすら出ない)と私は理解したのですが、この認識で正しいでしょうか?
    もしそうであれば、ファイルを正しく選択できていないとか、入力処理スレッドに正しくアタッチできていないとかいったことが考えられます。
    少なくとも Windows に標準で入っているスクリーン キーボードであれば、エクスプローラー上で Delete キーは普通に動作しますし、ちょっと試しに作ってみた手元のテスト プログラムでも、スクリーン キーボードと同様の動きは実現できています。
    単純に d-kot さんのコードに問題があるのではないかと思います。
    私の理解が間違っているようでしたら、申し訳ありません、無視してください。

    あと、Windows 7 で keybd_event を使用するべきではありませんよね。SendInput を使用すべきです。

    keybd_event 関数
    http://msdn.microsoft.com/ja-jp/library/cc364822.aspx

    SendInput 関数
    http://msdn.microsoft.com/ja-jp/library/cc411004.aspx

    対象となるウィンドウを取得して、アイコンを選択している場合には、File.Delete(対象);とすべきなのかなと思うのですが、その方法をご示唆ください。

    対象のアプリケーションを認識して云々というのは、ダッチさんの意見と同じく、ソフトウェア キーボードがやるべきことではないと思います。
    上にも書きました通り、

      エクスプローラーでファイルを選択 -> 自作ソフトウェア キーボードで Delete キーをクリック -> ファイルの削除を実行(削除確認のメッセージ ボックス)

    という流れは普通に実現できますので。
    2011年10月11日 6:07
  • コントロール パネルより、「コンピュータの簡単操作→コンピュータの簡単操作センター」と進むと、「スクリーンキーボードを開始します」という項目があり、ここをクリックすると、スクリーン キーボードが表示されます。これを利用せず、自作する意図は何でしょう?

    Vista の OSK は、「コンピュータの簡単操作」のくせに文字が小さく(フォント サイズは変えられるが、大きくしすぎるとはみ出る)、サイズを変えられませんが、Windows 7 の OSK は、サイズの変更が出来ます。ほかのものを探そうと、ヘルプに出てくる「http://www.microsoft.com/japan/enable/osk」という URL にアクセスすると、404 Not Found が返ってきます。日本語は http://www.microsoft.com/japan/enable/at/search.mspx、英語は http://www.microsoft.com/enable/at/matvplist.aspx あたりが近そうです。

    他のアプリケーションにキーボードやマウスの入力を送るという行為は、マルウェアとしても動作するため、Vista 以降は、より高い特権で動作しているプロセスに対して SendInput 等が通りません。このことは、「SendInput」で検索すれば複数の質問が見つかります。例えば、「コマンド プロンプトには送る事が出来ません」など。しかしこの状況でも、コンピュータの簡単操作から起動する OSK は機能します。詳しくは「ユーザー インターフェイス特権の分離(UIPI)」を参照。

    自作ソフト上で、自作ソフトに対してのみ有効な OSK であればまったくかまわないのですが、Windows Explorer に対する動作についての質問なので、汎用的な OSK を作成したいのだと理解しました。“汎用的な”OSK を作成するには、最終的にはマイクロソフトの審査が必要です。「標準の OSK は使いにくいから自作しよう」というレベルで作るものではないと思います。あくまでも、汎用的な OSK ならば、ですが。

    Vista の、ユーザー補助(コンピュータの簡単操作)から起動する OSK は、先述の通り、小さくて使いづらいですが、タブレット PC 入力パネルであれば、サイズを変更出来るし、日本語も刻印されているので使い易いでしょう。タブレットを接続すれば表示されるのですが、そうでない場合は次の所にファイルがあると思います。これを実行します。
    "%ProgramFiles%\Common Files\microsoft shared\ink\TabTip.exe"
    タブレットをつないだことのない Windows 7 で、コントロール パネルから「タブレット」を検索、「Windows ヘルプとサポート」に「タップして起動する」という項目がありました。その項目をクリックして、タブレット PC 入力パネルが起動することを確認しました。Windows Vista では、同じヘルプ文書に起動する項目がありませんでした。Windows 7 の方で文書中で右クリックすると「ソースを表示」がありましたので、HTML ソースから起動してる箇所を特定、Windows Vista でファイルの存在を確認しました。


    なお、「「ゴミ箱に入れる」のではなくて「削除」したい」と言うことなら、[Shift]+[Del] が Windows 標準のキー操作です。「問い合わせダイアログを表示せずに直ちに削除したい」と言うことなら、ゴミ箱のプロパティで「ゴミ箱にファイルを移動しないで、削除と同時にファイルを消す」を選択、「削除の確認メッセージを表示する」をアンチェックです。


    Jitta@わんくま同盟
    2011年10月12日 12:48
  • コメントがたいへん遅くなって申しわけありませんでした。
    あまり時間がとれなくなってしまって、確認できませんでした。
    まず、最初にご報告。自己解決しました。
    エクスプローラの場合、ソフトキーが動かない、ということじたいが、なにかの確認ミスだったようです。
    あらためて確認したところ、削除キーでファイルを削除できました。
    前回動作しなかった理由は原因不明ですし、いつ再現するかもわからないのですが、とりあえず。

    ダッチさん。「ファイルを削除できない」というのは、文字通りできないということです。ゴミ箱のプロパティとは無関係です。

    エディタ以外の他のソフト、たとえばタスクマネージャに対してであれば、このソフトウェアキーボードで削除ボタンを押すことで、該当するタスクを終了することができます。
    つまり、動作しないのはエクスプローラの場合、と考えていました。
    ただ、前述の通りで、今日確認したら動作するようになってしまい、それはそれで助かるような困るような感じです。

    個人的なコメントありがとうございます。
    わたしも挙動をいろいろ変更するのは、どうなのかなとは思いますし、とくにソフトウェアキーボード以上のものを開発しているつもりではないのです。
    いまのところ自分で毎日使っているものなので、使いやすく改良していて、その結果がソフトウェアキーボードであるのかないのかについてのゴールを制約してしまうつもりもありません。
    だって、再現しないのですが、エクスプローラでファイルを削除するときに、削除キーでできないのなら、そんなソフトキーボードは使いにくいと思いませんか?
    それでどうしても必要なら、個別の機能を開発する以外にない、と考えてました。
    基本的にはおっしゃるように、OSやアプリケーションとうまく連携できて、思ったとおりの挙動をするのであれば、それで足りると考えています。

     

    2011年10月23日 5:04
  • totojoさん、コメントありがとうございます。
    Jittaさん、コメントありがとうございます。
    UACやUIPIについても情報ありがとうございます。
    最初、Jittaさんのコメントを不適切としたのは、「質問事項に対する回答ではありません」とあったためで、他意はありません。
    上位権限で動作しているかどうかがソフトウェアキーボードに関係するなどと考えたことはなかったので、コメントを理解できていませんでした。ただ、わたしはこのマシンの管理者としてログインしているので、権限がどうこうというのは、今回は無関係な気がします。

    おっしゃるとおりで、今回の問題はエクスプローラの場合、deleteキーが効かない、というものでした。その認識はわたしと共通します。

    コードに問題はあるのかもしれません。それについてはじっくり考えてみます。
    またkeybd_eventではなく、SendInputを使うべきとのこと。
    情報ありがとうございました。
    ソフトウェアキーボードを全面的に作り変える必要が出てきていて、しばらく時間がかかりそうです。
    とりあえず、SendInputを動かすところまではできたので。

    2011年10月23日 5:04
  • Jittaさん、コメントありがとうございます。
    また意図ですか。意図について話すと、しばしば誤解される気がしますが、質問には答えます。
    意図は、スクリーンキーボードのキー配列が気に入らないからです。
    わたしは、キーボードを自作しているので、ソフトウェアキーボードでもそのキーボードに合わせた配置で入力したいと考えています。
    その配置はQWERTYではないので、QWERTYのキーボードは基本的に利用しません。
    またhttp://のような定型句を入力支援したりするとなると、自作する以外にないと思います。
    そもそもソフトウェアだけで配置を変更できるのなら、もっと自由な配置で入力できればよいのにと思いますけれども。

    SendInputの問題点、UIPIの話、かみ砕いていただいてありがとうございます。
    SendInputは上記のとおり、まだ動かす段階なので、keybd_eventの場合にかぎってですが、いま作っているソフトウェアキーボード(keybd_event版)は、コマンドプロンプトに対しても入力できます。今後、SendInput版を作るとしたら、で、コマンドプロンプトに入力できないとしたら、またいろいろ考えなければならないことが出てくると思います。

    OSK(On Screen Keyboard)をどこまで汎用にするかですが、上記のように、まずはキー配置が問題で、その配置を使っているのは、(そもそもキーボードを公開していないので)、全世界にわたしひとりです。
    ですから、その配置だけを公開しても、あまり意味がない気がします。公開とか汎用とか、というのをどう考えるかはそれぞれかと思いますが。

    お調べいただいたTabTip.exeは、有益だとは思いますが、残念ながら、上記の理由で、わたしには無用の長物です。すみません。

    エクスプローラで行いたいことですが、前述の通り、ゴミ箱に入れることです。削除ではありません。問い合わせダイアログとは無関係です。

    2011年10月23日 5:05
  • ええ、そのように理解しています。だから、「不要なんですね」と追加しているのです。

    私は、調べてほしかったのです。でも、あなたは、調べもせずに、自分の知識だけで判断して、関係ないと判断されたわけですね。

    他のスレッドでも、「圧倒的に知識が足りていない」と批判されているのに。他のスレッドでも、「管理特権が必要だ」という話があったのに。そういえば、そのときも「管理者としてログインしているから不要」と書かれていましたね。

    「管理者としてログイン」とは、どういうことですか?windows 7 で「管理者」というのは、Administrator アカウントだけです。そして、このアカウントは、デフォルトでは無効にされています。この、無効にされているアカウントを有効にして使っているのでしょうか。それとも、Administrators グループのアカウントを、UAC をオフにして使用しているのでしょうか。どちらも一般的な環境ではありませんから、それは明示されていなければわかりません。Windows XP 以前の「管理者」は、Windows Vista 以降、「管理特権を取得することができるアカウント」です。また、ローカル PC の管理者だけでなく、ドメインの管理者というものもあります。いくらローカル PC の管理特権を持っていても、ドメインの管理者が禁止した事項を変更することはできません。全く認識不足です。

    「削除」についても、そうです。「削除できません」しか情報がなく、削除できなくてどうなるのか、どうなってほしいのか、書かれていません。そのために、「ダイアログが出ることが悪いのか?」と考える人、「ゴミ箱に移動することが悪いのか?」と考える人が出てきます。特に、File.Delete なんて使っていますから。

     

    「キーボード 配置 変更」で探せば、こういうところが見つかるし、「キートップ 配置」で検索すれば、ハードウェアも見つかるのですけどね。


    Jitta@わんくま同盟
    2011年10月26日 14:23