473,836 Members | 1,560 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Call SendMessage API Question

Hello!

Thanx to this newgroup I have finally, with the help of you guys, gotten
this to work halfway.. but the final action is still not working, clicking
the "Button2" thru SendMessage().
Private Declare Auto Function FindWindow Lib "user32" Alias "FindWindow A"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Auto Function FindWindowEx Lib "user32" (ByVal hWnd1 As
Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As
Long

Private Declare Auto Function SendMessage Lib "user32" (ByVal hwnd As Long,
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Object) As Long

Private Const WM_KEYDOWN = &H100

Private Const WM_KEYUP = &H101

Private Const VK_SPACE = &H20

Private Sub Button1_Click(B yVal sender As System.Object, ByVal e As
System.EventArg s) Handles

hWnd = FindWindow(vbNu llString, "Form1")

MsgBox("Form1: " & hWnd)

hWndbutton = FindWindowEx(hW nd, 0&, "Button2", vbNullString)

MsgBox("Button2 : " & hWndbutton)

'want to send a Click to button number 2 here

MsgBox(SendMess age(hWndbutton, WM_KEYDOWN, VK_SPACE, 0&) & " " &
SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0&))

End Sub

I get a long number from both the SendMEssage Calls.. But the Button2 is not
clicked...

Best Regards/

Lars


Nov 21 '05 #1
18 6568
I probably need to get the button2 in focus first... maybe?

"Lars Netzel" <ui****@adf.s e> wrote in message
news:uM******** ******@TK2MSFTN GP12.phx.gbl...
Hello!

Thanx to this newgroup I have finally, with the help of you guys, gotten
this to work halfway.. but the final action is still not working, clicking
the "Button2" thru SendMessage().
Private Declare Auto Function FindWindow Lib "user32" Alias "FindWindow A"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Auto Function FindWindowEx Lib "user32" (ByVal hWnd1 As
Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String)
As Long

Private Declare Auto Function SendMessage Lib "user32" (ByVal hwnd As
Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Object) As
Long

Private Const WM_KEYDOWN = &H100

Private Const WM_KEYUP = &H101

Private Const VK_SPACE = &H20

Private Sub Button1_Click(B yVal sender As System.Object, ByVal e As
System.EventArg s) Handles

hWnd = FindWindow(vbNu llString, "Form1")

MsgBox("Form1: " & hWnd)

hWndbutton = FindWindowEx(hW nd, 0&, "Button2", vbNullString)

MsgBox("Button2 : " & hWndbutton)

'want to send a Click to button number 2 here

MsgBox(SendMess age(hWndbutton, WM_KEYDOWN, VK_SPACE, 0&) & " " &
SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0&))

End Sub

I get a long number from both the SendMEssage Calls.. But the Button2 is
not clicked...

Best Regards/

Lars

Nov 21 '05 #2
Hi,

The .net framework integer is the same as the old long. Change
your longs to integers. Wouldn't button2.perform click work for you?

http://msdn.microsoft.com/library/de...ClickTopic.asp

Ken
----------------------
"Lars Netzel" <ui****@adf.s e> wrote in message
news:uM******** ******@TK2MSFTN GP12.phx.gbl...
Hello!

Thanx to this newgroup I have finally, with the help of you guys, gotten
this to work halfway.. but the final action is still not working, clicking
the "Button2" thru SendMessage().
Private Declare Auto Function FindWindow Lib "user32" Alias "FindWindow A"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Auto Function FindWindowEx Lib "user32" (ByVal hWnd1 As
Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String)
As Long

Private Declare Auto Function SendMessage Lib "user32" (ByVal hwnd As
Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Object) As
Long

Private Const WM_KEYDOWN = &H100

Private Const WM_KEYUP = &H101

Private Const VK_SPACE = &H20

Private Sub Button1_Click(B yVal sender As System.Object, ByVal e As
System.EventArg s) Handles

hWnd = FindWindow(vbNu llString, "Form1")

MsgBox("Form1: " & hWnd)

hWndbutton = FindWindowEx(hW nd, 0&, "Button2", vbNullString)

MsgBox("Button2 : " & hWndbutton)

'want to send a Click to button number 2 here

MsgBox(SendMess age(hWndbutton, WM_KEYDOWN, VK_SPACE, 0&) & " " &
SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0&))

End Sub

I get a long number from both the SendMEssage Calls.. But the Button2 is
not clicked...

Best Regards/

Lars

Nov 21 '05 #3
"Lars Netzel" <ui****@adf.s e> schrieb:
Thanx to this newgroup I have finally, with the help of you guys, gotten
this to work halfway.. but the final action is still not working, clicking
the "Button2" thru SendMessage().
Private Declare Auto Function FindWindow Lib "user32" Alias "FindWindow A"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Auto Function FindWindowEx Lib "user32" (ByVal hWnd1 As
Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String)
As Long

