C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: SendKeys相当の動作を別ソフトに送りたい


(過去ログ 88 を表示中)

[トピック内 21 記事 (1 - 20 表示)]  << 0 | 1 >>

■52362 / inTopicNo.1)  SendKeys相当の動作を別ソフトに送りたい
  
□投稿者/ ビリオン (1回)-(2010/08/06(Fri) 17:41:20)

分類:[C#] 

こんにちわ。

現在自作ソフトから既存の別ソフトへキー情報を飛ばすようなシステムを作成しているのですが上手くいかず困っております。
プログラム的にはとても単純で

if (hoge == "こんにちわ")
{
     SendKeys.Send("Hallo");
}

省略するとこれをタイマーイベントで定期的に処理しているだけです。

流れとしては
自作ソフトA 別ソフトBとあった場合
AからBのメモリを読み込み特定の部分の値をhogeに格納し
hogeが条件を満たせば、AからBにキー情報を飛ばすという物です。
この処理だとキー情報を飛ばすというより、単純にキーを押しているだけですが。
基本的にBが常にアクティブである、という前提で考えてもらって構いません。
ウィンドウハンドルを探しに行ったり、Bをアクティブにしてから等という事は無視するとします。

色々と調べたのですが、送り先がDirectXを使用していて
Windowメッセージを使っていなければSendKeysが通用するわけがない、という結果になったのですが
BがDirectXで動作していてWindowメッセージを使用していない場合、どうすればキー入力が送れるでしょうか?

http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/84d8271c-84df-4631-b6f9-ecd195f65152
上記サイトを参考にSendInputも試してみましたが無理でした。
こちらの場合はエラーは出なくなりましたが、キー入力は送られていないようです。
キー入力を送るという動作自体はできているようなんですが、ソフトBにはDirectXだからなのか無理のようでした。
SendInputの方はサイトにあるサンプルをほぼそのまま使い、送るキーコードを試しにF1に変更し
↑にあるループの中で呼ぶようにしただけです。
アクティブなウィンドウがブラウザならF1が送られ、ヘルプが開きました。
その状態でアクティブなウィンドウがソフトBではエラーは出ませんが、期待するF1を押すという動作も起きませんでした。

他に何かこの動作を実現できる方法はあるでしょうか?

引用返信 編集キー/
■52376 / inTopicNo.2)  Re[1]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ ビリオン (2回)-(2010/08/06(Fri) 21:00:56)
更に探しているとこの掲示板の過去ログでほぼ同じような事をしている人が見つかりました。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=21628&KLOG=41

この記事も参照してやってみましたがやはり無理でした。
しかし介入できる既知のソフトもあるので、不可能ではないとは思うのですが・・・
例えばJTKは動作しています。
JTKでジョイスティックに適当なキーを割り当て、ボタンを押せば
自分の自作ソフトでは無理なソフトBにも、ちゃんと入力したキーを送れています。

しかしDirectInputでできるのはキー状態の取得で、こちらから送信するような機能はないですよね?
という事はJTKはDirectInputでコントローラーの状態を取得し、
それを何らかの方法でキーボードやマウスの情報として送信していると思うのです。
でもめぼしい送信方法、PostMessage、SendKey、SendInput、は結局どれもダメでした。
エラーが出たり、エラーは出なくても反応しなかったりと。
これ以外にも何かあるんでしょうか?
引用返信 編集キー/
■52390 / inTopicNo.3)  Re[2]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ やじゅ (1694回)-(2010/08/07(Sat) 18:11:39)
やじゅ さんの Web サイト
No52376 (ビリオン さん) に返信
> しかしDirectInputでできるのはキー状態の取得で、こちらから送信するような機能はないですよね?
> という事はJTKはDirectInputでコントローラーの状態を取得し、
> それを何らかの方法でキーボードやマウスの情報として送信していると思うのです。
> でもめぼしい送信方法、PostMessage、SendKey、SendInput、は結局どれもダメでした。
> エラーが出たり、エラーは出なくても反応しなかったりと。
> これ以外にも何かあるんでしょうか?

