С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259

Переключить раскладку клавиатуры в чужом окне

08.11.2013, 14:28. Показов 3774. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Переключить раскладку клавиатуры в чужом окне на определенную не просто на любую, а именно на русскую или английскую какую укажу.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.11.2013, 14:28
Ответы с готовыми решениями:

Нажать кнопку в чужом окне
Есть программа Steam нужно в ней нажать на кнопку "Создать новый аккаунт" Пробовал разные способы... И еще условие таково что сам Steam...

Поиск текста в чужом окне (FindWindow/EnumChildWindows)
Здравствуйте. 1. Есть программа UnderC, интерпретатор запускается командной строкой ucw.exe task.cpp 2. Результат выполнения выглядит...

узнать раскладку клавиатуры
подскажите как узнать раскладку клавиатуры если моя программа не активна(свернута, в трее я делаю вот так, но оно работает только...

9
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
08.11.2013, 16:13
Попробуй
PostMessage(hwnd, 0x0C09, 0, 0) - на англ.
PostMessage(hwnd, 0x0419, 0, 0) - на рус.
hwnd - хэндл окна
0
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
08.11.2013, 16:21  [ТС]
Цитата Сообщение от gunslier Посмотреть сообщение
Попробуй
PostMessage(hwnd, 0x0C09, 0, 0) - на англ.
PostMessage(hwnd, 0x0419, 0, 0) - на рус.
hwnd - хэндл окна
Не работает.
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
08.11.2013, 16:49
PostMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, INPUTLANGCHANGE_SYSCHARSET, 0x419) // рус.; 0x409 - англ.
1
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
08.11.2013, 16:54  [ТС]
Цитата Сообщение от gunslier Посмотреть сообщение
PostMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, INPUTLANGCHANGE_SYSCHARSET, 0x419) // рус.; 0x409 - англ.
Все работает отлично!
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
18.12.2021, 06:00
Цитата Сообщение от gunslinger Посмотреть сообщение
PostMessage
может посылать сообщения в чужие окна?
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
18.12.2021, 10:58
Теоретически да (включая аналог SendMessage). На практике зависит от стороннего приложения (может ли оно, включая его компоненты, принимать сообщения). И смотря что ты имеешь в виду под сообщениями.
Есть "виндовые сообщения", которые можно понимать как "команды".
Если же подразумеваются буквально сообщения (текстовые), то их нужно отправлять в компоненты окна, которые могут содержать собственно текст.

Ниже примеры двух моих старых программ, работоспособность которых на данных момент может быть ограничена / отсутствовать полностью (но раньше работали).