Private Declare Auto Function SendMessage Lib "user32" (ByVal hwnd As
Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Object) As
Long
The declaration above is wrong. Use this one instead:

\\\
Private Declare Auto Function SendMessage Lib "user32.dll " ( _
ByVal hwnd As IntPtr, _
ByVal wMsg As Int32, _
ByVal wParam As Int32, _
ByVal lParam As Int32 _
) As Int32
///

Note that 'Long' maps to 'Int64', so declares for VB.NET and VB6 cannot be
interchanged.
Private Const WM_KEYDOWN = &H100

Private Const WM_KEYUP = &H101

Private Const VK_SPACE = &H20
=> 'Private Const ... As Int32 = ...'.
MsgBox(SendMess age(hWndbutton, WM_KEYDOWN, VK_SPACE, 0&) & " " &
SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0&))


'0&' => '0'.

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>

Nov 21 '05 #4
Yes it it would be, in the same application but I'm trying to press a button
in another applications window...

/Lars


"Ken Tucker [MVP]" <vb***@bellsout h.net> wrote in message
news:%2******** ********@TK2MSF TNGP15.phx.gbl. ..
Hi,

The .net framework integer is the same as the old long. Change
your longs to integers. Wouldn't button2.perform click work for you?

http://msdn.microsoft.com/library/de...ClickTopic.asp

Ken
----------------------
"Lars Netzel" <ui****@adf.s e> wrote in message
news:uM******** ******@TK2MSFTN GP12.phx.gbl...
Hello!

Thanx to this newgroup I have finally, with the help of you guys, gotten
this to work halfway.. but the final action is still not working,
clicking the "Button2" thru SendMessage().
Private Declare Auto Function FindWindow Lib "user32" Alias "FindWindow A"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Auto Function FindWindowEx Lib "user32" (ByVal hWnd1 As
Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String)
As Long

Private Declare Auto Function SendMessage Lib "user32" (ByVal hwnd As
Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Object)
As Long

Private Const WM_KEYDOWN = &H100

Private Const WM_KEYUP = &H101

Private Const VK_SPACE = &H20

Private Sub Button1_Click(B yVal sender As System.Object, ByVal e As
System.EventArg s) Handles

hWnd = FindWindow(vbNu llString, "Form1")

MsgBox("Form1: " & hWnd)

hWndbutton = FindWindowEx(hW nd, 0&, "Button2", vbNullString)

MsgBox("Button2 : " & hWndbutton)

'want to send a Click to button number 2 here

MsgBox(SendMess age(hWndbutton, WM_KEYDOWN, VK_SPACE, 0&) & " " &
SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0&))

End Sub

I get a long number from both the SendMEssage Calls.. But the Button2 is
not clicked...

Best Regards/

Lars


Nov 21 '05 #5
Hi, thank you for your reply unfortunately I get an error and can't compile
now..

Since I'm using this declaration now where the first parameter is an IntPtr
instead of a long... I can't call the SendMessage() the same way anymore. I
mean, the hWndbutton variable is a Long... that's what I get back from
FindWindowEx(). How to I get this to be an IntPtr instead?

'My New declaration (as you wrote it)
Private Declare Auto Function SendMessage Lib "user32.dll " (ByVal hwnd As
IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32)
As Int32

'My old call but with 0 instead of 0& in the last parameter.
MsgBox(SendMess age(hWndbutton, WM_KEYDOWN, VK_SPACE, 0) & " " &
SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0))
Value of type 'Long' cannot be converted to 'System.IntPtr' . (hWndbutton is
a Long)

Please help/Lars




Nov 21 '05 #6
"Lars Netzel" <ui****@adf.s e> schrieb:
Since I'm using this declaration now where the first parameter is an
IntPtr instead of a long... I can't call the SendMessage() the same way
anymore. I mean, the hWndbutton variable is a Long... that's what I get
back from FindWindowEx(). How to I get this to be an IntPtr instead?

'My New declaration (as you wrote it)
Private Declare Auto Function SendMessage Lib "user32.dll " (ByVal hwnd As
IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32)
As Int32

'My old call but with 0 instead of 0& in the last parameter.
MsgBox(SendMess age(hWndbutton, WM_KEYDOWN, VK_SPACE, 0) & " " &
SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0))
Value of type 'Long' cannot be converted to 'System.IntPtr' . (hWndbutton
is a Long)


Declare 'hWndButton' As 'IntPtr'. 'Long' is a 64-bit type and thus not
suitable.

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>

