Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2009, 18:33   #1
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
Смущение Работа с чужим окном определенного заголовка

Всем доброго времени суток!

Хотел узнать, можно ли как то обращаться к окну, учитываю его заголовок, т.е. например, если заголовок окна "Мой компьютер", то тогда обращаемся к этому окну, а если какой то другой, то нет.

Вот такой код нашол в интернете, там роде это как раз реализовано, но я не могу понять как это можно реализовать в своей программе, мне нужно сделать примерно так:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  если заголовок окна "Мой коипьютер", то
  ...
end;
Если кто-нибудь понял что именно я хочу, то пожалуйста подскажите как это реализовать.

Код:
unit Unit1; 

interface 

uses 
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
      Dialogs, StdCtrls, ComCtrls, Menus; 

type 
      TForm1 = class(TForm) 
        HotKey1: THotKey; 
        ComboBox1: TComboBox; 
        Edit1: TEdit; 
        Button2: TButton; 
        Button3: TButton; 
        ListBox1: TListBox; 
        procedure Button2Click(Sender: TObject); 
        procedure Button3Click(Sender: TObject); 
        procedure ComboBox1Click(Sender: TObject); 
        procedure FormClose(Sender: TObject; var Action: TCloseAction); 
      private 

                  Hotkey_id1,Hotkey_id2,Hotkey_id3,Hotkey_id4,Hotkey_id5, 
                  Hotkey_id6,Hotkey_id7,Hotkey_id 8,H otk ey_id9,Hotkey_id10, 
                  Hotkey_id11,Hotkey_id12 : Integer; 

        procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; 
        procedure ShortCutToHotKey(HotKey: TShortCut; var Key : Word; var Modifiers: Uint); 
            
        { Private declarations } 
      public 

        { Public declarations } 
      end; 

var 
      Form1: TForm1; 
      wnd, wndd: HWND; 
implementation 

{$R *.dfm} 

{ TForm1 } 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
          if wnd = 0 then 
begin 
          wnd := FindWindow(0, PChar(Edit1.Text)); 
          if wnd <> 0 then 
          application.MessageBox('Окно успешно подключено','Выполнено'); 
     end 

else 
          application.MessageBox('Сначала нужно отключить окно','Ошибка'); 
end; 

procedure TForm1.Button3Click(Sender: TObject); 
begin 
        if wnd <> 0 then 
      begin 
          wnd := 0; 
          application.MessageBox('Окно отключено','Выполнено'); 
      end 
else 
          application.MessageBox('Сначала нужно подключить окно','Ошибка'); 
end; 

procedure TForm1.ComboBox1Click(Sender: TObject); 
var 
          Key : Word; 
          Modifiers: UINT; 

begin 

          if   ComboBox1.ItemIndex=0 then 
          ShortCutToHotKey(HotKey1.HotKey, Key, Modifiers); 
          Hotkey_id1 := GlobalAddAtom('MyHotKey_1'); 
          RegisterHotKey(Handle, Hotkey_id1, Modifiers, Key); 

          ListBox1.Items.Add(ShortCutToText (HotKey1.HotKey) + ' =' + ComboBox1.Text ); 
          if   ComboBox1.ItemIndex=1 then 
          ShortCutToHotKey(HotKey1.HotKey, Key, Modifiers); 
          Hotkey_id2 := GlobalAddAtom('MyHotKey_2'); 
          RegisterHotKey(Handle, Hotkey_id2, Modifiers, Key); 

          if   ComboBox1.ItemIndex=2 then 
          ShortCutToHotKey(HotKey1.HotKey, Key, Modifiers); 
          Hotkey_id3 := GlobalAddAtom('MyHotKey_3'); 
          RegisterHotKey(Handle, Hotkey_id3, Modifiers, Key); 
... 

end; 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
          UnRegisterHotKey(Handle, Hotkey_id1); 
          GlobalDeleteAtom(Hotkey_id1); 
...
end; 

procedure TForm1.ShortCutToHotKey(HotKey: TShortCut; var Key: Word; 
      var Modifiers: Uint); 
var 
          Shift: TShiftState; 
begin 
          ShortCutToKey(HotKey, Key, Shift); 
          Modifiers := 0; 
          if (ssShift in Shift) then 
          Modifiers := Modifiers or MOD_SHIFT; 
          if (ssAlt in Shift) then 
          Modifiers := Modifiers or MOD_ALT; 
          if (ssCtrl in Shift) then 
          Modifiers := Modifiers or MOD_CONTROL; 

end; 

procedure TForm1.WMHotKey(var Msg: TWMHotKey); 
begin 

      if Msg.HotKey = Hotkey_id1 then 
        PostMessage(wnd, WM_KEYDOWN, VK_f1, 0); 
          if Msg.HotKey = Hotkey_id2 then 
        PostMessage(wnd, WM_KEYDOWN, VK_f2, 0); 
          if Msg.HotKey = Hotkey_id3 then 
        ...
end; 