SendInputでいいはずですけどね。
ここの記事検索で「SendInput」で検索してみるとか

引用返信 編集キー/
■52391 / inTopicNo.4)  Re[3]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ ビリオン (3回)-(2010/08/07(Sat) 19:51:02)
検索してみたのですが、未解決のものばかりのようでした。
動作していても、自分の場合とは違い対象ソフトがメモ帳のような場合でした。
自分の場合も、対象がメモ帳やその他適当なソフトであればSendInputで送信することはできております。

                if (flg == 1))
                {
                    INPUT input = new INPUT();
                    input.type = INPUT_KEYBOARD;
                    input.ki.wScan = 0;
                    input.ki.time = 0;
                    input.ki.wVk = 0x30;
                    input.ki.dwFlags = 0;      //Key Down
                    input.ki.dwExtraInfo = GetMessageExtraInfo();

                    SendInput(1, ref input, Marshal.SizeOf(typeof(INPUT)));
                }

テストで使っているコード部分をそのまま抜き出してきました。
宣言などは書くと長くなるので最初のリンク
http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/84d8271c-84df-4631-b6f9-ecd195f65152
に書かれていたものを全くそのまま使っています。
テストなのでキーコードはわかりやすいように直うちしています。
この場合フラグ判定を満たせば、アクティブなウィンドウに「0」が送られるはずです。
この判定をtimerイベントで1秒間隔に設定し、メモ帳をアクティブにしておけば
メモ帳に1秒間隔で0が入力されていくのを確認できております。
しかし目的のソフトには同じような入力欄があるのですが、そこに0が入力されることはありません。

メモ帳やブラウザ、その他WindowsでいうとFormを利用しているようなソフトであれば問題なく動作するようです。
Formでなくても昔のMFCや、Delphiのソフトとかでも大丈夫でした。
しかしタイピングソフト等ゲームとかでは動作しません。
やはり恐らくDirectX関連がダメなのでしょうか?


引用返信 編集キー/
■52392 / inTopicNo.5)  Re[4]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ ビリオン (4回)-(2010/08/07(Sat) 20:39:05)
http://d.hatena.ne.jp/anon_193/20090504/1241405315
DirectInputを使用しているソフトへ入力を飛ばす場合スキャンコードを弄らないといけないというような上記記事を見つけたので
先ほどの部分を
> if (flg == 1))
> {
> INPUT input = new INPUT();
> input.type = INPUT_KEYBOARD;
> input.ki.wScan = (ushort)MapVirtualKey(0x30, 0);
> input.ki.time = 0;
> input.ki.wVk = (ushort)0x30;
> input.ki.dwFlags = 0; //Key Down
> input.ki.dwExtraInfo = GetMessageExtraInfo();
>
> SendInput(1, ref input, Marshal.SizeOf(typeof(INPUT)));
> }
と変更し試してみました。
しかしやはり動作はしませんでした。
そしてやはり、メモ帳などでは動作しています。

DirectInputにキーを押したと判定させるには他に何か必要なんでしょうか。
引用返信 編集キー/
■52393 / inTopicNo.6)  Re[5]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ ビリオン (5回)-(2010/08/07(Sat) 21:19:28)
http://ir9.jp/prog/ayu/datlog/tech_win32api/1138893959/1138893959_04.html
追加で見つけましたが、この掲示板の915辺りから似たような話題がでており
それによるとやはりスキャンコードを使う事が前提のようでした。
ですが動作しないので
SendInputの戻り値を見てみると、メモ帳などでは1、動かないソフトでは0が返ってきていました。
MSDNによると、0だと「ほかのスレッドによって入力がすでにブロックされている場合」なのですが
上記掲示板でも同じようになっていて、そのまま解決せず終わってしまっていて対策が分かりませんでした。
他のスレッドがブロックしているのをこちらから外す事はできるのでしょうか?