Nov 21 '05 #7
"Lars Netzel" <ui****@adf.s e> wrote in message news:Oa******** ********@TK2MSF TNGP14.phx.gbl. ..
Hi, thank you for your reply unfortunately I get an error and can't compile
now..

Since I'm using this declaration now where the first parameter is an IntPtr
instead of a long... I can't call the SendMessage() the same way anymore. I
mean, the hWndbutton variable is a Long... that's what I get back from
FindWindowEx(). How to I get this to be an IntPtr instead?

'My New declaration (as you wrote it)
Private Declare Auto Function SendMessage Lib "user32.dll " (ByVal hwnd As
IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32)
As Int32

'My old call but with 0 instead of 0& in the last parameter.
MsgBox(SendMess age(hWndbutton, WM_KEYDOWN, VK_SPACE, 0) & " " &
SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0))
Value of type 'Long' cannot be converted to 'System.IntPtr' . (hWndbutton is
a Long)

Please help/Lars


That would indicate that you are using the incorrect data type for the return value from the FindWindowEX call. Since it returns a
HWND which is a DWORD or 32-bit integer, Long is the incorrect .Net data type for the API Declare.

You show your declare as:

Private Declare Auto Function FindWindowEx Lib "user32" (ByVal hWnd1 As
Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As
Long

And as it has already been pointed out, Long is the incorrect data type for the hwnd parameters and return value. You need to use
32-bit integer data types for the declares, rather than Longs and you need to be consistent.

Private Declare Auto Function FindWindowEx Lib "user32" (ByVal hWnd1 As
Int32, ByVal hWnd2 As Int32, ByVal lpsz1 As String, ByVal lpsz2 As String) As
Int32
I hope this helps.

--
Al Reid

Nov 21 '05 #8
Hi

Yeah... I tested that but then of course the FindWindowEx is declared as a
long so.. I get a "Specified Cast Not valid" when trying to assign the
hWndbutton from FindWidowEx()

/Lars
"Herfried K. Wagner [MVP]" <hi************ ***@gmx.at> wrote in message
news:ew******** ******@tk2msftn gp13.phx.gbl...
"Lars Netzel" <ui****@adf.s e> schrieb:
Since I'm using this declaration now where the first parameter is an
IntPtr instead of a long... I can't call the SendMessage() the same way
anymore. I mean, the hWndbutton variable is a Long... that's what I get
back from FindWindowEx(). How to I get this to be an IntPtr instead?

'My New declaration (as you wrote it)
Private Declare Auto Function SendMessage Lib "user32.dll " (ByVal hwnd As
IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As
Int32) As Int32

'My old call but with 0 instead of 0& in the last parameter.
MsgBox(SendMess age(hWndbutton, WM_KEYDOWN, VK_SPACE, 0) & " " &
SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0))
Value of type 'Long' cannot be converted to 'System.IntPtr' . (hWndbutton
is a Long)


Declare 'hWndButton' As 'IntPtr'. 'Long' is a 64-bit type and thus not
suitable.

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>

Nov 21 '05 #9
Well I must admit this is a little bit above my normal "areas" in
programming.. but it can't be that hard to get to work...

I have this...
-----------------------------------------------------------
Private Declare Auto Function FindWindow Lib "user32" Alias "FindWindow A"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Auto Function FindWindowEx Lib "user32" (ByVal hWnd1 As
Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As
Int32

Private Declare Auto Function SendMessage Lib "user32.dll " (ByVal hWnd As
IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32)
As Int32

Private Const WM_KEYDOWN As Int32 = &H100

Private Const WM_KEYUP As Int32 = &H101

Private Const VK_SPACE As Int32 = &H20

Dim hWndbutton As IntPtr

Dim hWnd As Long

hWnd = FindWindow(vbNu llString, "FSM Klient")

hWndbutton = FindWindowEx(hW nd, 0&, "Button2", vbNullString)

SendMessage(hWn dbutton, WM_KEYDOWN, VK_SPACE, 0)

SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0)

------------------------------------------------------------
It underlines the "FindWindowEx(h Wnd, 0&, "Button2", vbNullString)" row now
and says "Integer cannot be converted to IntPtr"

/Lars

"Al Reid" <ar*****@reidDA SHhome.com> wrote in message
news:Oj******** ******@TK2MSFTN GP14.phx.gbl...
"Lars Netzel" <ui****@adf.s e> wrote in message
news:Oa******** ********@TK2MSF TNGP14.phx.gbl. ..
Hi, thank you for your reply unfortunately I get an error and can't
compile
now..

Since I'm using this declaration now where the first parameter is an
IntPtr
instead of a long... I can't call the SendMessage() the same way anymore.
I
mean, the hWndbutton variable is a Long... that's what I get back from
FindWindowEx(). How to I get this to be an IntPtr instead?

'My New declaration (as you wrote it)
Private Declare Auto Function SendMessage Lib "user32.dll " (ByVal hwnd As
IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As
Int32)
As Int32

'My old call but with 0 instead of 0& in the last parameter.
MsgBox(SendMess age(hWndbutton, WM_KEYDOWN, VK_SPACE, 0) & " " &
SendMessage(hWn dbutton, WM_KEYUP, VK_SPACE, 0))
Value of type 'Long' cannot be converted to 'System.IntPtr' . (hWndbutton
is
a Long)

Please help/Lars


That would indicate that you are using the incorrect data type for the
return value from the FindWindowEX call. Since it returns a
HWND which is a DWORD or 32-bit integer, Long is the incorrect .Net data
type for the API Declare.

You show your declare as:

Private Declare Auto Function FindWindowEx Lib "user32" (ByVal hWnd1 As
Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String)
As
Long

And as it has already been pointed out, Long is the incorrect data type
for the hwnd parameters and return value. You need to use
32-bit integer data types for the declares, rather than Longs and you need
to be consistent.

Private Declare Auto Function FindWindowEx Lib "user32" (ByVal hWnd1 As
Int32, ByVal hWnd2 As Int32, ByVal lpsz1 As String, ByVal lpsz2 As String)
As
Int32
I hope this helps.

--
Al Reid

Nov 21 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
15654
by: Nidhi | last post by:
Hi, I am trying to write code to retrieve the small icon for an application in C#. I am using SendMessage with WM_GETICON for this purpose but the return value I get is 0. I don't understand this. Is that expected? What am I doing wrong? Any help would be appreciated. Here is the snippet of code that I am using - public static extern int SendMessage(int
2
2429
by: Sonia Igla | last post by:
Hi. I need to perform DBLCLK on TreeView Node. I try the following: private static extern int SendMessage(IntPtr hWnd, uint msg, UInt32 wParam, UInt32 lParam); private const UInt32 WM_LBUTTONDBLCLK = 0x203; pTreeNode.TreeView.SelectedNode = pTreeNode;
5
5861
by: Adam Clauss | last post by:
I am attempting to set the text on a richedit control in another application using EM_SETTEXTEX: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/richeditcontrolreference/richeditmessages/em_settextex.asp I have the following: public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
3
10168
by: JSK | last post by:
Hi, As any one worked in VB.NET and made use of Sendmessage API? The Issue I am running into is how to pass pointers of Data Structures (UDT) to the SendMessage. I starting looking at "IntPrt" as a data type but it appears to fall short of using pointer types. Any help or insight would be greatly appreciated. Thank You
2
1483
by: Abubakar | last post by:
Hi, in my application, different threads send notifications to GUI thread through sendmessage api. They have special integer numbers inside the wParam arg of sendmessage which the gui thread uses to display messages in the textboxes etc. My question is that in case the threads send messages very fast (which does NOT always happen in my app), faster than the gui thread is processing them, are the messages qued automatically (btw the gui...
11
48084
by: NVergunst | last post by:
Hello everyone. I have what I believe to be a simple question, yet I can not find anything that is helpful to me. Basically I have an application, that I want to use to control external applications. My program will run either embedded within another program or minimized to the system tray. So SendKeys is out because it only works if the controlled application has focus, which it will not. So my conclusion is the windows API. I have...
1
13423
by: Necromis | last post by:
Ok, I have gotten my head around things better regarding SendMessage and FindWindow functions. However, I am running into an issue with my code still. The program I am working with is EXTRA! by Attachmate. It is a mainframe terminal. Here is the issue and strange part of it. It is accepting sendmessage when I use the WM_KEYDOWN/UP commands. However, when I use WM_SETTEXT to send my string it is not imputing the string to the session...
9
4716
by: Neil | last post by:
Anyone have any idea why SendMessage ctl.hwnd, WM_PASTE, 0, 0 isn't working from a regular Access text box (form is opened normally, not in dialog more)? I realize I can just use docmd.RunCommand acCmdPaste. But I have a reason for needing to do it this way. When I run the code I get the message, "Object doesn't support this property or method" (error 438). Any ideas why this is happening? Thanks!
8
1720
by: Dr1ZZ | last post by:
Hi, I'm currently working on a bot for a game. It works like this: 1: Take a picture of the current playing field 2: Do the calculations on what i gotta do (best move) 3: Use sendmessage to send a mouseclick to the game at the correct position
0
9814
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9666
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10838
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10544
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
10585
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
10250
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
1
7788
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
2
4010
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
3111
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.