• 締切済み

キーボード処理 SDK

クライアントがサーバを操るツールを作っています。 何をしたいか↓ ・クライアントはサーバの画面上でメモ帳を開き「日本語」入力をする。 (クライアントからサーバの画面上で「(0~9)(a~z)」は打てます。) □サーバ側 case WM_KEYDOWN: //押されたときの処理   //送られてきたキーイベントの実行   keybd_event(cmsg.wParam,cmsg.wParam,0,0);   break; case WM_KEYUP: //離されたときの処理:解放処理   keybd_event(cmsg.wParam,cmsg.wParam,KEYEVENTF_KEYUP,0);   break; □クライアント //キーボード処理 case WM_KEYDOWN: 環境 WindowsXP MicrosoftVisualC++ SDK お願いします。

みんなの回答

回答No.1

「リモートデスクトップ」と同じようなことがやりたいという理解 で良いでしょうか。 んで、何がわからんのでしょう。

nero3657
質問者

補足

>「リモートデスクトップ」と同じようなことがやりたいという理解 >で良いでしょうか。 はい、そうです。 >んで、何がわからんのでしょう。 キーボードイベントで、クライアント側が「半角」を押したらサーバ側は「半角」を押したことにしたいのです。 ・cmsg.wParamはクライアントのキーイベントが格納されています。 ・cmsg.wParamは仮想キーが入っていると思います。 -サーバ側- WM_KEYDOWN: if(cmsg.wParam == 0xF3){   keybd_event(0xF3,0xF3,0,0);   MessageBox(NULL,"半角キーが押されました","確認",MB_OK); }else if(cmsg.wParam == 0xF4){   keybd_event(0xF4,0xF4,0,0);   MessageBox(NULL,"全角キーが押されました","確認",MB_OK); }break; 上のソースでは、cmsg.wParamのなかにASKIIIコードではなく仮想キーが格納されていると思うのでif文がうまく通りません。

関連するQ&A

  • 外部アプリ(コマンドプロンプト)の制御

    こんにちは。プログラミング初心者で申し訳ないのですが、調べてみてもどうしても分からない問題があり、ご質問させて頂きました。お手数をおかけしますがご回答頂ければ幸いです。 windowsアプリケーションにて外部のアプリを呼び出し、それを操作しようとした時に、私のような素人が思いつく方法としては、keybd_eventAPIなどでキーを送る、とかWM_LBUTTONDOWNなどのウィンドウメッセージを送る、くらいしか思いつかないのですが、それ以外に外部操作の方法はあるのでしょうか? 例えば、今私が作ろうとしているのは独自アプリよりコマンドプロンプトを呼び出し、事前に指定したいくつかのコマンドを実行する、といったものなのですが、CreateProcessにて起動し、コマンドプロンプトのハンドルを得たところまでは良かったのですが、そのハンドルを利用してどのようにコマンドを送れば良いのかがどうしても分かりませんでした。 「cd ../」というコマンドを送りたい場合、 Keybd_event(Byte('c'),0,0,0); Keybd_event(Byte('c'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('d'),0,0,0); Keybd_event(Byte('d'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte(' '),0,0,0); Keybd_event(Byte(' '),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('.'),0,0,0); Keybd_event(Byte('.'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('.'),0,0,0); Keybd_event(Byte('.'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('/'),0,0,0); Keybd_event(Byte('/'),0,KEYEVENTF_KEYUP,0); のようなやり方しか思いつかないのですが、他に良い方法はございませんでしょうか? 宜しければご指導して頂けますよう宜しくお願い致します。

  • WM_KEYDOWNでPrtScを捕まえる方法??

    ごく普通のウィンドウプロシージャでキーの判別を行っています 下記のように条件(1)が WM_KEYUP の際には(2)、(3)ともに検出します LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_KEYUP: ............ (1) switch(wp) { case VK_RETURN: { break; } ..... (2) case VK_SNAPSHOT: { break; } ..... (3) default: { break; } } break; } return; ところが条件(1)を WM_KEYDOWN に変更すると(2)の Enter は検出しますが、(3)の PrtSc を検出してくれません 質問1 なぜ PrtSc を WM_KEYDOWN では検出しないのですか? 質問2 WM_KEYUP WM_KEYDOWN のいずれか一方にしか反応しないキーはまだありますか? 質問3 どのようにしたら PrtSc の WM_KEYDOWN を捕まえることが出来ますか? 自分でも調べてみましたが、どうも判然と致しません 宜しくご指導のほどお願い申し上げます

  • VB6でWindows2003 Serveの画面ハードコピーを取るには

    VB6で画面のハードコピーを取るのに下記のような関数を作成して動作させています。 今回、windows 2003 Serverで初めて使用したのですが、エラーが出力されます。 Public Sub xxxxxx()  Dim OsVer As Single  Clipboard.Clear  OsVer = CreateObject("SysInfo.SYSINFO").OSVersion   If OsVer < 5 Then  '画面全体のスナップショットを取得する(Win98SE/Win95)    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_EXTENDEDKEY, 0)    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) Else    '画面全体のスナップショットを取得する(WinXP)    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0)    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)  End If End Sub エラーの内容は ErrNO=429 ActiveX コンポーネントはオブジェクトを作成できません。 と言うエラーなのですが、2003 serverではkeybd_eventの使い方がXp等と違うのでしょうか? 何処が悪いのかおわかりの方ご教示頂けないでしょうか? 宜しくお願いいたします。

  • ダイヤログボックス内のマウスイベントの処理

    WinXP + BCC でCのプログラムを作成しています。 ダイヤログボックス内のマウスイベントの処理で、ALTキーが押されている場合と押されていない場合で処理を変えたいのです。 alt_downという変数を用意してみましたがダメでした。 case WM_MOUSEMOVE:  if(alt_down == 1) {   ALTキーが押されているときの処理  } else {   ALTキーが押されていないときの処理  }  break; case WM_SYSKEYDOWN:  if(wParam == VK_MENU) alt_down=1;  break; case WM_SYSKEYUP:  if(wParam == VK_MENU) alt_down=0;  break;

  • TextOut( ) が動かない

    LRESULT CALLBACK WndProc( HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; switch(msg){ case WM_KEYDOWN:  if( wParam == VK_ESCAPE ){   hdc = BeginPaint(hWnd, &ps);   TextOut(hdc,0,0,str,strlen(str));   EndPaint(hWnd, &ps);  }  break; case WM_PAINT:  break; エスケープキーで文字表示をやりたいけど TextOut( ) が動作していないみたいでした。 switch(msg){ case WM_KEYDOWN:  if( wParam == VK_ESCAPE ){   hdc = BeginPaint(hWnd, &ps);   TextOut(hdc,0,0,str,strlen(str));   EndPaint(hWnd, &ps);  }  break; case WM_PAINT:  hdc = BeginPaint(hWnd, &ps);  TextOut(hdc,0,0,str,strlen(str));  EndPaint(hWnd, &ps);  break; とすると、常に文字が表示されたから、やっぱり case WM_KEYDOWN: の中の TextOut( ) が 動作していないんだと思いました。 TextOut( ) は case WM_PAINT: からのつながりが ある場合でないと実行されないんですか? ソースのおかしいところがあったら教えてください。

  • Ctrl+Vのキーストロークを合成したいのですが

    Ctrl+Vのキーストロークを合成して、クリップボードの内容を貼り付けたいと考えています。 いろいろ調べた結果、大体以下のように記述すればよいのではないかとおもったのですが記述に間違いがあるようです。(form上のText1内に張り付けることができません。)恐れ入りますが、何卒ご教授いただきたくお願いいたします。 Option Explicit Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _ ByVal bScan As Byte, _ ByVal dwFlags As Long, _ ByVal dwExtraInfo As Long) Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Const VK_CONTROL = &H11 Private Sub Command1_Click() Call keybd_event(VK_CONTROL, 0, 0, 0) Call keybd_event(Asc("V"), 0, 0, 0) Call keybd_event(Asc("V"), 0, KEYEVENTF_KEYUP, 0) Call keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0) End Sub ちなみに使用目的につきましては、form1上のWebBrowser1に開いた入力フォームの<input type="file" >に(JavaScriptでフォーカスを移したうえで)ファイルのパスを貼り付けることです。 <input type="file" >はvalueを指定できないようなので、色々考えた結果、上記のようにするしかないかと考えました。もしもほかによい方法があったら恐れ入りますがご教授いただけると大変ありがたいです。よろしくお願いします。

  • キィーボードをフックしません、何故ですか???

    パソコンを現在人間が実際に操作中であるか否かを判定しながら進めるアプリを作っています 簡易的にキィーボードを操作していれば操作中と判断します(マウス操作も含めますが話を簡単にするため今はキィーだけとします) グローバルフックでKEY_DOWNをフックする為に以下のDLL(主要部分のみ)を作りました キィーが押されるとMW_KEYDOWN_DLLというメッセージをアプリに送ります EXPORT LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam) { if(nCode == HC_ACTION) { CWPSTRUCT *pcwp = (CWPSTRUCT *)lParam; if(pcwp->message == WM_KEYDOWN) { SendMessage(g_hWnd, WM_KEYDOWN_DLL, pcwp->wParam, pcwp->lParam); ←(1) } } return (CallNextHookEx(g_hHook, nCode, wParam, lParam)); } MW_KEYDOWN_DLLメッセージを受けたアプリは操作中フラグを立てます(主要部分のみ) LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_KEYDOWN_DLL: ここで操作中フラグを立てます ←(2)  このフラグは一定時間後にタイマーが倒します break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return (0L); } 実行してみると(1)に来ません、当然(2)のフラグは立ちません WM_KEYDOWNの代わりにWM_CREATE、WM_CLOSEだときちんとフックします WM_CHAR、MW_KEYUPなどのキィーボード系のメッセージだとフックしません なぜでしょうか??? 多分きわめて初歩的な知識の欠如によるものでしょうが分かりません 宜しくご指導願います

  • Windows7-VB6でのアクティブウィンドウキャプチャ

    Windows7-VB6でのアクティブウィンドウキャプチャ お世話になります。 Private Declare Sub keybd_event Lib "User32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Const VK_LMENU = &HA4 Private Const VK_SNAPSHOT = &H2C Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Command1.SetFocus DoEvents Load form2 Clipboard.Clear keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY, 0 keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0 DoEvents keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 ※form2.picPrint.Picture = Clipboard.GetData() 上記コードはWinXPであれば問題なく動作するのですが Win7ではform2のピクチャボックスにイメージが貼り付けられません ※行にブレイクを入れて、一旦プログラムを停止し再開するとOKで その他にもALTキーの送信をしないでprtscrのみでも動作可能です。 win7-vb6でアクティブウィンドウのキャプチャを クリップボードを使用し、フォームのピクチャボックスに貼り付けることは 可能でしょうか

  • C/C++でIEの選択範囲を取得する方法

    C/C++で、IE上で範囲選択している場合に、別のアプリケーションからその選択範囲を取得する方法をおしえてください。 今は、IEにCTRL+Cを送って、クリップボード経由で取得する方法を検討しています。 以下のようなコードで、範囲選択をしているウィンドウのタイトルは取れているのですが、クリップボードへのコピーができていません、ハンドルが違うような気がするのですが... どうすればよろしいのでしょうか?? char buf[1000]; HWND hWndFore; /* フォアグラウンドウィンドウの取得 */ hWndFore = GetForegroundWindow(); /* ウィンドウタイトルの表示 */ GetWindowText(hWndFore, buf, 1000); //MessageBox(NULL, buf, "DoGetForegroundWindow", MB_OK); keybd_event(VK_CONTROL, 0, 0, 0); keybd_event('C', 0, 0, 0); keybd_event('C', 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); よろしくお願いいたします。

  • テキストボックスからフォーカス外す

     editBox = CreateWindow(   "EDIT",   "あああ",   SS_CENTER | WS_CHILD | WS_VISIBLE,   0,0,100,20,   hWnd,   NULL,   hInstance,   NULL); テキストボックスのフォーカスを外すにはどうしたら いいんですか? ESCキーでフォーカスを外そうと思ったら、 テキストボックスにフォーカスがあるせいで case WM_KEYDOWN が動作しません。 フォーカスを外すというソース自体も分かっていません。  case WM_KEYDOWN:   if( wParam == VK_ESCAPE )    ?  break;

専門家に質問してみよう