Отправить ключ возврата на панель формул Excel с помощью WinAPI - PullRequest
0 голосов
/ 05 июня 2019

Что я пытаюсь сделать:

Я пытаюсь скопировать текст в буфер обмена, а затем вставить в Excel, сохраняя при этом все форматирование.

Единственный способ остановить распространение текста по многим ячейкам в Excel и сохранить форматирование, например, маркеры и т. Д., - это скопировать его в буфер обмена и вставить непосредственно в панель формул.

Как я пытаюсь это сделать:

Я использую Win API для получения дескриптора строки формул.

Затем отправьте сообщение WM_PASTE в окно, чтобы вставить то, что находится в буфере обмена.

Затем отправка сообщения WM_SETFOCUS в окно, готовое для получения ключа возврата.

Затем отправка сообщения WM_KEYDOWN для ключа возврата.

Private Declare Function FindWindow _
    Lib "user32" _
    Alias "FindWindowA" _
    (ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long

Private Declare Function FindWindowEx _
    Lib "user32" _
    Alias "FindWindowExA" _
    (ByVal hwndParent As Long, _
    ByVal hwndChildAfter As Long, _
    ByVal lpszClass As String, _
    ByVal lpszWindow 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, _
    ByRef lParam As Any) _
    As Long

Declare Function PostMessage _
    Lib "user32" _
    Alias "PostMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lParam As Any) As Long

Declare Function SetForegroundWindow _
    Lib "user32" _
    (ByVal hWnd As Long) As Long

Private Const WM_CUT As Long = &H300
Private Const WM_COPY As Long = &H301
Private Const WM_PASTE As Long = &H302
Private Const WM_CLEAR As Long = &H303
Private Const WM_UNDO As Long = &H304
Private Const WM_KEYDOWN  As Long = &H100
Private Const WM_KEYUP  As Long = &H101
Private Const VK_F5  As Long = &H74
Private Const VK_RETURN  As Long = &HD
Private Const WM_CHAR  As Long = &H102
Private Const WM_SETFOCUS  As Long = &H7
Private Const WM_KILLFOCUS  As Long = &H8
Private Const WM_IME_SETCONTEXT  As Long = &H281

Public Sub pasteClipboard()
    hwndMain = Application.hWnd: Debug.Print hwndMain
    hwndFormulaBar = FindWindowEx(Application.hWnd, ByVal 0&, "EXCEL<", vbNullString): Debug.Print hwndFormulaBar
    hwndDesk = FindWindowEx(Application.hWnd, ByVal 0&, "XLDESK", vbNullString): Debug.Print hwndDesk
    hwndSheet = FindWindowEx(hwndDesk, ByVal 0&, "EXCEL7", vbNullString): Debug.Print hwndSheet

    RetVal = SendMessage(hwndFormulaBar, WM_PASTE, 0, ByVal 0)
    Debug.Print SendMessage(hwndFormulaBar, WM_SETFOCUS, 0, 0)
    Debug.Print SendMessage(hwndFormulaBar, WM_IME_SETCONTEXT, &H0, &H0)
    Debug.Print SendMessage(hwndFormulaBar, WM_KEYDOWN, VK_RETURN, &H0)
End Sub

Проблема:

Это все работает до тех пор, пока я не отправлю ключ возврата, чтобы закончить редактирование ячейки, что я и хотел бы сделать. Вместо этого он вставляет возврат каретки в текстовое поле, что имеет большой смысл, но не тот результат, который я хотел.

Я посмотрел на окно формул с помощью Spy ++ и наблюдал, что происходит, когда я что-то печатаю в окне и нажимаю клавишу возврата - при нажатии клавиши возврата он завершает редактирование ячейки.

enter image description here

Единственные две команды, которые я не использую, которые отображаются в Spy ++, это WM_IME_SETCONTEXT и WM_IME_NOTIFY, но, честно говоря, я не уверен, что эти две команды делают.

Я попытался использовать WM_IME_SETCONTEXT выше, думая, что мне, возможно, придется изменить его перед отправкой ключа возврата, но результаты не изменились.

Какие-нибудь решения?

Если кто-то может указать мне правильное направление, как отправить сообщение, которое завершит редактирование ячейки (это не должен быть ключ возврата, это была только моя первая мысль), это было бы здорово.

Большое спасибо

1 Ответ

0 голосов
/ 06 июня 2019

Спасибо за все комментарии.

@ Рита Хан - MSFT Приложение.SendKeys работало до тех пор, пока фокусом было не окно VBE, а это здорово!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...