0

C#電子IDカード(ベルギー)からデータ情報を取得するプログラムを作成しましたが、問題はありませんが、それらの情報をプログラムの登録フォームに入れる必要があります...そして、そこからいくつか取得しました問題...

spy++ を使用してウィンドウとテキストボックスを識別することに成功しましたが (FindWindowおよびFindWindowExメソッドで選択)、問題は、(または SendMessageW) メソッドを使用して文字列を送信しているときに、SendMessage大文字と小文字を含む文字列が表示されることです。私のソフトウェアでは、他のプログラムでは完全に大文字で表示されます...アクセント付きの文字だけでなく、大文字の小文字も必要です...文字セットをUnicodeまたはAnsiに入れようとしましたが、そうではありません何かを変更する...誰かが私の問題の解決策を持っていますか? 助けてくれてどうもありがとう!

使用されるコードは次のとおりです。

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string lpszWindow);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
private static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, string lParam);

[DllImport("user32.dll", EntryPoint = "SendMessageW", CharSet = CharSet.Unicode)]
static extern IntPtr SendMessageUnicode(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);

private const int WM_SETTEXT = 12;

...

IntPtr x = new IntPtr();
IntPtr parent = FindWindow(null, "Formulaire inscription lecteur");
IntPtr child = FindWindowEx(parent, x, "Edit", null);
int q = SendMessage(child, WM_SETTEXT, IntPtr.Zero, "TesT");
// same thing with this://SendMessageUnicode(child, WM_SETTEXT, IntPtr.Zero, "TeSt");

登録フォームで得られるものは次のとおりです

編集:

ご回答ありがとうございます... xMRiの方法を使用しましたが、完全に機能します...

場合によっては、これを行うために使用されるコードを次に示します (動作しないコードがたくさんあるため)。

        [DllImport("user32.dll")]
        static extern int SetWindowLong(IntPtr hWnd, int nIndex, UInt32 dwNewLong);


        [DllImport("user32.dll")]
        public static extern IntPtr GetWindowLong(IntPtr hWnd, GetWindowLongParam nCmd);

        private const int WM_SETTEXT = 12;
        private const int GWL_STYLE = (-16);
        private const int ES_UPPERCASE = 0x0008;
        private const int ES_READONLY = 0x0800;
        private const int DTM_SETSYSTEMTIME = 0x1002;
        public enum GetWindowLongParam
    {
        GWL_WNDPROC   =      (-4),
        GWL_HINSTANCE =      (-6),
        GWL_HWNDPARENT=      (-8),
        GWL_STYLE     =      (-16),
        GWL_EXSTYLE   =      (-20),
        GWL_USERDATA  =      (-21),
        GWL_ID        =      (-12),
    }


                    IntPtr x = new IntPtr();
                    IntPtr parent = FindWindow(null, "Formulaire inscription lecteur");
                    IntPtr child = FindWindowEx(parent, x, "Edit", null);
                    //defining style: 1. Get the styles, and then delete uppercase and readonly
                    lExStyle = (long)GetWindowLong(child, GetWindowLongParam.GWL_STYLE);
                    lExStyle &= ~(ES_UPPERCASE);
                    lExStyle &= ~(ES_READONLY);
                    //set the new styles
                    SetWindowLong(child, GWL_STYLE, (uint)lExStyle);
                    //then send the message
                    SendMessage(child, WM_SETTEXT, IntPtr.Zero, string);

他のプログラムにデータを配置する唯一の問題は、「編集」にありますが、sysmonthcal32にリンクされています...読み取り専用スタイルをオーバーライドして、別の形式で送信しようとしました...何も機能していないようです...

他のすべての「編集」は、私のソフトウェアから送信された文字列で満たされています...

http://i.stack.imgur.com/dRaS8.png

何か案は?

どうもありがとう!

4

2 に答える 2

0

他のプログラムがテキストを大文字に変換しています。あなたの側からできることは何もありません。他のプログラムの開発者から助けを得る必要があります。

于 2013-10-30T10:14:42.577 に答える
0

Spy++ を使用します。ターゲット ウィンドウを見てください。ターゲット エディット コントロールのスタイルは ES_UPPERCASE であると確信しています。したがって、これは文字が変換される理由を示しています。

SetWindowLong(GWL_STYLE) を使用して汚いハックを行い、このスタイルを削除することができます。

于 2013-10-30T10:59:42.090 に答える