引用返信 編集キー/
■52400 / inTopicNo.7)  Re[6]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ やじゅ (1695回)-(2010/08/08(Sun) 12:25:16)
やじゅ さんの Web サイト
2010/08/08(Sun) 12:26:47 編集(投稿者)

No52393 (ビリオン さん) に返信
>例えばJTKは動作しています。
>他のスレッドがブロックしているのをこちらから外す事はできるのでしょうか?

JTKをPE Explorerを使って逆アセンブリしてみると使用しているDLLが見れたりします。
SendInputあたりは問題ないなら、CriticalSectionあたりが関係しているのでは?

call jmp_USER32.DLL!MapVirtualKeyA
call jmp_USER32.DLL!keybd_event
call jmp_USER32.DLL!SendInput
call jmp_USER32.DLL!mouse_event
call jmp_DINPUT.DLL!DirectInputCreateA
call jmp_KERNEL32.DLL!EnterCriticalSection
call jmp_KERNEL32.DLL!LeaveCriticalSection
call jmp_USER32.DLL!GetForegroundWindow
call jmp_KERNEL32.DLL!EnterCriticalSection
call jmp_KERNEL32.DLL!LeaveCriticalSection
call jmp_KERNEL32.DLL!InitializeCriticalSection
call jmp_WINMM.DLL!timeSetEvent
call jmp_WINMM.DLL!timeKillEvent
call jmp_KERNEL32.DLL!DeleteCriticalSection
call jmp_KERNEL32.DLL!EnterCriticalSection
call jmp_KERNEL32.DLL!LeaveCriticalSection
call jmp_USER32.DLL!GetDesktopWindow
call jmp_SHELL32.DLL!ShellExecuteA
call jmp_KERNEL32.DLL!OpenMutexA
call jmp_KERNEL32.DLL!CloseHandle

引用返信 編集キー/
■52401 / inTopicNo.8)  Re[7]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ ビリオン (6回)-(2010/08/08(Sun) 18:20:21)
クリティカルセクション自体何かよくわからなかったので検索してみたのですが
スレッドを使う時に用いる物なのでしょうか?

http://moondial0.net/archives/ufcpp.net/study/csharp/sp_thread.html#cs
殆ど見当もつかないのですが、このサイトで書いてある部分でいうと
//↓クリティカルセクション
//↑クリティカルセクション
で囲まれている部分でsendinputの処理を行えば、割り込めるとかそういうことなのでしょうか。

自分でスレッド処理する分には分かりそうな感じはするのですが
これを別プロセスに絡める事が出来るのかどうか全く分かりません。
割り込みたいプロセスがrockされているので、これを使ってrock解除待ちをして割り込んで処理をする。
というような認識であっているのでしょうか?

今までの情報だと、ここをこうすればもしかして・・・みたいな手応えはあったのですが
今回は本当に何をどうしていいのかすらさっぱり理解出来ませんでした。
まだまだ未熟者なので、小学生が高校数学に手を出しているような状況になっているのでしょうか・・・
引用返信 編集キー/
■52413 / inTopicNo.9)  Re[8]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ Azulean (590回)-(2010/08/09(Mon) 00:32:39)
No52401 (ビリオン さん) に返信
> クリティカルセクション自体何かよくわからなかったので検索してみたのですが
> スレッドを使う時に用いる物なのでしょうか?

あるリソースに対して、ほかのスレッドと競合してアクセスすることがないように、排他するために用いる仕組みですね。
ただ、今回の問題とは全く関係ないと思われます。

# 間違えても、よそ様のスレッドを勝手にブロック解除することはしちゃいけない。(何が起きるかわからない)
# できるかどうかも不明ですが。


> If the function returns zero, the input was already blocked by another thread.
> To get extended error information, call GetLastError.

さて、0 が戻ってきたときに、GetLastError は何を戻すのですか?
引用返信 編集キー/
■52419 / inTopicNo.10)  Re[9]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ ビリオン (7回)-(2010/08/09(Mon) 09:54:56)
> # 間違えても、よそ様のスレッドを勝手にブロック解除することはしちゃいけない。(何が起きるかわからない)
> # できるかどうかも不明ですが。
危なそうなので触らない方が良さそうですね・・・