1)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
HWND NextWindowElement(HWND h, LPCTSTR fasdClass, LPCTSTR fasdWindow, int level)
{
  HWND h2 = NULL;
  for(int i = 0; i < level; i++)
  {
    h2 = FindWindowEx(h, h2, fasdClass, fasdWindow);
  }
  return h2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (CheckBox3->Checked)
    Form1->FormStyle = fsStayOnTop;
  else
    Form1->FormStyle = fsNormal;    
 
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
 
  HWND hWnd2 = NextWindowElement(hWnd, "Static", NULL, 1);
 
  AnsiString temp;
  char caption[100];
  if (IsWindow(hWnd2))
  {
    SendMessage(hWnd2, WM_GETTEXT, sizeof(caption), (LPARAM)caption);
    Form1->Caption = "Ban Hammer - ";
    temp = caption;
    Form1->Caption = Form1->Caption + Trim(temp);
 
    for (int i = 2; i <= 3; i++)
    {
      HWND hWnd0 = NextWindowElement(NULL, "UIHOST", NULL, i);  // 2 or 3
      if (IsWindow(hWnd0))
      {
        SendMessage(hWnd0, WM_GETTEXT, sizeof(caption), (LPARAM)caption);
        temp = caption;
        if (temp.Pos(" - ") != -1)
          Form1->Caption = Form1->Caption + MidStr(temp, temp.Pos("-")-1, temp.Length()-temp.Pos("-")+2);
      }
    }
  }
  else
    Form1->Caption = "Ban Hammer";
 
  hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 3);
  HWND hWnd3 = NextWindowElement(hWnd2, "RichEdit20W", NULL, 2);
 
  hWnd3 = NextWindowElement(hWnd2, "RichEdit20W", NULL, 1);
  char chat[1000000]; // 32767
  if (IsWindow(hWnd3))
  {
    SendMessage(hWnd3, WM_GETTEXT, sizeof(chat), (LPARAM)chat);
    RichEdit1->Text = chat;
/*  EDITSTREAM es;
    SendMessage(hWnd3, EM_STREAMOUT, SF_RTF, (LPARAM)&es);
    hWnd = FindWindow("TForm", NULL);
    hWnd2 = NextWindowElement(hWnd, "TRichEdit", NULL, 1);
    SendMessage(hWnd2, EM_STREAMIN, SF_RTF, (LPARAM)&es);
*/  
    Label2->Caption = RichEdit1->GetTextLen();
    Label2->Caption = Label2->Caption + " байт";
    if (CheckBox1->Checked)
      SendMessage(RichEdit1->Handle, WM_VSCROLL, SB_BOTTOM, 0);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Button1->Click(); 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Button2->Caption="Отправить\nсообщение";
  long st=GetWindowLong(Button2->Handle, GWL_STYLE); // получаем стиль окна кнопки
  st|=BS_MULTILINE;                                  // добавляем возможность мультилайна
  SetWindowLong(Button2->Handle, GWL_STYLE, st);     // устанавливаем стиль окна кнопки
 
  char szPath[MAX_PATH];
  GetModuleFileName(NULL, szPath, MAX_PATH);
  AnsiString options = ExtractFilePath(szPath) + "banlist.txt";
  if (FileExists(options))
    ValueListEditor1->Strings->LoadFromFile(options);
  if ((Trim(ValueListEditor1->Keys[1]) != "") && (ValueListEditor1->RowCount > 1))
  {
    Button4->Enabled = 1;
    Button6->Enabled = 1;
    Button5->Enabled = 1;
  }
  Button4->OnMouseEnter(Button4);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 3);
  HWND hWnd3 = NextWindowElement(hWnd2, "RichEdit20W", NULL, 2);
 
  char *text = Memo1->Text.c_str();
  SendMessage(hWnd3, WM_SETTEXT, 0, (LPARAM)text);
  Memo1->Text = "";
 
  hWnd3 = NextWindowElement(hWnd2, "Button", NULL, 35);
  SendMessage(hWnd3, WM_LBUTTONDOWN, 0, 0);
  SendMessage(hWnd3, WM_LBUTTONUP, 0, 0);
