it-swarm.dev

C++ 'ta gizli bir pencere nasıl oluşturulur

Gizli bir pencere nasıl oluşturulur?

Bu pencerenin amacı bazı mesajları almaktır.

31
anand

Pencereyi oluştururken, WS_VISIBLE bayrağını atlayın ve ShowWindow'u arama.

20
Nathan Osman

Win32/mfc ortamında yapmanız gereken bir sınıf oluşturmak ve CWnd'den şöyle miras almak:

class HiddenMsgWindow : public CWnd
{
...
}

bu sınıfın yapıcısında şöyle bir pencere açarsın:

HiddenMsgWindow::HiddenMsgWindow()
{
   CString wcn = ::AfxRegisterWndClass(NULL);
   BOOL created = this->CreateEx(0, wcn, _T("YourExcellentWindowClass"), 0, 0, 0, 0, 0, HWND_MESSAGE, 0);
}

Bu, sizi sallamak ve yuvarlamak için neredeyse hazır bir mesaj pompasına sahip gizli bir pencere alır.

hikayenin geri kalanı, pencere mesajları ile bu mesajların işleyicileri arasındaki bağlantıyı sağlamaktır.

Bu, uygulama dosyanıza (.cpp) şöyle bir kaç makro ve bir ileti işleyicisi ekleyerek yapılır:

BEGIN_MESSAGE_MAP(HiddenMsgWindow, CWnd)
   ON_MESSAGE(WM_USER + 1, DoNOOP)
END_MESSAGE_MAP()

LRESULT HiddenMsgWindow::DoNOOP(WPARAM wParam, LPARAM lParam)
{
   AfxMessageBox(_T("Get Reaaady for a Ruuummmmmmmbllllle!"));
   return LRESULT(true);
}

Daha sonra başlık dosyasındaki tutkalın kalanını şu şekilde doldurmanız gerekir:

class HiddenMsgWindow : public CWnd
{
public:
   HiddenMsgWindow();
protected:
   afx_msg LRESULT DoNOOP(WPARAM wParam, LPARAM lParam);

   DECLARE_MESSAGE_MAP()

}

Ve tıpkı sihir gibi, mesajlarınızı pompalamaya hazır gizli bir pencereniz var.

Bu mesaj penceresini kullanabilmek için, alıcının sınıfa ulaşmasını ve istediğiniz şekilde mesaj göndermesini veya göndermesini sağlarsınız. Aynen böyle:

HiddenMsgWindow *hmw = new HiddenMsgWindow();
SendMessage(hmw->m_hWnd, WM_USER + 1, 0, 0);
14
Slaftos
9
ta.speot.is

CreateWindow() veya CreateWindowEx() işlevini her zamanki gibi çağırırsınız, ancak WS_VISIBLE pencere stilini belirtmeyin. Elbette ShowWindow() da çağrılmamalıdır.

3
Georg Fritzsche

Pencereyi göstermeniz gerekmiyorsa, bazılarının pencereyi oluşturmasını önerdiği gibi , WS_VISIBLE bayrağını atlayın ve ShowWindow'u arama.

showWindow () öğesini aradığınızda değilse, SW_HIDE parametresini ekleyin.

ShowWindow(hWnd, SW_HIDE);
1
Deadlock

Ahh, daha yeni bir sorunla karşılaştım. HWND_MESSAGE belirtilmezse, beklenmeyen davranışlar ortaya çıkabilir. Doğru olmayan NULL kullandım. Benim durumumda, MS Excel'in bir xls dosyasını yüklemek 10 saniye veya daha fazla sürmesine neden oldu, ancak normalde benim uygulamam çalışmıyorken bir saniyeden az sürdü!

MSDN bunu daha önce bahsedilen biri olarak söylüyor.

0
user1228651