>>If the function returns zero, the input was already blocked by another thread.
>>To get extended error information, call GetLastError.
>
> さて、0 が戻ってきたときに、GetLastError は何を戻すのですか?
早速やってみたのですが、戻り値は5でした。
http://homepage3.nifty.com/aokura/tips/e000000.html
上記サイトでエラー内容を調べてみると5は
「アクセスが拒否されました。」のようです。
メモ帳などでは0が返ってきており、内容的には「この操作を正しく終了しました」でやはりちゃんと処理できているようです。
アクセスが拒否された場合、どうすればいいのでしょうか。

引用返信 編集キー/
■52422 / inTopicNo.11)  Re[9]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ れい (952回)-(2010/08/09(Mon) 10:16:41)

SendInputを使えばDirectInputでも問題なく送れるはずなんですが。
DirectInputの仕組みからして。

私のところではDirectX7でも8でも9でもSendInputでエミュレートできてます。

何か他のところに問題があるように思えます。

KEYEVENTF_KEYUPを送っていないということはありませんか?

動かないソフトというのは具体的には何でしょう?

引用返信 編集キー/
■52424 / inTopicNo.12)  Re[10]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ todo (38回)-(2010/08/09(Mon) 10:31:10)
> アクセスが拒否された場合、どうすればいいのでしょうか。

OSは何でしょうか?
VistaやWin7ならUIPIの問題かもしれません。

ユーザー インターフェイス特権の分離 (UIPI)
http://msdn.microsoft.com/ja-jp/windows/dd871146.aspx
引用返信 編集キー/
■52451 / inTopicNo.13)  Re[10]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ ビリオン (8回)-(2010/08/10(Tue) 00:19:52)
No52422 (れい さん) に返信
> KEYEVENTF_KEYUPを送っていないということはありませんか?
サンプルでは送っていないのですが、メモ帳などではそれでも動作していましたのでそのままテストしていました。
一応KEYEVENTF_KEYUPもつけて再度やってみましたが、やはり変わりませんでした。

> 動かないソフトというのは具体的には何でしょう?
一般的には出回っていないソフトなので具体名はちょっと公表できないです。
イメージ的には社内専用ソフトみたいなものだと考えてもらえばいいと思います。

No52424 (todo さん) に返信
> OSは何でしょうか?
> VistaやWin7ならUIPIの問題かもしれません。
OSはWindowsXP Pro SP3です。

引用返信 編集キー/
■52455 / inTopicNo.14)  Re[11]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ れい (953回)-(2010/08/10(Tue) 06:11:52)
No52451 (ビリオン さん) に返信
> ■No52422 (れい さん) に返信
>>KEYEVENTF_KEYUPを送っていないということはありませんか?
> サンプルでは送っていないのですが、メモ帳などではそれでも動作していましたのでそのままテストしていました。
> 一応KEYEVENTF_KEYUPもつけて再度やってみましたが、やはり変わりませんでした。

あらら。
まぁでもKEYUPがないのはおかしいですよね。

>>動かないソフトというのは具体的には何でしょう?
> 一般的には出回っていないソフトなので具体名はちょっと公表できないです。
> イメージ的には社内専用ソフトみたいなものだと考えてもらえばいいと思います。

前の投稿で

>しかしタイピングソフト等ゲームとかでは動作しません。
>やはり恐らくDirectX関連がダメなのでしょうか?

とありますので、他にも動作しないソフトがあるのでは?
社内専用ソフト以外にないのでしょうか?

キー入力は


ハードウェア
ドライバ
(クラスドライバ)
(ミニフィルタ)
システムメッセージキュー
スレッドメッセージキュー(普通のウィンドウメッセージ)
DirectInput もしくは TranslateMessage

の順に情報が伝わります。
SendInputはこれのうちシステムメッセージキューに情報を挿入します。

ドライバから直接読んでいるソフトはSendInputでエミュレートできません。
エミュレート可能なドライバを挿入する必要があります。

正しいメッセージをSendInputでシステムメッセージキューに入れていれば、
DirectInputによるデータ取得もWindowメッセージによるそれも正しく動きます。

ただ、DirectInputによるキーボード情報の処理と、
Windowsメッセージの際のTranslateMessageによる処理と、内容が異なります。

正しいKEYBDINPUTデータを渡せばどちらの処理も正しく動作しますが、
ダメなKEYBDINPUTを渡した場合、
TranslateMessageではうまく動いてもDirectInputではうまく動かない、
というようなことがあります。

例えば、「wScan」はDirectInputでは必須ですが、
無くても普通のウィンドウでは動いたりします。
そういったようなことが起きている可能性はあります。


ですので…

原因1
対象のソフトがドライバから直接読んでいる。

対策法
キーボードミニフィルタドライバを作成して挿入する。

原因2
やっぱりSendInputの送り方がおかしい。

対策法
最小コードと問題の再現環境・手順を提示して助けを待つ。

の二つしかないかと。

引用返信 編集キー/
■52479 / inTopicNo.15)  Re[12]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ ビリオン (9回)-(2010/08/11(Wed) 01:06:09)
No52455 (れい さん) に返信
> とありますので、他にも動作しないソフトがあるのでは?
> 社内専用ソフト以外にないのでしょうか?
DirectX関係でダメなのかな?と思い適当にあったソフトで試したのがタイピングソフトでした。
たまたま自分が持っていただけの市販品で、これは有料ですので
無料系で何かないかなと思って見ていたら、オンラインゲームになってしまいますがまたまた個人的にやっていた
パンヤというソフトでやったところ、同様に動作が確認できませんでした。

> 例えば、「wScan」はDirectInputでは必須ですが、
> 無くても普通のウィンドウでは動いたりします。
> そういったようなことが起きている可能性はあります。
wScanで少し気になったことがあるのですが
MapVirtualKeyで取得した値と、フリーであったスキャンコードを調べるソフトで取得した値に差があるんです。
例えばF1ですと、そのソフトで調べると仮想キーが「70」スキャンコードが「3B」となります。
スキャンコードの方は環境依存、というかキーボード依存という認識でいいんですよね?
で、MapVirtualKeyでF1の仮想キーである「70」を引数で渡すとその戻り値には「33」が返ってきます。
http://www.technoveins.co.jp/utility/keyindisp/index.htm
スキャンコードを調べるのには検索して出てきたこのソフトを使用しました。
ちなみにソフトで調べた方、MapVirtualKeyの戻り値の方どちらにしても動作はしませんでした。

> 対策法
> キーボードミニフィルタドライバを作成して挿入する。
恐らくこちらは自分の技術力では無理そうですね・・・
それを実現するのに何がどう必要なのかすら全くわからないです・・・

> 対策法
> 最小コードと問題の再現環境・手順を提示して助けを待つ。
ちょっと長くなりそうなので2個目のレスで書きたいと思います。

引用返信 編集キー/
■52480 / inTopicNo.16)  Re[13]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ ビリオン (10回)-(2010/08/11(Wed) 01:27:04)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace KeyInterrupts
{
    public partial class Form1 : Form
    {
        const int INPUT_MOUSE = 0;
        const int INPUT_KEYBOARD = 1;
        const int INPUT_HARDWARE = 2;

        [DllImport("user32.dll")]
        private extern static Int32 MapVirtualKey(Int32 uCode, Int32 uMapType);

        [DllImport("user32.dll")]
        static extern int SendInput(int nInputs, ref INPUT pInputs, int cbSize);

        [DllImport("user32.dll")]
        static extern IntPtr GetMessageExtraInfo();

        private struct MOUSEINPUT
        {
            public int dx;
            public int dy;
            public uint mouseData;
            public uint dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }

        private struct KEYBDINPUT
        {
            public ushort wVk;
            public ushort wScan;
            public uint dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }

        private struct HARDWAREINPUT
        {
            public uint uMsg;
            public ushort wParamL;
            public ushort wParamH;
        }

        [StructLayout(LayoutKind.Explicit)]
        private struct INPUT
        {
            [FieldOffset(0)]
            public uint type;
            [FieldOffset(4)]
            public MOUSEINPUT mi;
            [FieldOffset(4)]
            public KEYBDINPUT ki;
            [FieldOffset(4)]
            public HARDWAREINPUT hi;
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (timer1.Enabled == true) {
                timer1.Enabled = false;
            } else {
                timer1.Enabled = true;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            INPUT input = new INPUT();

            input.type = INPUT_KEYBOARD;
            input.ki.time = 0;
            input.ki.dwFlags = 0;
            input.ki.wScan = 0x3B;
            //input.ki.wScan = (ushort)MapVirtualKey(0x70, 0);
            input.ki.dwExtraInfo = GetMessageExtraInfo();

            SendInput(1, ref input, Marshal.SizeOf(typeof(INPUT))).ToString();

            input.ki.dwFlags = 2;
            input.ki.wScan = 0x3B;
            //input.ki.wScan = (ushort)MapVirtualKey(0x70, 0);

            SendInput(1, ref input, Marshal.SizeOf(typeof(INPUT))).ToString();
        }
    }
}

SendInputのみの最小のテストコードを作ってみました。
Formにはボタンとタイマーだけがあります。
タイマーはややこしくならないように間隔を10秒としてあります。
タイマーはデフォルト無効で、ボタンを押すと開始する、もう一度押すと停止ととりあえずしてあります。
この状態で起動し、該当ソフトも準備した状態でボタンを押してタイマーを開始して
該当ソフトをアクティブにすればF1が送られるはずです。
メモ帳をアクティブにしている場合、F1が押されたことになりヘルプが開きます。
しかし実際に送りたいソフトや、パンヤ等をアクティブにしてもF1相当の動作はしません。
コード中ではwScanをフリーソフトで調べた値を直接指定の方で使い、
MapVirtualKeyの方はコメントアウトしてあります。
テスト自体はこのどちらもやっていますが、結果は同じでした。

SendInputの使い方自体が間違っていれば、その間違いをなおせば解決すると思いますが
もし
>原因1
>対象のソフトがドライバから直接読んでいる。
こちらの場合、それでも動作しているJTK等は
>キーボードミニフィルタドライバを作成して挿入する。
をしているという事になるんでしょうか?

引用返信 編集キー/
■52482 / inTopicNo.17)  Re[13]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ Azulean (592回)-(2010/08/11(Wed) 08:09:38)
No52479 (ビリオン さん) に返信
> 無料系で何かないかなと思って見ていたら、オンラインゲームになってしまいますがまたまた個人的にやっていた
> パンヤというソフトでやったところ、同様に動作が確認できませんでした。

ちなみにパンヤでは JoyToKey が使えたのでしょうか。
不正対策で使えなくなっていてもおかしくないと思われます。

# nProtect が各プロセスに Inject してきて、その手の API でアクセスしたときにアクセス拒否を返すようにしてたはず。
引用返信 編集キー/
■52484 / inTopicNo.18)  Re[14]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ ビリオン (11回)-(2010/08/11(Wed) 09:23:42)
No52482 (Azulean さん) に返信
> ■No52479 (ビリオン さん) に返信
>>無料系で何かないかなと思って見ていたら、オンラインゲームになってしまいますがまたまた個人的にやっていた
>>パンヤというソフトでやったところ、同様に動作が確認できませんでした。
>
> ちなみにパンヤでは JoyToKey が使えたのでしょうか。
> 不正対策で使えなくなっていてもおかしくないと思われます。
>
> # nProtect が各プロセスに Inject してきて、その手の API でアクセスしたときにアクセス拒否を返すようにしてたはず。
はい、パンヤでもJTKは使えました。