//  отправка сообщения
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  int temp=0;
  if ((Trim(LabeledEdit1->Text)!="") && TryStrToInt(LabeledEdit2->Text, temp) && (temp>0))
  {
    ValueListEditor1->InsertRow(Trim(LabeledEdit1->Text), Trim(LabeledEdit2->Text), 1);
    ValueListEditor1->Row = ValueListEditor1->RowCount-1;
    LabeledEdit1->Text = ""; //LabeledEdit2->Text = "";
    if (!Button4->Enabled)
    {
      Button4->Enabled = 1;
      Button6->Enabled = 1;
      Button5->Enabled = 1;   
    }
  }
  LabeledEdit1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  if (ValueListEditor1->RowCount==2)
  {
    Button4->Enabled = 0;
    Button6->Enabled = 0;
    Button5->Enabled = 0;
  }
  ValueListEditor1->DeleteRow(ValueListEditor1->Row);
  Button4->OnMouseEnter(Button4);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4MouseEnter(TObject *Sender)
{
  Button4->Hint = ValueListEditor1->Keys[ValueListEditor1->Row];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
  if (Button4->Enabled)
  {
    for (int i = 1; i < ValueListEditor1->RowCount; i++)
    {
      Memo1->Text = "/ban " + ValueListEditor1->Keys[i] + " " + ValueListEditor1->Strings->ValueFromIndex[i-1];
      Button2->Click();
      if (i<ValueListEditor1->RowCount-1)
        SleepEx(1100, 0);
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
  for (int i = ValueListEditor1->RowCount-1; i > 0; i--)
    Button4->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LabeledEdit2KeyPress(TObject *Sender, char &Key)
{
  if (Key == VK_RETURN)
    Button3->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LabeledEdit1KeyPress(TObject *Sender, char &Key)
{
  if (Key == VK_RETURN)
    Button3->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
  if (Key == VK_RETURN)
    Button2->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
  POINT pt;
  GetCursorPos(&pt);
  Form1->PopupMenu1->Popup(pt.x, pt.y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pingstat1Click(TObject *Sender)
{
  Memo1->Text = "/pingstat";
  Button2->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::publicip1Click(TObject *Sender)
{
  Memo1->Text = "/publicip";
  Button2->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::privateport1Click(TObject *Sender)
{
  Memo1->Text = "/privateport";
  Button2->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::start1Click(TObject *Sender)
{
  Memo1->Text = "/start";
  Button2->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
//  if (Form1->FormStyle == fsStayOnTop)
  Form1->WindowState = wsMinimized;
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 3);
  HWND hWnd3 = NextWindowElement(hWnd2, "Button", NULL, 29);
  SendMessage(hWnd3, WM_LBUTTONDOWN, 0, 0);
  SendMessage(hWnd3, WM_LBUTTONUP, 0, 0);
//  сохранить чат
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button9Click(TObject *Sender)
{
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 3);
  HWND hWnd3 = NextWindowElement(hWnd2, "Button", NULL, 28);
  SendMessage(hWnd3, WM_LBUTTONDOWN, 0, 0);
  SendMessage(hWnd3, WM_LBUTTONUP, 0, 0);
//  очистить чат
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button10Click(TObject *Sender)
{
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 3);
  HWND hWnd3 = NextWindowElement(hWnd2, "Button", NULL, 30);
  SendMessage(hWnd3, WM_LBUTTONDOWN, 0, 0);
  SendMessage(hWnd3, WM_LBUTTONUP, 0, 0);
//  сменить цвет
  if (RichEdit1->Color == clWhite)
  {
    RichEdit1->Color = clBlack;
    Memo1->Color = clBlack;
    RichEdit1->Font->Color = clWhite;
    Memo1->Font->Color = clWhite;
  }
  else
  {
    RichEdit1->Color = clWhite;
    Memo1->Color = clWhite;
    RichEdit1->Font->Color = clBlack;
    Memo1->Font->Color = clBlack;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button11Click(TObject *Sender)
{
  Form1->WindowState = wsMinimized;
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 3);
  HWND hWnd3 = NextWindowElement(hWnd2, "Button", NULL, 32);
  SendMessage(hWnd3, WM_LBUTTONDOWN, 0, 0);
  SendMessage(hWnd3, WM_LBUTTONUP, 0, 0);
//  забанить на хосте
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button12Click(TObject *Sender)
{
  Form1->WindowState = wsMinimized;
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 3);
  HWND hWnd3 = NextWindowElement(hWnd2, "Button", NULL, 31);
  SendMessage(hWnd3, WM_LBUTTONDOWN, 0, 0);
  SendMessage(hWnd3, WM_LBUTTONUP, 0, 0);
//  выйти из комнаты
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button13Click(TObject *Sender)
{
  Form1->WindowState = wsMinimized;
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 3);
  HWND hWnd3 = NextWindowElement(hWnd2, "Button", NULL, 33);
  SendMessage(hWnd3, WM_LBUTTONDOWN, 0, 0);
  SendMessage(hWnd3, WM_LBUTTONUP, 0, 0);
//  настройки
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button14Click(TObject *Sender)
{
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 3);
  HWND hWnd3 = NextWindowElement(hWnd2, "Button", NULL, 34);
  SendMessage(hWnd3, WM_LBUTTONDOWN, 0, 0);
  SendMessage(hWnd3, WM_LBUTTONUP, 0, 0);
//  пуск
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  char szPath[MAX_PATH];
  GetModuleFileName(NULL, szPath, MAX_PATH);
  AnsiString options = ExtractFilePath(szPath) + "banlist.txt";
  if (FileExists(options))
    DeleteFile(options);
  if (Button4->Enabled)
    ValueListEditor1->Strings->SaveToFile(options);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GetModListClick(TObject *Sender)
{
  AnsiString mods = "";
  if (Trim(ModList->Text) == "")
  {
  ModList->Text = UTF8Decode(HTTP->Get("http://forum.sng.garena.com/forumdisplay.php?f=81"));
  int num = 0;
  for (int I = 0; I < ModList->Lines->Count; I++)
  {
    int PosReturn = ModList->Lines->Strings[I].Pos(">High Level Room");
    if (PosReturn)
    {
      mods = Trim(mods);
      num = num + 1;
      if (num > 1)
        mods = mods + "\n--------------------\n";
      mods = mods + "High Level Room " + num + "\n";
      for (int J = 1; J < ModList->Lines->Strings[I+8].Length(); J++)
        if (MidStr(ModList->Lines->Strings[I+8], J, 3) == ";\">")
          for (int K = J+1; K < ModList->Lines->Strings[I+8].Length(); K++)
            if (MidStr(ModList->Lines->Strings[I+8], K, 7) == "</span>")
            {
              mods = mods + MidStr(ModList->Lines->Strings[I+8], J+3, K-J-3) + "  ";
              break;
            }
    }
  }
  ModList->Text = mods;
  }
  else
    mods = ModList->Text;
  MessageBox(FindWindow("TForm1", NULL), Trim(mods).c_str(), "Модераторы Russia DotA High Level Rooms", MB_OK);
}
//---------------------------------------------------------------------------
2)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
unsigned int HotKey;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  HotKey = GlobalAddAtom(L"HotKey");
  RegisterHotKey(NULL, HotKey, MOD_CONTROL, int('V'));
}
//---------------------------------------------------------------------------
HWND NextWindowElement(HWND h, LPCTSTR fasdClass, LPCTSTR fasdWindow, int level)
{
  HWND h2 = NULL;
  for(int i = 0; i < level; i++)
    h2 = FindWindowEx(h, h2, fasdClass, fasdWindow);
  return h2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  bool is_chat_found = 0;
  HWND hWnd = GetForegroundWindow(), hWnd2, hWnd3, hWnd4;
 
  if (hWnd == FindWindow(L"PokerStarsTableFrameClass", NULL))
  {
    hWnd2 = NextWindowElement(hWnd, L"PokerStarsTablePanelWnd", NULL, 1);
    hWnd3 = NextWindowElement(hWnd2, L"WinInplaceDialogEngineClass", NULL, 1);
    hWnd4 = NextWindowElement(hWnd3, L"PokerStarsChatEditorClass", NULL, 1);
    is_chat_found = 1;
  }
  else if (hWnd == FindWindow(L"PokerStarsTableHelperFrameClass", NULL))
  {
    hWnd2 = NextWindowElement(hWnd, L"PokerStarsTableHelperControlClass", NULL, 1);
    hWnd3 = NextWindowElement(hWnd2, L"PokerStarsTableHelperPaneClass", NULL, 1);
    hWnd4 = NextWindowElement(hWnd3, L"PokerStarsChatEditorClass", NULL, 1);
    is_chat_found = 1;
  }
 
  if (is_chat_found && Clipboard()->HasFormat(CF_TEXT))
  {
    wchar_t *text = String(Clipboard()->AsText).c_str();
    SendMessage(hWnd4, WM_SETTEXT, 0, (LPARAM)text);
    SendMessage(hWnd4, WM_KEYDOWN, VK_END, 0);
  }
 
  // вставка картинки не работает
  if(is_chat_found && Clipboard()->HasFormat(CF_BITMAP))
  {
    HANDLE ghBmp = HANDLE(Clipboard()->GetAsHandle(CF_BITMAP));
    SendMessage(hWnd4, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)ghBmp);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  UnregisterHotKey(NULL, HotKey);
  GlobalDeleteAtom(HotKey);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
  if (Msg.message == WM_HOTKEY)
    if (Msg.wParam == HotKey)
      Button1->Click();
}
//---------------------------------------------------------------------------
P.S.: пока писал сообщение, мой любимый "огнелис" снова вылетел. Пришлось заново превращать мысли в текст.
За это время вспомнил, что у меня есть пример, когда отправка сообщений (команд) не работает (о чем упоминал выше). Это случай наличия "нарисованных" ("графических" / "нестандартных" ?) компонентов, с которыми нельзя работать как с обычными элементами интерфейса (с помощью SendMessage / PostMessage).



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
unsigned int HotKey;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  HotKey = GlobalAddAtom(L"HotKey");
  RegisterHotKey(NULL, HotKey, MOD_CONTROL, int('C'));
}
//---------------------------------------------------------------------------
HWND NextWindowElement(HWND h, LPCTSTR fasdClass, LPCTSTR fasdWindow, int level)
{
  HWND h2 = NULL;
  for(int i = 0; i < level; i++)
    h2 = FindWindowEx(h, h2, fasdClass, fasdWindow);
  return h2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  bool is_results_found = 0;
  HWND hWnd = GetForegroundWindow(), hWnd2;
 
  if (hWnd == FindWindow(L"#32770", NULL))
  {
    hWnd2 = NextWindowElement(hWnd, L"PokerStarsListClass", NULL, 9);
    if (IsWindow(hWnd2))
      is_results_found = 1;
  }
 
  if (is_results_found)
  {
    wchar_t text[100000];
    SendMessage(hWnd2, WM_GETTEXT, sizeof(text), (LPARAM)text);
    Memo->Text = text;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  UnregisterHotKey(NULL, HotKey);
  GlobalDeleteAtom(HotKey);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
  if (Msg.message == WM_HOTKEY)
    if (Msg.wParam == HotKey)
      Button1->Click();
}
//---------------------------------------------------------------------------
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
18.12.2021, 20:29
Цитата Сообщение от gunslinger Посмотреть сообщение
Теоретически да
меня интересует сообщения формата нажатия кнопки на клавиатуре или на мыши. Чем являются такие сообщения командами? В инструкции написано что прежде чем послать сообщение нужно активировать окно и переключить туда фокус клавиатуры а затем уже посылаются сообщения или команды. Спрашиваю здесь Можно ли посылать сообщения окнам которые принадлежат чужим процессам?, Как правильно активировать окно и переключить фокус клавиатуры на него в чужом потоке с использованием оконных сообщений, Нужно ли активировать чужое окно если нужно послать туда сообщение? . Я так понимаю что сделать это не возможно. Можете отписаться в одной из этих тем если что-то реально знаете, т.к. в инструкции даже нет конкретных примеров по задачи которые можно проверить.
Миниатюры
Переключить раскладку клавиатуры в чужом окне  
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
18.12.2021, 21:27
Касаемо мыши не скажу, а насчет клавиатуры - ниже скриншот программы и код, суть работы которого следующая: когда запущена игра Warcraft 3 и ее окно на переднем плане, игре отправляются нажатия комбинации клавиш Ctrl + C с указанным интервалом, если эмуляция включена (это позволяет видеть выделение игроком юнитов для простой проверки на использование мапхака).
Можно считать это командами.



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cspin"
#pragma link "cspin"
#pragma resource "*.dfm"
TForm1 *Form1;
unsigned int F5;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Button1->Click();
  F5 = GlobalAddAtom("F5CheckAllocationsHotKey");
  RegisterHotKey(NULL, F5, 0, VK_F5);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int act;
if (GetWindowThreadProcessId(GetForegroundWindow(), NULL) == GetWindowThreadProcessId(FindWindow(NULL, "Warcraft III"), NULL))
  act = 1;
else
  act = 0;
if (act == 1)
  {
    keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0);
    //нажали и удерживаем Ctrl
    keybd_event(67, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    keybd_event(67, 0, KEYEVENTF_EXTENDEDKEY, 0);
    //нажимаем клавишу C
    //отпускаем клавиши
    keybd_event(67, 0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
    keybd_event(VK_CONTROL, 0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Button1->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)
{
  Timer1->Interval = CSpinEdit1->Value;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  if (Button2->Caption == "Отключить")
  {
    Button2->Caption = "Включить";
    Timer1->Enabled = 0;
    Label4->Caption = "Эмуляция отключена";
    Label4->Font->Color = clRed;
  }
  else
  {
    Button2->Caption = "Отключить";
    Timer1->Enabled = 1;
    Label4->Caption = "Эмуляция включена";
    Label4->Font->Color = clGreen;  
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(GetWindowThreadProcessId(FindWindow(NULL, "Warcraft III"), NULL) > 0)
  Label1->Caption = "Статус игры: Warcraft III запущен.";
else
  Label1->Caption = "Статус игры: Warcraft III не запущен.";
if (GetWindowThreadProcessId(GetForegroundWindow(), NULL) == GetWindowThreadProcessId(FindWindow(NULL, "Warcraft III"), NULL))
  Label2->Caption = "Статус окна: игра активна.";
else
  Label2->Caption = "Статус окна: игра не активна.";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
  Button3->Click(); 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  UnregisterHotKey(NULL, F5);
  GlobalDeleteAtom(F5);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_HOTKEY)
  if (Msg.wParam == F5)
    Button2->Click();
}
//---------------------------------------------------------------------------
Как уже я сказал, окно должно быть на переднем плане. Как принудительно его туда поместить - сказать не могу, возможно, сначала нужно найти хэндл окна и отправить ему нужное сообщение, если оно есть (это в том числе ответ на твою вторую тему).
Ответ на первую тему - да, можно.
Ответ на третью тему - про "активацию" окна уже сказал, про раскладку - в этой теме выше.
И обрати внимание внимание, что ты пишешь в разделе WinAPI, а тут билдер.
И еще - я давно делал программу, через которую (насколько помню) можно было слать сообщения свернутому приложению. Подробности уже подзабыл.
Но код примерно такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
HWND NextWindowElement(HWND h, LPCTSTR fasdClass, LPCTSTR fasdWindow, int level)
{
  HWND h2 = NULL;
  for(int i = 0; i < level; i++)
  {
    h2 = FindWindowEx(h, h2, fasdClass, fasdWindow);
  }
  return h2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::timerTimer(TObject *Sender)
{
  Form1->Caption = "AutoGarena - пытаюсь войти...";
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 2);
  HWND hWnd3 = NextWindowElement(hWnd2, "WTL_LISTVIEW", NULL, 1);  // определяем хэндл списка ListView
 
  PostMessage(hWnd3, WM_COMMAND, 4235, 0);  // 0x108B, выбор пункта меню "войти"
//  вход в комнату
}
//---------------------------------------------------------------------------
void __fastcall TForm1::timer2Timer(TObject *Sender)
{
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWndR = NextWindowElement(hWnd, "Button", NULL, 9);  // вкладка "Комната"
 
  for (int i = 1; i < 5; i++)
  {
    HWND hWnd4 = NextWindowElement(NULL, "SkinDialog", NULL, i);
    HWND hWnd5 = NextWindowElement(hWnd4, "Button", "OK", 1);
    PostMessage(hWnd4, WM_COMMAND, 1, (LPARAM)hWnd5);
 
    hWnd5 = NextWindowElement(hWnd4, "Button", "", 1);
    PostMessage(hWnd4, WM_COMMAND, 2045, (LPARAM)hWnd5);
  }
 
  if (IsWindowEnabled(hWndR) != 0)
  {
    Form1->Caption = "AutoGarena - мы в комнате!";
    timer3->Interval = 100;
    timer3->Enabled = 1;
  }
//  закрытие всех лишних окон с сообщениями
}
//---------------------------------------------------------------------------
void __fastcall TForm1::timer3Timer(TObject *Sender)
{
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWndR = NextWindowElement(hWnd, "Button", NULL, 9);  // вкладка "Комната"
  if (IsWindowEnabled(hWndR) != 0)
  {
    timer->Enabled = 0;
    timer2->Enabled = 0;
    PlaySound("MYWAV", NULL, SND_SYNC | SND_RESOURCE);
  }
  timer3->Enabled = 0;
// обработка случая, когда перед входом находимся в комнате
}
//---------------------------------------------------------------------------
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
18.12.2021, 22:44
Цитата Сообщение от gunslinger Посмотреть сообщение
keybd_event
Используется как вы и написали если окно на переднем плане. А моём случае идёт программная отправка сообщения в окно. Интересно это всё конечно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2021, 22:44
Помогаю со студенческими работами здесь

Автоматически сменить раскладку клавиатуры
Доброго дня!. Подскажите почему у меня не получается сменить автоматически раскладку клавиатуры. с++ Builder XE4 void...

Эмуляция нажатия клавиши клавиатуры в чужом приложении
Добрый день. Вот, для примера, нажать F1 в &quot;Калькуляторе&quot;, пишу: HWND Wnd=FindWindow(NULL,L&quot;Калькулятор Плюс&quot;); ...

Перехват и имитация нажатия клавиши клавиатуры в чужом приложении
Есть тема... Нужно, чтобы при нажатии на кнопку, например f1 . У меня последовательно с разными задержками нажимались кнопки: ESC ...

Перехват клавиатуры в окне блокировки/логина
Здравствуйте. Подскажите как сделать так, чтоб в окне блокировки/логина Windows можно было использовать горячие кнопки своей...

Переключить раскладку клавиатуры в Qt4
Здравствуйте. Есть простая програмка на Qt4 - словарик/записная книжка, с двумя QTextEdit. Нужно сделать так, чтобы если фокус на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru