2011-01-04 2 views
2

Мы можем установить окно текст:Как сохранить свой текст в окне (Win32)

BOOL WINAPI SetWindowText(
    __in  HWND hWnd, 
    __in_opt LPCTSTR lpString 
); 

и этот текст окна другого приложения

int WINAPI GetWindowText(
    __in HWND hWnd, 
    __out LPTSTR lpString, 
    __in int nMaxCount 
); 

Я не хочу менять свои формы но я хочу сохранить пользовательский текст в окне и получить этот текст другим экземпляром той же программы. Как я могу это достичь?

ответ

3

Простой способ сделать это:

  1. определить свой собственный WM_APP message, который Экземпляр вашего приложения будет использовать, чтобы сказать окно экземпляра Б «пришлите мне ваш личный текст».
  2. Когда экземпляр B получает это сообщение, он может использовать WM_COPYDATA, чтобы отправить ответ в окно экземпляра A.
  3. Экземпляр A получает данные от WM_COPYDATA и делает то, что ему нужно.

Эта схема позволяет отправлять произвольные данные (при условии, что они не содержат указателей) при условии, что данные достаточно малы (скажем, несколько КБ вершин). Это также легко реализовать. Недостатком этого является контроль безопасности, поэтому, если вам нужно предотвратить появление плохих парней из этих данных из вашего приложения, вам нужно будет использовать что-то более тяжелое.

+0

+1 использование WM_COPYDATA, предполагая, что проблема с безопасностью не является проблемой, хорошо, поскольку она позволяет избежать маршаллинга, о котором я упоминал в своем ответе. –

1

Я не уверен, но я думаю, вам придется открыть другой процесс, используя openProcess, а затем использовать некоторую функцию на дескрипторе процесса, чтобы получить текст заголовка. После того, как у вас есть текст, вы можете очень хорошо использовать его в своем приложении. Для получения процесса, если требуемого процесса, вы можете использовать EnumProcess, вот полный пример: http://msdn.microsoft.com/en-us/library/ms686701%28v=vs.85%29.aspx

1

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

+0

Незначительный nitpick: 'WM_USER' предназначен для сообщений, специфичных для класса окна; 'WM_APP' предназначен для сообщений« всего приложения ». Хотя, конечно, вы можете использовать все, что хотите, без проблем почти все время. – Jon

+0

@ Спасибо, что указали, что я не знаком с этим различием, я обновил свой ответ. –