end.
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 04.12.2009, 18:47   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s:Pchar;
h:hwnd;
begin
h:=handle;
windows.GetWindowText(h,s,windows.GetWindowTextLength(h));
//s-Искомый текст
end;
Проверка будет что-то типа:
Код:
if pos(ansiuppercase('Мой Компьютер'),ansiuppercase(s))<>0 then
//Нужное действие
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 04.12.2009, 18:49   #3
Gerzs
Форумчанин
 
Аватар для Gerzs
 
Регистрация: 23.07.2009
Сообщений: 185
По умолчанию

Цитата:
Сообщение от Marsel737 Посмотреть сообщение
Хотел узнать, можно ли как то обращаться к окну, учитываю его заголовок, т.е. например, если заголовок окна "Мой компьютер", то тогда обращаемся к этому окну, а если какой то другой, то нет.
Найди его хэндел и обращайся
Код:
Handle:= FindWindow(nil, ' Мой компьютер')
Gerzs вне форума Ответить с цитированием
Старый 04.12.2009, 19:12   #4
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

russian-stalker, сделал так как вы предложили, но не работает почемуто. "s - искомый текст", я так понял в s будет записываться заголовок окна?

Gerzs, можно поподробней?
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 04.12.2009, 19:26   #5
Gerzs
Форумчанин
 
Аватар для Gerzs
 
Регистрация: 23.07.2009
Сообщений: 185
По умолчанию

Цитата:
Сообщение от Marsel737 Посмотреть сообщение
Gerzs, можно поподробней?
Что вы хотите с окном сделать?
Gerzs вне форума Ответить с цитированием
Старый 04.12.2009, 19:29   #6
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Gerzs, в игре есть горячая клавиша, например от 0 до 9, я сделал так что эти клавиши могут нажиматься автоматически с определенным интревалом, который можно задавать, но эти клавиши нажимаются глобально, а мне нужно чтобы только в игре нажимались
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 04.12.2009, 19:58   #7
Gerzs
Форумчанин
 
Аватар для Gerzs
 
Регистрация: 23.07.2009
Сообщений: 185
По умолчанию

Код:
var
   wnd: HWND;
 begin
   wnd := FindWindow(nil, ' Мой компьютер')
    SendMessage(wnd, WM_CHAR, Word('1'), 0);
либо keybd_event
Gerzs вне форума Ответить с цитированием
Старый 04.12.2009, 20:11   #8
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Сделал так, не работает.

Код:
procedure TfrmMain.Timer4Timer(Sender: TObject);
var
  wnd: HWND;
begin
  try
    if ComboBox3.Text<>'' then
    begin
      Number2:=StrToInt(ComboBox3.Text)+96;
      wnd := FindWindow(nil, ' Мой компьютер');
      keybd_event(number2,0,0,0);
      keybd_event(number2,0,KEYEVENTF_KEYUP,0);
    end;
  except
    Exit;
  end;
end;

И так тоже не работает:
Код:
var
   wnd: HWND;
 begin
   wnd := FindWindow(nil, ' Мой компьютер');
    SendMessage(wnd, WM_CHAR, Word('1'), 0);
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли

Последний раз редактировалось Marsel737; 04.12.2009 в 21:02.
Marsel737 вне форума Ответить с цитированием
Старый 08.12.2009, 18:31   #9
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Не пойму почему не работает:

Код:
procedure TfrmMain.Timer1Timer(Sender: TObject);
var
  s:Pchar;
  h:hwnd;
begin
  h:=handle;
  windows.GetWindowText(h,s,windows.GetWindowTextLength(h));
  if pos(ansiuppercase('Мой компьютер'),ansiuppercase(s))<>0 then
    begin
      keybd_event(97,0,0,0);
      keybd_event(97,0,KEYEVENTF_KEYUP,0);
    end;
end;
Что не так?
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 08.12.2009, 18:36   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Жесть...
Код:
procedure TfrmMain.Timer1Timer(Sender: TObject);
var
  s:Pchar;
  h:hwnd;
begin
  h:=handle;
  s := getmem((windows.GetWindowTextLength(h) + 1) * sizeof(char) {или wchar}); // !!!!!!!!!!!!!!!
  windows.GetWindowText(h,s,windows.GetWindowTextLength(h));
  if pos(ansiuppercase('Мой компьютер'),ansiuppercase(s))<>0 then
    begin
      keybd_event(97,0,0,0);
      keybd_event(97,0,KEYEVENTF_KEYUP,0);
    end;
  freemem(s); // !!!!!!!!!!!!!!!
end;
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с чужим окном W0LF Общие вопросы Delphi 14 13.05.2014 11:18
Простейшая работа с чужим приложением... ActiveX Помощь студентам 1 31.01.2008 08:17
Работа с чужим приложением ERASERROR Win Api 2 28.01.2008 15:22
работа с чужим окном RammFan Win Api 1 18.01.2007 20:21
поморгать окном Баламут Общие вопросы Delphi 1 10.11.2006 04:09