引用返信 編集キー/
■52503 / inTopicNo.19)  Re[15]: SendKeys相当の動作を別ソフトに送りたい
□投稿者/ やじゅ (1701回)-(2010/08/11(Wed) 19:22:46)
やじゅ さんの Web サイト
2010/08/11(Wed) 19:24:57 編集(投稿者)

No52484 (ビリオン さん) に返信

海外のサイトを検索する限りでは、KEYEVENTF_SCANCODE を使用しています。
http://msdn.microsoft.com/ja-jp/library/ms646271.aspx

dwFlagsにKEYEVENTF_SCANCODE を追加してみるとどうでしょうか?
dwFlags = KEYEVENTF_SCANCODE
dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP
引用返信 編集キー/
■52510 / inTopicNo.20)  Re[13]: SendKeys相当の動作を別ソフトに送りたい
 
□投稿者/ れい (954回)-(2010/08/12(Thu) 06:46:38)
No52479 (ビリオン さん) に返信
> ■No52455 (れい さん) に返信
>>とありますので、他にも動作しないソフトがあるのでは?
>>社内専用ソフト以外にないのでしょうか?
> パンヤというソフトでやったところ、同様に動作が確認できませんでした。

No52484 (ビリオン さん) に返信
>>ちなみにパンヤでは JoyToKey が使えたのでしょうか。
>>不正対策で使えなくなっていてもおかしくないと思われます。
> はい、パンヤでもJTKは使えました。

パンヤとはオンラインゲームのパンヤですか?
JTKとはJoyToKeyというJoyStick入力をキーボード入力にマップするソフトのことですか?

でしたら、普通の状態では動作しないはずです。
パンヤは(私の知る限り)nProtectが入っているはずで、
JoyToKeyは(私の知る限り)nProtectを回避できるようなソフトではありません。

> # nProtect が各プロセスに Inject してきて、その手の API でアクセスしたときにアクセス拒否を返すようにしてたはず。

最近の事情は知りませんが(といっても昔の事情を詳しく知ってるわけでもないのですが)…
プロセス注入は簡単に回避が可能ですし、API書き換えはリスキーなのでもうちょっと高度なことをしています。
ドライバ注入とか。

> wScanで少し気になったことがあるのですが
> MapVirtualKeyで取得した値と、フリーであったスキャンコードを調べるソフトで取得した値に差があるんです。
> 例えばF1ですと、そのソフトで調べると仮想キーが「70」スキャンコードが「3B」となります。
> スキャンコードの方は環境依存、というかキーボード依存という認識でいいんですよね?
> で、MapVirtualKeyでF1の仮想キーである「70」を引数で渡すとその戻り値には「33」が返ってきます。

それはただ単に0x70と70を間違っているだけでしょう。

>>対策法
>>キーボードミニフィルタドライバを作成して挿入する。
> 恐らくこちらは自分の技術力では無理そうですね・・・
> それを実現するのに何がどう必要なのかすら全くわからないです・・・

Windows DDKにやり方とサンプルがあります。
また、GANAさんのお作りになられた「窓使いの憂鬱」というソフトウェアが
ドライバを使ったキーボードリマッパとして昔から有名です。
どちらも無償で手に入ります。

>>対策法
>>最小コードと問題の再現環境・手順を提示して助けを待つ。
> ちょっと長くなりそうなので2個目のレスで書きたいと思います。

ぱっとみただけですが、提示コードで動作するはずです。
Windowsメッセージを使っているソフトでも、DirectXを使っているソフトでも、動作はします。
問題はいろいろありますが。

これで出来ないとすれば
対象アプリケーションがバグ持ちか、意図的に動作しないようにしていると考えていいかと思います。

バグ持ちのアプリケーションの場合は製作者に聞いてください。

意図的に動作しないように作られているのでしたら
特殊な事情や意思が無いかぎり、私に言うことはありません。

何か事情があるのでしたら説明すれば誰かが助けてくれるかもしれません。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -