アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のコードをExcel2013で実行するとメモ帳でスペースキーが無限に押されます。
そしてフリーズするのですが、WM_CHARって押しっぱなしなんですか?
解除するにはどうしたろいいのでしょう?いや、どこで調べたら答えが見つかりますか?

Option Explicit
'クラス名、キャプションから子ウィンドウのハンドルを取得
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
(ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
ByVal lpClassName As String, ByVal lpWindowName As String) As Long
' ウィンドウにメッセージを送る関数の宣言
Private Declare Function SendMessage Lib "user32.dll" _
Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
' ウィンドウにメッセージを送る関数の宣言
Private Declare Function SendMessageAny Lib "user32.dll" _
Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Any) As Long

Public Const WM_IME_CHAR = &H286
Public Const WM_SETTEXT = &HC
Public Const WM_CHAR = &H102
Private Const WM_COPY = &H301
Private Const WM_CUT = &H300
Private Const WM_PASTE = &H302
Private Const WM_UNDO = &H304
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const VK_RETURN = &HD
Private Const VK_MENU = &H12
Private Const VK_SPACE = &H20

Sub TEST()
Dim lnghWnd As Long 'トップレベル(親)のウィンドウハンドル
Dim lnghWndTarget As Long 'ターゲット(子)のウィンドウハンドル
Dim lngRc As Long 'APIの返却値

' メモ帳を起動
lngRc = Shell(Environ("WINDIR") & "\NOTEPAD.EXE", vbNormalFocus) '起動
Sleep 100 '0.1秒待つ(起動完了)

' ターゲットウィンドウのハンドルを取得
lnghWnd = FindWindowEx(0, 0, "Notepad", "無題 - メモ帳") '「メモ帳」のウィンドウハンドル
lnghWndTarget = FindWindowEx(lnghWnd, 0, "Edit", "") '子ウィンドウのEdit

' 送信
Dim strDtSrc As String
Dim strDt As String

Dim lngDt As Long
Dim i As Long

Cells(1, 1) = 1
Cells(1, 1).Copy

lngRc = SendMessage(lnghWndTarget, WM_PASTE, 0, 0)
lngRc = SendMessage(lnghWndTarget, WM_CHAR, VK_SPACE , 0)
Sleep 100
DoEvents

End Sub

A 回答 (2件)

キーリピートするのは初耳ですが、「SendMessage」でなく、「PostMessage」にするとか。

    • good
    • 0

こんばんは。


SendMessage で何をされようとしているか分かりませんが、解除と言われても、

>lngRc = SendMessage(lnghWndTarget, WM_CHAR, VK_SPACE , 0)
WM_CHARで、VK_SPACE のキーコードを送るよりも、

lngRc = SendMessage(lnghWndTarget, WM_KEYDOWN, VK_SPACE, 0)
lngRc = SendMessage(lnghWndTarget, WM_KEYUP, VK_SPACE, 0)

とするか、
実際に、
PostMessage lnghWndTarget, WM_CHAR, Asc(" "), 0&

のどちらかのほうがよいのでは?
    • good
    • 0
この回答へのお礼

おっしゃる通りです。しかし、どのキーでも無限ループするんです。
情報を探しているとみなさん普通に
SendMessage(hWnd, WM_CHAR, ????? , 0)
出来ているみたいなので、なぜなのか疑問なのです。

お礼日時:2018/12/25 01:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています